He?
Da ist nirgens ein Lösch button..wo drückst n auf löschen? xD
Beiträge von Kaliber
-
-
Mal ein paar Hinweise...
- Da das ein Include sein soll, nutze bei globalen Variablen static und nicht new. (Damit Namen nicht Fehler auftreten, falls im Gamemode genau die selben Variablen Namen verwendet wurden. Hier als Tipp noch, nimm static stock damit man deine Include einfach inkludieren kann und nichts reserviert wird, auch wenn man keine Funktion nutzt.
- Du hast einen Fehler bei deiner UpdateRealTime Funktion. Du rufst das unter OnGameModeInit auf...übergibst aber gar keine Spielerid...verwendest dann aber den Parameter playerid. Nun, jetzt wirst du dir denken, was meckert er denn, bei mir hat das wunderbar funktioniert. Das ist auch korrekt, allerdings nur, weil nichts übergeben wurde..und der Parameter deshalb immer 0 sein wird...und du wahrscheinlich spielerid 0 warst
Also, hier entweder das auf OnPlayerConnect verlagern (was meines erachtens am besten wäre, denn dann kannst du nach dem Login bzw wenn die TextDraws wieder weg sollen den Timer killen und sparst dadurch ressourcen) oder du musst eine Schleife für alle Spieler verwenden
- Da du das jetzt als Include gemacht hast...wäre es doch eventuell besser gewesen, das mit den Pointern zu machen...da du so den Nutzern Speicherplatz sparst...ich meine..jetzt reservierst du jedem der das nutzen will 64kb...
- Du verwendest in deinen TextDraws sowas wie ueber das sieht nicht so dolle aus..schreib es mal \172ber. Dann wird das ü korrekt dargestellt
Link für alle Codes: http://forum.sa-mp.com/showthread.php?t=397515
An sich...finde ich sowas als Include nicht gerade sehr sinnvoll, da man so oder so..die Texte in der Include anpassen muss...und naja...man ist an das Design gebunden..usw...
Dennoch nett, dass du dein Design veröffentlichst
Noch ein Optionaler Punkt:
"Dieser Name ist ~g~nicht~w~ in Verwendung.~n~Du kannst dich jetzt ~g~registrieren."
Alle deine Texte sind statisch, das ist sehr gut
Dadurch kannst du sie packen
Setz am Anfang ein ! davor:Zum Beispiel:
LoginTextDraw[playerid][29] = CreatePlayerTextDraw(playerid,346.000000, 162.000000, !"Dieser Name ist ~g~nicht~w~ in Verwendung.~n~Du kannst dich jetzt ~g~registrieren.");
Der eine Satz (das kannst du überall machen) besteht aus 82 Zeichen.
Normalerweise brauch jede Cell 4 Bytes. Also 82 * 4 Bytes = 328 Bytes
Wenn du es aber packst, brauch jede Cell nur 1 Byte, also 82 * 1 Byte = 82 Bytes
Kannst hier also 25% Speicher sparen
Und das summiert sich ja..da du viele Texte hast :3 -
Ehh keine Ahnung, was du meinst..poste am besten mal deinen Code

-
....den stock hast du unten im Skript..und die Nutzung in einem Callback / einer Funktion?

-
Stats0 = CreatePlayerTextDraw(playerid,222.000000, 158.000000, "_");
Überall wo du Stats0 verwendest...musst du eigentlich: Stats0[playerid] verwenden

Aber als Tipp: [SAMMELTHREAD] Kleine Scripting Fragen
-
Ouhh...ehh
Wie hast du das denn alles deklariert?

-
Du lädst das falsch..dass muss so aussehen:
Ccache_get_field_content(0, "IP", sInfo[playerid][sIP]); sInfo[playerid][sBargeld] = cache_get_field_content_int(0, "Bargeld"); sInfo[playerid][sLevel] = cache_get_field_content_int(0, "Level"); sInfo[playerid][sGeschlecht] = cache_get_field_content_int(0, "Geschlecht"); sInfo[playerid][sSkin] = cache_get_field_content_int(0, "Skin");Es gab keinen Fehler, weil man optional das connection Handle da angeben kann

-
Es würde auch sowas reichen:
C
Alles anzeigenstock GetRandomPlayer() { new list[MAX_PLAYERS],idx; for(new i=GetPlayerPoolSize(); i!=-1; i--) { if(!IsPlayerConnected(i) || IsPlayerNPC(i)) continue; list[idx++] = i; } return (!idx) ? INVALID_PLAYER_ID : list[random(idx)]; } //Nutzung: new id = GetRandomPlayer(); if(id == INVALID_PLAYER_ID) return 1; //Hier ist kein Spieler online! SetContract(id, 1000); //Beispiel Code -
Schreibweise etwas kompliziert
Makros sind nice
C
Alles anzeigen//Hier paar Makros: #define LoopTextDraws(%0,%1,%2) new __@tmp=_:(%2);for(new %0=_:(%1); (%0) < __@tmp; (%0)++) //Und zur Deklaration: new PlayerText:x = CreatePlayerTextDraw(..); //Es reicht hier nur x zu nutzen //Unter das erste TextDraw: LoginTextDraw[playerid][0] = x; //Unter das letzte TextDraw: LoginTextDraw[playerid][1] = x; //Loop: LoopTextDraws(textid, LoginTextDraw[playerid][0], LoginTextDraw[playerid][1]) { PlayerTextDrawHide(playerid, PlayerText:textid); } //Oder mit PVars: #define LoopTextDraws(%0,%1,%2,%3) new __@tmp=GetPVarInt(%0,%3);for(new %1=GetPVarInt(%0,%2); (%1) < __@tmp; (%1)++) #define SetPointer(%0,%1,%2) SetPVarInt(%0,%1,_:(%2)) #define DeletePointer(%0,%1) DeletePVar(%0,%1) //zur Deklaration: new PlayerText:x = CreatePlayerTextDraw(..); //Es reicht hier nur x zu nutzen //Unter das erste TextDraw: SetPointer(playerid, "Start", x); //Unter das letzte TextDraw: SetPointer(playerid, "Ende", x); LoopTextDraws(playerid, textid, "Start", "Ende") { PlayerTextDrawHide(playerid, PlayerText:textid); PlayerTextDrawDestroy(playerid, PlayerText:textid); } DeletePointer(playerid, "Start"); DeletePointer(playerid, "Ende");Hahah xD
Aber ist okay, dein Skript

-
So:
for(new i; i <sizeof(LoginTextDraw[]); i++)
Wenn du einen kleinen Performanz hinweis magst:
Weißt du, du erstellst (deklarierst) hier ein global Array.
Das wird im Heap reserviert.
[MAX_PLAYERS][33];
Mal angenommen MAX_PLAYERS sind 500.
Dann würdest du hier 500*33*4 Bytes = 66000 Bytes = 64.45KiloBytes
in der .amx reservieren nur um ein paar TextDraw ids zu speichern.
Also ich fände das nicht gerade sehr schön xD
Besonders wenn du noch mehr TextDraws hast..reservierst du da hunderte KiloBytes an speicher...für nix xDEin trick wäre...die Nutzung von "Pointers".
1. Möglichkeit:
C
Alles anzeigennew PlayerText:LoginTextDraw[MAX_PLAYERS][2]; //Sind 4000 Bytes..aber besser als 66000 xD new PlayerText:x = LoginTextDraw[playerid][0] = CreatePlayerTextDraw(...); //Hier beim ersten TextDrawPlayerTextDrawSetXX(x, true); //Nutzen dann hier mit x x = CreatePlayerTextDraw(...); //Hier einfach auf x zuweisen und die ID nutzen (bei allen) PlayerTextDrawSetXX(x, true); //Nutzen dann hier mit x //und ganz zum schluss: LoginTextDraw[playerid][1] = x; //Jetzt weißt du..wo es anfängt und aufhört //Loop würde z.B. so aussehen: new len = _:LoginTextDraw[playerid][1]+1; for(new textid=_:LoginTextDraw[playerid][0]; textid<len; textid++) { PlayerTextDrawHide(playerid, PlayerText:textid); }
2. Möglichkeit:Nutzung von 2 PVars.
Sieht genau gleich aus..nur mit Set & Get nutzen.
Dann kann man auch, z.B. wenn es nur um den Login geht...DeletePVar & PlayerTextDrawDestroy machen und verbrauchst nun so 0 Speicher
Fazit:
Würdest du Möglichkeit 1 nutzen, dann würdest du bei 100000 Iterationen...dir ca 2ms sparen. Allerdings würdest du immernoch jede Menge Speicher reservieren. Allerdings kannst du nun abwegen ob dir 2ms CPU wichtiger sind...oder ein Speicherverbrauch von 0 Bytes
-
Dann klammer mal die header Zeile aus..und printe dir mal, was er dir so ausgibt..als namen...als query..und und und

-
Kann man mit Count nicht die Zeile auslesen?
Nein..hast du meinen Code dir mal angeschaut?

Habe doch das Query und die Abfrage mit dem rowCount angepasst

-
...kannst mal n Bild von deiner Tabellenstruktur machen?

-
Oh, du hattest Auhority geschrieben..muss aber Authority heißen

-
Die Funktion kannste vereinfachen:
Cpublic settime(playerid) { new string[16]; gettime(string[0], string[1], string[2]); format(string,sizeof(string),"%02d:%02d:%02d",string[0],string[1],string[2]); TextDrawSetString(Time, string); }Für jeden Spieler das einzeln zu setzen macht btw keinen Sinn...kannst das direkt nur für das TextDraw setzen, das wird dann für die einzelnen Spieler automatisch angezeigt

Zudem wenn er zu langsam zählt, liegt das an dem Timer-Interval, ders zu groß

-
Heißt dein Feld in der Datenbank wirklich [Name] oder doch eher nur Name ?
PHP
Alles anzeigen$lsu_username = $_SESSION['User']; $stmt = $conn->prepare("SELECT * FROM $db_Account WHERE `Name` = :name"); $stmt->execute(array(':name' => $lsu_username)); $row = $stmt->fetch(); if ($stmt->rowCount() == 1) { $AdminLevel = $row['Auhority'];// <- AdminLevel } else { session_destroy(); header("Location: index.php"); } -
...nutzt du denn einen "CMD Prozessor", wenn ja welchen..hast du noch andere Includes..wo dieser Callback drinnen ist?
Lade eventuell mal crashdetect und probiere mal aus, was der so ausspuckt

-
Die anderen Funktionieren (sofern die Befehle funktionieren) wie z.B. der /help-Dialog
Keine Ahnung..was du damit aussagen willst.
Aber an dem Code den du geschrieben hast..ist nichts falsch

Der Fehler muss also woanders liegen...
-
Also nicht mal beim IE hats bei mir n doppelten border..
Vielleicht machste mal n screen und markierst was du meinst xD
-
Fehler code der MySQL Log:
AUTO_INCREMENT bedeutet, dass er automatisch das Feld erhöht..aber das geht nur bei Integern, nicht bei Strings...
Also das ist fehl am Platz

Sobald ich diesen code drin hab, funktioniert kein Command mehr
Denke nicht, dass es an dem Callback liegt...das sieht so eigentlich richtig aus...
Wie haste denn DIALOG_PLAYERCLICK definiert?
