Die Zeit in der Datenbank sieht doch richtig aus, oder was ist daran falsch? Es ist der Unix Timestamp, plus die gebannte Zeit.
Poste bitte dein OnQueryFinish nochmal, sowie dein OnPlayerConnect, wie beides jetzt aussieht.
Die Zeit in der Datenbank sieht doch richtig aus, oder was ist daran falsch? Es ist der Unix Timestamp, plus die gebannte Zeit.
Poste bitte dein OnQueryFinish nochmal, sowie dein OnPlayerConnect, wie beides jetzt aussieht.
Dann bist du wahrscheinlich nicht an der Position.
Füge es mal so ein, und poste dann was im Log steht:
forward CheckPos();
public CheckPos()
{
printf("CheckPos aufgerufen");
for(new i=0; i<MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i)) printf("connected: %d / range: %d", IsPlayerInRangeOfPoint(i, 5.0,1911.7549,-2502.7502,13.5391));
if(IsPlayerInRangeOfPoint(i, 5.0,1911.7549,-2502.7502,13.5391))
{
printf("SetPos!");
SetPlayerPos(i,1856.6919,-2447.9382,51.0390);
}
}
return 1;
}
Corvus:
stock EnterToLog(const log[], const logtext[])
{
new filestring[512];
format(filestring, sizeof filestring, "logs/%s.txt", log);
new File:file = fopen(filestring, io_append);
fwrite(file, logtext);
fclose(file);
return 1;
}
@[LnD]JustMe.77:
Timer bei OnGameModeInit gestartet?
Ja genau so.
Direkt unter den Includes:
new AdminVeh1;
new AdminVeh2;
Das ist dann eine globale Deklaration, somit kannst du es überall im Code verwenden.
Ok, das ist doch gut, dann funktioniert der Code doch, es stimmt nur die Reihenfolge nicht, das bezieht sich aber genau auf den Teil den ich schon angesprochen habe.
Der Login Dialog muss im else-Teil von "if(rows)" angezeigt werden (siehe meinen Code).
Probiere das mal. Nimm den Login Dialog aus OnPlayerConnect raus und setze es an die von mir markierte Stelle.
Mach das mal wieder weg, dann wie ich gesagt habe:
OnGameModeInit:
SetTimer("CheckPos", 200, true);
Unten im Code (gaaaanz unten, in die allerletze Zeile der Datei):
forward CheckPos();
public CheckPos()
{
for(new i=0; i<MAX_PLAYERS; i++)
{
if(IsPlayerInRangeOfPoint(i, 5.0,1911.7549,-2502.7502,13.5391))
{
SetPlayerPos(i,1856.6919,-2447.9382,51.0390);
}
}
return 1;
}
Es reicht wenn du ihn, wie du vorhin gesagt hast, bei OnGameModeInit startest, einmalig.
Dafür habe ich dir den Code extra angepasst.
Das ist auch ressourcentechnisch gesehen die beste Variante.
Der Timer soll ja aber für die anderen Spieler auf dem Server noch laufen, oder hast du nur 1 Fahrzeug auf dem Server?
Dass es den Spieler nicht zuspammt, habe ich hiermit abgefangen:
if(vehiclehp <= 350 && engine == VEHICLE_PARAMS_ON)
Die Nachricht kommt nur, wenn der Motor an ist, du brauchst den Timer also nicht zu killen.
Unter die Includes:
new meinPuckup;
public OnGameModeInit()
{
meinPickup = CreatePickup(1273, 1, 1911.2902,-2505.4646,13.5391, -1);
Und das hier dann so:
public OnPlayerPickUpPickup(playerid, pickupid)
{
if(pickupid == meinPickup)
{
SetPlayerPos(playerid,1856.6919,-2447.9382,51.0390);
return 1;
}
return 1;
}
Das Anzeigen des Login Dialogs musst du in OnQueryFinish packen, da es ja nach der Prüfung auf einen Ban geschehen soll.
Ich hab es dir hier markiert, wo es rein muss:
Wenn es dann noch immer nicht klappt, poste mal den MySQL Log.
Puuh, möglicherweise fehlt dir dann auf deinem Windows System irgendwas (.Net oder MS Visual C++).
Weder am Code noch am Log ist was falsch (ist ja auch klar, sonst würde es auf Linux auch nicht gehen).
Hast du es mal auf einem anderen Recher probiert?
Ansonsten könntest du es mit der manuellen Split-Methode machen, siehe hier:
MYSQL Lädt falsche werte
Ist zwar umständlicher, aber vielleicht geht das ja.
Oder, was natürlich das beste wäre: Upgrade den Code auf MySQL R39-2.
Müsste so passen:
ocmd:dm(playerid,params[])
{
if(inDM[playerid] == 1)
{
SendClientMessage(playerid,COLOR_ORANGE,"** Du kannst diesen Befehl nicht benuzten, weil du bereits in einer Arena bist. **");
return 1;
}
if(busy[playerid] == 1)
{
SendClientMessage(playerid,COLOR_ORANGE,"** Du kannst diesen Befehl nicht benuzten, weil du im Gefängnis sitzt. **");
return 1;
}
SetPlayerPos(playerid,1939.1534,-1771.2437,19.5250);
SetPlayerFacingAngle(playerid, 88.5281);
busy[playerid] = 1;
inDM[playerid] = 1;
return 1;
}
ocmd:exit(playerid,params[])
{
if(inDM[playerid] == 0)
{
SendClientMessage(playerid,COLOR_ORANGE,"** Du kannst diesen Befehl nicht benuzten, weil du nicht in einer Arena bist. **");
return 1;
}
if(inJail[playerid] == 0)
{
SetPlayerPos(playerid,1763.2980,-1896.6514,13.5625);
SetPlayerFacingAngle(playerid, 276.7087);
busy[playerid] = 0;
inDM[playerid] = 0;
return 1;
}
if(busy[playerid] == 1)
{
SendClientMessage(playerid,COLOR_ORANGE,"** Du kannst diesen Befehl nicht benuzten, weil du im Gefängnis sitzt. **");
return 1;
}
return 1;
}
Möglicherweise wird der Code nicht (oder nicht richtig) aufgerufen. Hast du es mal debuggt?
Hast es ja schon hinbekommen.
Eddy: Das ist keine "kleine Scripting Frage". Erstelle dafür einen Thread.
@[LnD]JustMe.77: Bei mir geht es. Wie sieht dein Code aus?
Du darfst den Timer nicht killen, dann läuft der ja nicht mehr.
Das mit der Datenbank kann man ja noch hinzufügen, wenn du mir sagst, wie du die Datenbankfahrzeuge aus der Datenbank lädst.
Poste bitte nochmal beide Befehle wie sie jetzt sind.
Ja, klar, das geht so ja auch nicht, deshalb habe ich es weg gemacht.
Warum hast du den Code verändert?
Außerdem geben die Schleifen so keinen Sinn. Versuche es doch mal mit dem Code den ich dir gegeben habe, ohne was zu ändern.
http://forum.sa-mp.com/showthread.php?t=294042
http://forum.sa-mp.com/showthread.php?t=365694
http://forum.sa-mp.com/showthread.php?t=302369
http://forum.sa-mp.com/showthread.php?t=293843
http://forum.sa-mp.com/showthread.php?t=374040
http://forum.sa-mp.com/showthread.php?t=294815
http://forum.sa-mp.com/showthread.php?t=293801
Das sollte genügen.
Schreibe es mal so:
forward CheckHealth();
public CheckHealth()
{
new engine,lightss,alarm,doors,bonnet,boot,objective,vehicleid,Float:vehiclehp;
for(new i=0; i<MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i) && IsPlayerInAnyVehicle(i))
{
vehicleid = GetPlayerVehicleID(i);
GetVehicleParamsEx(vehicleid,engine,lightss,alarm,doors,bonnet,boot,objective);
GetVehicleHealth(vehicleid,vehiclehp);
if(vehiclehp <= 350 && engine == VEHICLE_PARAMS_ON)
{
SendClientMessage(playerid,0xFF6900AA,"Dieses Fahrzeug hat einen Motorschaden! Du kannst nicht mehr weiterfahren.");
SetVehicleHealth(vehicleid,350.0);
MotorDown[vehicleid] = 1;
VehicleStarted[vehicleid] = 0;
SetVehicleParamsEx(vehicleid,VEHICLE_PARAMS_OFF,lightss,alarm,doors,bonnet,boot,objective);
}
}
}
return 1;
}
Unter welchem Callback startest du denn den Timer?
SetTimer("CheckHealth",1039,true);//Fahrzeug checken