Wie Kasakow bereits gesagt hat, ist sowas unnötig.
Es ist viel zu kompliziert und die Verbesserung würde im Idealfall bei 1-2ms liegen.
Eine MySQL Datenbank ist mit Absicht in dieser tabellarischen Form, das sollte man auch so nutzen.
[SAMMELTHREAD] Kleine Scripting Fragen
- Rafelder
- Unerledigt
Dein Problem konnte durch einen User gelöst werden? Bedank dich bei ihm indem du seinen Beitrag als Hilfreich markierst sowie einen Daumen oben dalässt
Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!
Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
-
-
-
Das ist nur mit einer Include wie der genannten möglich.
-
Huhu,
nach langer Inaktivität melde ich mich hier auch mal wieder, da mir ein Fehler in einem neuen Script unterlaufen ist:C
Alles anzeigen//SaveStats stock SaveUserStats(playerid) { if(!pInfo[playerid][pLoggedIn]) return 1; new query[1024]; mysql_format(handle, query, sizeof(query), "UPDATE users SET level = '%d', admin = '%d', skin = '%d', frak = '%d', fraklevel = '%d'", pInfo[playerid][pLevel], pInfo[playerid][pAdmin], pInfo[playerid][pSkin], pInfo[playerid][pFrak], pInfo[playerid][pFraklevel]); mysql_format(handle, query, sizeof(query), "%s, crew = '%d', crewlevel = '%d', job = '%d', money = '%d', bank = '%d'", query, pInfo[playerid][pCrew], pInfo[playerid][pCrewlevel], pInfo[playerid][pJob], pInfo[playerid][pMoney], pInfo[playerid][pBank]); mysql_format(handle, query, sizeof(query), "%s, kills = '%d', deaths = '%d', prem = '%d', house = '%d', maxcars = '%d'", query, pInfo[playerid][pKills], pInfo[playerid][pDeaths], pInfo[playerid][pPrem], pInfo[playerid][pHouse], pInfo[playerid][pMaxcars]); mysql_format(handle, query, sizeof(query), "%s, tut = '%d', checkpoint = '%d', wanteds = '%d', veri = '%d'", query, pInfo[playerid][pTut], pInfo[playerid][pCheckpoint], pInfo[playerid][pWanteds], pInfo[playerid][pVeri]); mysql_format(handle, query, sizeof(query), "%s WHERE uid = '%d'", pInfo[playerid][pID]); mysql_pquery(handle, query); return 1; }
Warum auch immer speichert die Funktion nicht nur den Spieler in der DB, sondern setzt seine Werte auch in jeden anderen Spieler ein.Screens von der Tabelle (Usernamen + verlüsselte Passwörter ausgeschnitten):
https://imgur.com/a/MN4QnS0Ich danke euch wie immer im Voraus für eure Hilfe.
//EDIT: Fehler lustigerweise beim Posten direkt gesehen. Habe beim letzten format nicht das ,query angehängt.
-
Könnte ich theoretisch nicht einfach ganz viele Variablen aus einer machen?
Sagen wir ich benutzte die Zahlen 0 und 1 (Benutzte ich als true/false), dann könnte man doch aus der Zahlen-Stelle weitere Variablen erstellen.
Heißt, ich speicher in der Datenbank als Beispiel: 01100111.
Jetzt nehme ich mir die Zahlen und frage ab, welche Zahl die erste Stelle hat, die zweite Stelle hat usw.Meine Fragen:
Wie frage ich die Zahl an der bestimmten Stelle ab?
Wie verändere ich eine Zahl an einer bestimmten Stelle, ohne die anderen Stellen zu ändern?Wenn du viel true/false hast dann würde ich dir empfehlen das ganze in ein "bit-field" umzulagern, du hast leicht gesagt einen 32bit Integer (ganz normale "Pawn Variable") und darin kannst du einfach gesagt 32x(0 oder 1) also false/true speichern.
Das macht es auch ganz einfach zu Speichern, indem du einfach das ganze bitfield in deinem System der Wahl als Integer behandelst, Zeit und Platz gespartDas beste Beispiel was ich gerade schnell gefunden hab ist hier zu finden: https://forums.alliedmods.net/showthread.php?t=139916 siehe Example 3 ist soweit das gleiche in "SAMP PAWN"
-
Ist es irgendwie möglich Zeilenumbrüche mit SendClientMessage zu machen, sodass ich nicht 4x SendClientMessage(string) nutzen muss sondern einfach einen string einfüge, der dann \n beinhaltet ?
-
Das ist mit SA:MP leider nicht möglich.
-
Das ist mit SA:MP leider nicht möglich.
Doch ist es, indem er eine Funktion schreibt wo der String ausgelesen wird und doch geschaut wird steht dort /n und dann darauf eine Neue Nachricht macht, was es natürlich unnütz macht.
Ist es irgendwie möglich Zeilenumbrüche mit SendClientMessage zu machen, sodass ich nicht 4x SendClientMessage(string) nutzen muss sondern einfach einen string einfüge, der dann \n beinhaltet ?
Das könnte dir helfen und dann einfach SendClientMessageEx nutzen, Jedoch ist das nur für 2 Nachrichten gedacht.
Du kannst dies jedoch auch erweitern.Code
Alles anzeigenstock SendClientMessageEx(playerid, color, string[]) { new count, lenght = 72; for(new i=0; i!=strlen(string); i++) { if(string[i] == '{' && string[i+7] == '}') count += 8; } if(strlen(string) > (lenght+count)) { new text[2][128]; strmid(text[0], string, 0, lenght+count); strmid(text[1], string, lenght+count, strlen(string)); format(text[0], 128, "%s...", text[0]); SendClientMessage(playerid, color, text[0]); format(text[1], 128, "...%s", text[1]); SendClientMessage(playerid, color, text[1]); return 1; } SendClientMessage(playerid, color, string); return 1; } stock SendClientMessageToAllEx(color, string[]) { new count, lenght = 72; for(new i=0; i!=strlen(string); i++) { if(string[i] == '{' && string[i+7] == '}') count += 8; } if(strlen(string) > (lenght+count)) { new text[2][128]; strmid(text[0], string, 0, lenght+count); strmid(text[1], string, lenght+count, strlen(string)); format(text[0], 128, "%s...", text[0]); SendClientMessageToAll(color, text[0]); format(text[1], 128, "...%s", text[1]); SendClientMessageToAll(color, text[1]); return 1; } SendClientMessageToAll(color, string); return 1; }
-
Ja, das ist richtig. Die Frage war aber ob es nativ mit SendClientMessage möglich ist. Solch Workarounds gibt es immer.
-
Huhu,
nach langer Inaktivität melde ich mich hier auch mal wieder, da mir ein Fehler in einem neuen Script unterlaufen ist:C
Alles anzeigen//SaveStats stock SaveUserStats(playerid) { if(!pInfo[playerid][pLoggedIn]) return 1; new query[1024]; mysql_format(handle, query, sizeof(query), "UPDATE users SET level = '%d', admin = '%d', skin = '%d', frak = '%d', fraklevel = '%d'", pInfo[playerid][pLevel], pInfo[playerid][pAdmin], pInfo[playerid][pSkin], pInfo[playerid][pFrak], pInfo[playerid][pFraklevel]); mysql_format(handle, query, sizeof(query), "%s, crew = '%d', crewlevel = '%d', job = '%d', money = '%d', bank = '%d'", query, pInfo[playerid][pCrew], pInfo[playerid][pCrewlevel], pInfo[playerid][pJob], pInfo[playerid][pMoney], pInfo[playerid][pBank]); mysql_format(handle, query, sizeof(query), "%s, kills = '%d', deaths = '%d', prem = '%d', house = '%d', maxcars = '%d'", query, pInfo[playerid][pKills], pInfo[playerid][pDeaths], pInfo[playerid][pPrem], pInfo[playerid][pHouse], pInfo[playerid][pMaxcars]); mysql_format(handle, query, sizeof(query), "%s, tut = '%d', checkpoint = '%d', wanteds = '%d', veri = '%d'", query, pInfo[playerid][pTut], pInfo[playerid][pCheckpoint], pInfo[playerid][pWanteds], pInfo[playerid][pVeri]); mysql_format(handle, query, sizeof(query), "%s WHERE uid = '%d'", pInfo[playerid][pID]); mysql_pquery(handle, query); return 1; }
Warum auch immer speichert die Funktion nicht nur den Spieler in der DB, sondern setzt seine Werte auch in jeden anderen Spieler ein.
Screens von der Tabelle (Usernamen + verlüsselte Passwörter ausgeschnitten):
https://imgur.com/a/MN4QnS0Ich danke euch wie immer im Voraus für eure Hilfe.
//EDIT: Fehler lustigerweise beim Posten direkt gesehen. Habe beim letzten format nicht das ,query angehängt.
versuche es mal so
stock SaveUserStats(playerid)
{
if(!pInfo[playerid][pLoggedIn]) return 1;
new query[1024];
mysql_format(handle, query, sizeof(query), "UPDATE users SET level = '%d', admin = '%d', skin = '%d', frak = '%d', fraklevel = '%d',",
pInfo[playerid][pLevel], pInfo[playerid][pAdmin], pInfo[playerid][pSkin], pInfo[playerid][pFrak], pInfo[playerid][pFraklevel]);
mysql_format(handle, query, sizeof(query), "%s, crew = '%d', crewlevel = '%d', job = '%d', money = '%d', bank = '%d',",
query, pInfo[playerid][pCrew], pInfo[playerid][pCrewlevel], pInfo[playerid][pJob], pInfo[playerid][pMoney], pInfo[playerid][pBank]);
mysql_format(handle, query, sizeof(query), "%s, kills = '%d', deaths = '%d', prem = '%d', house = '%d', maxcars = '%d',",
query, pInfo[playerid][pKills], pInfo[playerid][pDeaths], pInfo[playerid][pPrem], pInfo[playerid][pHouse], pInfo[playerid][pMaxcars]);
mysql_format(handle, query, sizeof(query), "%s, tut = '%d', checkpoint = '%d', wanteds = '%d', veri = '%d',",
query, pInfo[playerid][pTut], pInfo[playerid][pCheckpoint], pInfo[playerid][pWanteds], pInfo[playerid][pVeri]);
mysql_format(handle, query, sizeof(query), "%s WHERE uid = '%d' ", pInfo[playerid][pID]);
mysql_pquery(handle, query);
return 1;
} -
Er hat doch bereits geschrieben, dass er den Fehler gefunden hat.
Dein Code würde das Problem deswegen auch nicht lösen, weil du genauso vergessen hast den alten query String mitzuformatieren. -
tja passiert aber , am ende bei jeder zeile fehlte auch
-
tja passiert aber , am ende bei jeder zeile fehlte auch
Danke trotzdem für deine Rückmeldung. Im Endeffekt mein Fehler, wenn ich den Edit direkt drunter schreibe. Es gibt immer einige die es nicht komplett durchlesen.
Jedoch steht das Komma, welches du überall hinzugefügt hast schon in der query und zwar jedes mal hinter dem %s.Ich hätte einfach nur direkt ein fehlendes ,query hinter dem letzten format sehen müssen.
Er hat doch bereits geschrieben, dass er den Fehler gefunden hat.
Dein Code würde das Problem deswegen auch nicht lösen, weil du genauso vergessen hast den alten query String mitzuformatieren.Wohl wahr. Diese formats sind aber auch immer kacke unleserlich hehe.
-
Diese Aktion aus dem Singleplayer, habe ich erst seit kurzem.
Wieso? und Woher .. ?
Wenn ich einen GMX gerade starte .. wird Respekt abgezogen .. wenn ich mich nach dem GMX anmelde .. wird mir Respekt hinzugefügt. -
Hey,
wie ist es möglich, bei allen Commands statt der ID auch einfach einen Teil des Namen anzugeben?Bsp.: Wenn wir einen Spieler Names Testaccount haben
Statt /whisper [ID von Testaccount]
/whisper [Testacc]habe diese Funktion auf anderen Servern gesehen und würde das ganze selbst auch gerne nutzen.
Ist das ganze außerdem mit ocmd möglich ?
-
Dafür benutzt du einfach sscanf.
Statt d (für einen Integer) oder s (für einen String) verwende einfach u (für einen User)
Das hat genau diese Funktion. -
Wie Leon bereits sagte. Mit "u" kannst du bei der sscanf Anwendung, ID & teil oder ganzen Namen verwenden.
z.B
new id;
if(sscanf(params, "u", id))return SendClientMessage(playerid, -1, "Befehl: /cmd [Name/ID]"); -
Dafür benutzt du einfach sscanf.
Statt d (für einen Integer) oder s (für einen String) verwende einfach u (für einen User)
Das hat genau diese Funktion.Oh shit. Ich glaub das wurde mir sogar schon mal gesagt.
Dankesehr ihr beiden.
//e: FRAGE: Kann keine neue Antwort auf das Thema hier senden, von daher versuche ich mal so zu fragen:
Macht es einen krassen Unterschied, wenn ich 3Enums(und damit auch 3 verschiedene MySQL-Tabellen) für folgendes mache:
1. Spielerstatistik 2. Spielerinventar 3.SpielereinstellungenWürde das gerne für mich selbst so machen, damit ich zum einen nicht eine extrem volle "users" Tabelle habe und ich zum anderen im script leichter unter ähnlich benannten variablen unterscheiden kann.
Wenn das ganze performancetechnisch recht gravierend wär, würde ich es sein lassen. Auch wenn ich sowieso mind. noch 10enums+tabellen für andere Systeme erstellen werde.Abgefragt werden die Tabellen sowieso nur, wenn etwa alle halbe stunde ein AutoSave ausgeführt wird und eben bei connect/disconnect eines Spielers.
-
Wieso denn neue Enumeratoren.
Klar kannst du verschiedene Tabellen nutzen, dennoch das gleiche Array, gebunden an den selben Enumerator. -
Wieso denn neue Enumeratoren.
Klar kannst du verschiedene Tabellen nutzen, dennoch das gleiche Array, gebunden an den selben Enumerator.Ist eher so für mich, würde es so ein wenig übersichtlicher haben, da ich recht viele ähnlich benannte Variablen in den Arrays habe, diese schon mehrfach verwechselt habe, und das nach ihren Bereichen unterteilen möchte.
Deshalb fragte ich ja, ob man dadurch performancetechnisch einen Unterschied merken würde.Wieder eine neue Frage:
Ich habe 2 Funktionen, mit denen ich das Geld eines Spielers setzen / getten kann.beim setter wird sein Geld resettet(ResetPlayerMoney) und dann auf die variable(pInfo[playerid][pMoney]) += menge gesetzt.
Allerdings habe ich ein Problem mit einigen Aktionen die standardmäßig Geld abziehen, z.B. bei
Sprunk-Automatenm, Tuning in Werkstätten, Respray(PnS).Hierbei wird das Geld direkt vom "normalen" Geld abgezogen. Da meine Funktion das nicht sieht bzw. die Variable hierbei nicht angepasst wird, kann der Spieler diese Funktionen kostenlos nutzen, da beim nächsten GivePlayerMoneySave(meine Funktion) einfach das Geld resettet und nach pInfo[playerid][pMoney] neugesetzt werden würde.
Ich hoffe man versteht was ich meine.
Ich brauche einfach nur eine Lösung, die diese Kosten(Sprunk, Tuning, Respray und weitere) bei der Aktion auch von der Variable abziehen.