Wie sieht denn die Tabelle Houses in der Datenbank aus?
Beiträge von Jeffry
-
-
Das klappt dann so nicht, da du bei OnUserLogin ja die Daten aus der Tabelle "user" hast, und nicht die Daten aus "Houses".
In OnUserLogin musst du ein neues SELECT Query machen, welches aus der Tabelle "Houses" das Haus ausliest, welches der Spieler besitzt.Dann kannst du in OnHouseLoad z.B. den Cache für das Hause des Spielers auslesen, dort hast du dann auch die Versicherungsdaten und die Haus ID.
-
Das hier ist unter OnUserLogin,
Mit welchem Query rufst du das denn auf?
-
error 036: empty statement
In der Include:
#define ResetMetersTraveled(%0) E@_R[%0] = 0;
zu:
#define ResetMetersTraveled(%0) E@_R[%0] = 0 -
Einen Fehler hab ich noch.
Das ist kein Fehler, das sind nur Debug Meldungen, weil du alles zu MySQL-gehörige loggst.
-
CMD:mapeditor(playerid, params[])
{
#pragma unused params
static bool:s_mapedit;
if(!IsPlayerAdmin(playerid))return SendClientMessage(playerid, ROT, "Bitte benutze /rcon login um den Befehl benutzen zu können.");
if(!s_mapedit) SRC("loadfs mapedit");
else SRC("unloadfs mapedit");
s_mapedit = !s_mapedit;
return 1;
} -
Selbst wenn ein Aufruf einer non-public Funktion etwas schneller ist, als der Aufruf eines publics, ist der Unterschied so minimal, dass man das selbst bei tausenden Aufrufen pro Minute niemals merken wird. Ebenfalls am Speicherverbrauch.
Den Aufwand, da etwas zu verkomplizieren oder zu verbiegen, kannst du dir sparen, das macht keinen Sinn. Zudem wird es in den meisten Fällen auf Grund der Notwendigkeit gar nicht möglich sein.Nutze publics für Timer und Callbacks aus MySQL, und stock's (bzw. Funktionen generell, geht ja auch ohne stock) für simple Aufrufe.
-
Andere frage, wie bekome ich es hin anstat publics nur privates zu nutzen ohne forwards?
Warum? Für gewisse Funktionen kommst du nicht an einem public/forward vorbei.
-
Also, das heißt ich muss immer /rcon login machen?
Ja, außer du speicherst es schon im SA-MP Client, bei der Verbindung zum Server:
Über einen PAWN Code kannst du dich nicht automatisch einloggen lassen.
-
LoginTimer[playerid] = SetTimerEx("LoginKick", 20000, false, "d", playerid);
Bei erfolgreichem Login:
KillTimer(LoginTimer[playerid]);LoginKick als public mit forward, dort dann den Kick ausführen.
Hm okay, ich dachte so is schöner damit man net immer das PW braucht.
"login" ist nicht möglich, da du keine playerid mitgeben kannst. Siehe:
https://wiki.sa-mp.com/wiki/SendRconCommand -
Ich beschreibe es dir mal in Stichpunkten, schaue ob du damit einen Code zusammen bekommst:
- Schleife durch die Fahrzeuge des Spielers (wie beim Speichern)
- Existentes Fahrzeug in String aufnehmen, pro Zeile (\n) eines
- Dialog anzeigen
- Bei Dialog-Klick: Nochmal Schleife durch die Fahrzeuge und counter so lange hochzählen lassen, bis identisch zu listitem (das listitem kann unter Umständen falsch sein, wenn in der Mitte ein Fahrzeug nicht existiert).
- Den index aus der Schleife in P_Current setzen.
Versuche, ob du das so umsetzen kannst. Den Code, bis dahin wo du ihn hast, falls es nicht vollständig klappt, kannst du dann natürlich posten.
-
Beim Laden - nach CreateVehicle (wichtig):
cache_get_value_name_int(i,"P_fuel",vehData[PCar[playerid][i][P_VID]][e_fuel]);jetzt müssen wir nur noch ein neuen Public erstellen für SavePlayerCars
forward SavePlayerCars(playerid);
public SavePlayerCars(playerid)
{
new query[512];
for(new i = 0; i < sizeof(PCar[]); i++)
{
if(PCar[playerid][i][P_MID] == 0) continue;
mysql_format(handle, query, sizeof(query), "UPDATE playercars SET P_fuel = '%d' WHERE P_dbID = '%d'", vehData[PCar[playerid][i][P_VID]][e_fuel], PCar[playerid][i][P_dbID]);
mysql_pquery(handle, query);
}
return 1;
}
Weiter würde es dann so aussehen:
forward SavePlayerCars(playerid);
public SavePlayerCars(playerid)
{
new query[512];
for(new i = 0; i < sizeof(PCar[]); i++)
{
if(PCar[playerid][i][P_MID] == 0) continue;
mysql_format(handle, query, sizeof(query), "UPDATE playercars SET P_fuel = '%d', P_kilometer = '%d', P_oel = '%d' WHERE P_dbID = '%d'", vehData[PCar[playerid][i][P_VID]][e_fuel], variable_fuer_km, variable_fuer_oel, PCar[playerid][i][P_dbID]);
mysql_pquery(handle, query);
}
return 1;
}Ändere %d zu %f, falls die Fuel-Variable ein Float ist.
-
Hätte jetzt noch ein letztes anliegen und zwar sagt mein nativechecker dies obwohl ich alles was dafür benötigt wird habe.
Schreibe den nativechecker in der server.cfg an die letzte Stelle bei plugins.
-
Das kannst du mit format machen:
ocmd:pn(playerid,params[])
{
new pID,text[128],string[145],name[MAX_PLAYER_NAME];
if(sscanf(params,"is[128]",pID,text))return SendClientMessage(playerid,COLOR_RED, "INFO: /pn [playerid] [text]");
GetPlayerName(pID, name, MAX_PLAYER_NAME);
format(string, sizeof(string), "%s (%d): %s", name, playerid, text);
SendClientMessage(pID,COLOR_YELLOW,string);
return 1;
} -
muss ich wirklich jedes mal, wenn ich auf die Info von dem Fahrzeug in dem man sitzt, zugreifen will, muss ich dann echt jedes mal die Schleife machen?:
Nein, du müsstest den stock so schreiben:
getCarID(playerid){
new vID = GetPlayerVehicleID(playerid);
for(new i = 0; i < sizeof(cInfo); i++){
if(cInfo[i][id_x] == vID) return i;
}
return INVALID_VEHICLE_ID;
}Dann wird dir der richtige Index zurück gegeben.
Beachte, dass du dort wo du den stock nutzt auch abfrägst, ob der Wert nicht INVALID_VEHICLE_ID ist, bevor du es in einem Array-Index nutzt, sonst kommt es zu Fehlern, da du das Array dann sprengst.PS:
Bitte beachte zukünftig, dass dieser Thread für kleine Scriptingfragen gedacht ist, und nicht für solch große Codes. -
Minuten = Fight_Time/60;
Minuten = Minuten/60;
zu:
Minuten = (Fight_Time - (Stunden*3600))/60;Sekunden kannst du dann auch so machen:
Sekunden = Fight_Time - (Stunden*3600) - (Minuten*60); -
Sondern halt wirklich flüssig. Mir würde als Funktion nur nen Timer einfallen ...
Entweder mit einem Timer um die 40ms (=24+ Bilder pro Sekunde = Flüssig) oder über OnPlayerUpdate.
OnPlayerUpdate entdeckt und frage mich wann die so aufgerufen wird ?
Zwischen 10 und 30 mal pro Sekunde, je nach dem ob du dich bewegst oder nicht. Für deine Anforderung würde das durchaus Sinn machen, das hier einzubauen.
Damit:
Kann man die benutzen um eine Flüssige Geschwindigkeit anzuzeigen ?
Ja.
also ich würde mit nem Timer jede Millisekunde nen Public aufrufen, glaube aber, dass die Performance drunter leidet
Das bitte nicht machen, das wären 1000 Bilder pro Sekunde, das ist viel zu viel.
-
Hat es denn irgendeinen Nachteil die Backticks zu verwenden?
Nein, die kannst du wie die "normalen" Ticks jederzeit und überall verwenden. Der Nachteil wäre lediglich die Lesbarkeit und Schreibarbeit, wobei das Geschmackssache ist. Funktionstechnisch kannst du diese aber immer nutzen.
-
Daher hab ich noch die '' weggemacht und nun klappts haha
Die '' am Wert verursachen in aller Regel kein Problem, heißt diese gehen auch bei Integern.
Für Strings zum Beispiel sind sie aber zwingend notwendig. Daher ist die grundsätzliche Empfehlung, diese immer zu nutzen. Die `` würde ich wiederrum wirklich nur im Ausnahmefall nutzen, oder gar nicht (dann lieber die Spalte umbenennen).Kann aber natürlich jeder so halten wie er/sie das gerne mag - und natürlich wie es funktioniert.
-
LOAD gehört zur SQL Syntax, daher der Fehler.
Schreibe es so:
mysql_format(handle, query, sizeof(query), "SELECT * FROM cars WHERE owner = '%i' AND `load` = '1'", pInfo[playerid][db_id]);LOAD wird damit sozusagen "escaped" und kann verwendet werden.