Über weitere Tipps bin ich sehr dankbar.
Bekommst du eine spezielle Fehlermeldung im Log, wenn du die Verbindung herstellst?
Von wo nach wo wird die Verbindung herstellt (PC -> Host, Host -> PC, Host -> Host) ?
Über weitere Tipps bin ich sehr dankbar.
Bekommst du eine spezielle Fehlermeldung im Log, wenn du die Verbindung herstellst?
Von wo nach wo wird die Verbindung herstellt (PC -> Host, Host -> PC, Host -> Host) ?
Versuche es so:
mysql_format(SQL_CONNECT,query,sizeof(query),"SELECT * FROM `"SERVER_TAGS"_ip_log` WHERE `Name` != '%e' AND `IP` = '%e'",Spieler[playerid][pName],Spieler[playerid][pUserIP]);
mysql_pquery(SQL_CONNECT,query,"MySQL_IP_Monitoring","i",playerid);
Ein anderer Name mit gleicher IP führt zur Sperrung.
mysql_tquery(handle, query);
zu:
mysql_tquery(handle, query, "OnAutohausCreated", "i", a);
Und dann:
forward OnAutohausCreated(a);
public OnAutohausCreated(a)
{
ahInfo[a][db_id] = cache_insert_id();
return 1;
}
wir würden anstatt die Nummer, Anzahl der Reports haben
Ersetze alle
PlayerInfo[i][pPnumber]
mit
PlayerInfo[i][pReports]
Meines Wissens nach blockiert das MySQL Plugin die Verbindung nicht, wäre auch irgendwie sinnlos.
Letztlich wird es entweder deine Firewall oder die Konfiguration deines Hosters sein, was die Verbindung blockiert, letzteres ist wahrscheinlicher.
Hier eine Information dazu, wie es damals bei gta-servers.de war: MYSQL extern ??
Sofern alles frei ist, dann klappt das auch, habe ich selbst schon ausprobiert.
Allerdings ist es, wie Android beschrieben hat, nicht zu empfehlen.
Ähnliches habe ich auch in meinem Tutorial dazu beschrieben: [jTuT] MySQL R41 (Installation, XAMPP, Verwendung, Bedienung & Registrations-System)
Externer Zugriff auf MySQL Datenbanken
Ein externer Zugriff auf einer MySQL Datenbank (SA-MP Server auf Maschine A, MySQL Datenbank auf Maschine B) ist möglich, allerdings ist ein solches Vorgehen nicht zu empfehlen. Warum? Ganz einfach: Die Daten können während der Übertragung abgefangen werden. Natürlich sind das meist keine sensiblen Daten, aber dennoch sollte man sich darüber im Klaren sein. Außerdem, und das ist der ausschlaggebendere Punkt, dauert die Übertragung natürlich seine Zeit. Muss der MySQL Server aus den USA die Daten ins Rechenzentrum nach Frankfurt schicken, dann dauert das einen kurzen Moment (Millisekunden / Sekunden). Kommt es nun mal vor, dass der MySQL Server nicht erreichbar ist, dann hat man ein echtes Problem, denn das bedeutet, dass keine Daten mehr gelesen beziehungsweise geschrieben werden können, was oft zu Fehlern oder gar zum Server-Absturz führt.
Daher ist es immer empfohlen, die Datenbank auf dem gleichen Server zu betreiben, auf dem auch der SA-MP Server liegt. Dies ist bei den großen Hostern ohnehin automatisch so geregelt.
Grundsätzlich solltest du mal bei deinem Hoster nachfragen, die können dir wahrscheinlich direkt sagen, ob diese Verbindungen erlaubt sind, oder nicht.
Poste bitte deine SetPlayerCheckpointEx Funktion und deine ShowInfo Funktion.
aber wie soll ich denn bei OnPlayerDeath bei der Gangfight-Situation die Wanteds nicht vergeben
Poste am besten mal deinen Code und erkläre anhand dessen, was du vor hast.
Dann musst du es so schreiben:
OCMD:contracts(playerid)
{
new string[145], count = 0;
if(Spieler[playerid][pFraktion] != 5)return SendClientMessage(playerid, COLOR_GREY, "Du bist in keiner Fraktion.");
for(new i=0;i<GetMaxPlayers();i++)
{
if(IsLoggedIn(i))
{
if(Spieler[i][pContract] > 0 && Spieler[i][pContract] <= 5000)
{
format(string, sizeof(string), "%s (ID: %d) | $%d", GetName(i), i, Spieler[i][pContract]);
SendClientMessage(playerid, COLOR_LIGHTBLUE, string);
count++;
}
else if(Spieler[i][pContract] > 5000)
{
format(string, sizeof(string), "%s (ID: %d) | $%d", GetName(i), i, Spieler[i][pContract]);
SendClientMessage(playerid, COLOR_LIGHTBLUE, string);
count++;
}
}
}
if(count == 0)return SendClientMessage(playerid, COLOR_GREY, "Keine Auftragsmorde vorhanden.");
return 1;
}
Wie hast du denn COLOR_LIGHTBLUE definiert?
Das kannst du so machen:
OCMD:contracts(playerid)
{
new string[145], count = 0;
if(Spieler[playerid][pFraktion] != 5)return SendClientMessage(playerid, COLOR_GREY, "Du bist in keiner Fraktion.");
for(new i=0;i<GetMaxPlayers();i++)
{
if(IsLoggedIn(i))
{
if(Spieler[i][pContract] > 0 && Spieler[i][pContract] <= 5000)
{
format(string, sizeof(string), COLOR_HEX_WHITE"%s (ID: %d) | "COLOR_HEX_LIGHTYELLOW"$%d", GetName(i), i, Spieler[i][pContract]);
SendClientMessage(playerid, 0xFFFFFFFF, string);
count++;
}
else if(Spieler[i][pContract] > 5000)
{
format(string, sizeof(string), COLOR_HEX_WHITE"%s (ID: %d) | "COLOR_HEX_DARKORANGE"$%d", GetName(i), i, Spieler[i][pContract]);
SendClientMessage(playerid, 0xFFFFFFFF, string);
count++;
}
}
}
if(count == 0)return SendClientMessage(playerid, COLOR_GREY, "Keine Auftragsmorde vorhanden.");
return 1;
}
Sorry, das war ein Denkfehler von mir.
new Float:health;
GetVehicleHealth(cID, health);
health = ((health - 250.0) / 750.0) * 100.0;
So passt es.
Oh ja, stimmt, das war mein Fehler, sorry. Durchs Kopieren meines vorherigen Codes habe ich den natürlich immer wieder mitgezogen.
Das war die Gewohnheit, da ich die Schleifen zu 99% immer mit "i" schreibe. "id" liegt da einfach zu Nahe, da ist die Verführung groß, in die Gewohnheit zu verfallen. ![]()
Gut, dass du nachgefragt hast.
"id++" ist natürlich richtig.
Müsste es bei der Berechnung so eigentlich sein.
Beispiel:
(1000 - 250) / 750 = 1 * 100 = 100%.
Das liegt daran, dass 249 Health in SA-MP heißt, es brennt.
Ändere es zu:
new Float:health = ((health - 250.0) / 750.0) * 100.0;
if(health < 0) health = 0.0;
format(stringzs, sizeof(stringzs), "Zustand: %.0f %%", health);
Ok, dann ändere auf jeden Fall das return und schreibe den Befehl so:
ocmd:carinfo(playerid,params[])
{
if(isACop(playerid))return SendClientMessage(playerid,COLOR_RED,"Nein");
new string[145],vid,Float:x,Float:y,Float:z,pID;
if(sscanf(params,"d",vid)) return SendClientMessage(playerid,-1,"/carinfo [CARID]");
if(vid == INVALID_VEHICLE_ID) return SendClientMessage(playerid,-1,"Ungültige Fahrzeug ID");
GetVehiclePos(vid,x,y,z);
if(!IsPlayerInRangeOfPoint(playerid,8,x,y,z)) return SendClientMessage(playerid,-1,"Du bist nicht in der Nähe des Fahrzeugs das du abrufen möchtest!");
pID = GetVehicleBesitzer(vid);
for(new id = 0; id < sizeof(cInfo); i++)
{
if(cInfo[id][id_x]==vid)
{
if(cInfo[id][fraktion]==1)
{
format(string,sizeof(string),"Fahrzeug Besitzer: LSPD & Letzter Fahrer: %s. [Fahrzeug ID %i]",LastDriver[vid],vid);
SendClientMessage(playerid,COLOR_BUSBLUE,string);
}
else if(IsPlayerConnected(pID) && cInfo[id][besitzer] == PlayerInfo[pID][p_id])
{
GetPlayerName(pID, string, MAX_PLAYER_NAME);
format(string,sizeof(string),"Fahrzeug Besitzer: %s & Letzter Fahrer: %s. [Fahrzeug ID %i]",string,LastDriver[vid],vid);
SendClientMessage(playerid,COLOR_BUSBLUE,string);
}
else
{
SendClientMessage(playerid,-1,"Dieses Fahrzeug gehört nicht der Fraktion 1 oder einem Spieler.");
}
return 1;
}
}
return 1;
}
Ändere dort mal das
return 1;
zu:
return INVALID_PLAYER_ID;
Da dies ja immer nur die ID eines Spielers ausgibt, der online ist, liese sich hier der Name nur für Spieler anzeigen, die online sind.
Falls der Besitzer nicht online ist, wird nichts angezeigt.
Ist das so gewollt?
Ok, das geht also über die Datenbank ID.
Wie sieht die GetVehicleBesitzer Funktion aus?
Wie erstellst du denn die Fahrzeuge und wie wiest du ihnen einen Besitzer zu?
Ahh, dann so:
forward UpdateSpeed(playerid);
public UpdateSpeed(playerid)
{
new stringspeed[32];
format(stringspeed, sizeof(stringspeed), "Speed: %d KM/H", GetPlayerSpeed(playerid, true));
TextDrawSetString(Tacho9, stringspeed);
return 1;
}
Dann liegt es wohl an GetPlayerSpeed.
Versuche es so:
new Float:speed;
GetPlayerSpeed(playerid, speed);
format(stringspeed, sizeof(stringspeed), "Speed: %0.2f KM/H", speed);