hab auch ein kleines problem: error 010: invalid function or declaration
new zeitpacket;
zeitpacket = hours;
kann man bei pawno nicht eine variable in eine andere packen ?
[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
-
-
kann man bei pawno nicht eine variable in eine andere packen ?
Wie hast denn hours deklariert?
PS: Die Sprache heißt nur PawnTest und test2 sind die Nachrichten die Gespeichert werden.
Nein ich meine..wenn du darauf klickst...was soll den passieren..welche Nachricht willst du denn sehen..wo ist diese gespeichert
-
@Kaliber:
Ich hatte ja gefragt wie das geht dass ich mir die Bugreports anzeigen lasse da hattest du mir Geholfen ( voherige seite ).
Doch da wird die Ganze zeile Ausgegen aber ich will in dem Dialog dann nur die namen stehen habem wie z.b wemn 3 leute ein Bug gemeldet haben dann soll der Dialog so aussehen
Spieler x
Spieler y
Spieler zWenn ich dann auf spieler x drücke soll doe Ganze nachricht ausgegeben werden ist das realisierbar ?
Die bugmeldungen werden dort gespeichert
"logs/Bugreports.txt" -
Aso..ja sry mein Fehler..hatte mich verlesen
Hier, probiers mal so:
C
Alles anzeigennew File:f = fopen("logs/Bugreports.txt",io_read); if(!f) return 1; //Keine Berechtigung const rows = 10; //Wie viele Namen du angezeigt bekommen möchtest new buffer[256],tmp[128],stack[MAX_PLAYER_NAME*rows],x,y,counter,n[16]; while(fread(f, buffer)) { x = strfind(buffer,"]"), y = strfind(buffer,":",false,x); strmid(tmp,buffer,x+1,y,sizeof(tmp)); strcat(tmp,"\n"),strcat(stack, tmp); strmid(tmp,buffer,y+2,strlen(buffer),sizeof(tmp)); format(n,sizeof(n),"bug_%d",counter++); SetPVarString(playerid,n,tmp); } SetPVarInt(playerid,"bug_length",counter); fclose(f); ShowPlayerDialog(playerid,DIALOG_BUSREPORTS,DIALOG_STYLE_LIST,"Log",stack,"Bestätigen",""); //Und dann unter OnDialogResponse if(dialogid == DIALOG_BUSREPORTS) { if(!response) return DeleteBugCache(playerid); new string[128],n[16]; format(n,sizeof(n),"bug_%d",listitem); GetPVarString(playerid,n,string,sizeof(string)); ShowPlayerDialog(playerid,999,DIALOG_STYLE_MSGBOX,"Log",string,"Bestätigen",""); DeleteBugCache(playerid); return 1; } //Und unten ganz wichtig: stock DeleteBugCache(playerid) { new max=GetPVarInt(playerid,"bug_length"); for(new i,n[16]; i<max; i++) { format(n,sizeof(n),"bug_%d",i); DeletePVar(playerid, n); } DeletePVar(playerid,"bug_length"); return 1; }
-
Ok mache ich gleich
Aber ich würde die auch gerne nach ein serverrestart behalten -
Aber ich würde die auch gerne nach ein serverrestart behalten
Tust du doch...das wird immer wieder neu geladen...solange du es in den files lässt
-
Bräuchte mal etwas Hilfe
public OnPlayerClickPlayer(playerid, clickedplayerid, source)
{
if(SpielerInfo[playerid][uAdmin] > 4)
{
ShowPlayerDialog(playerid,DIALOG_PLAYERCLICK,DIALOG_STYLE_LIST,"Spieler Menue","Admin-Menue\nSupporter-Menue\nTester-Menue","Auswählen","Beenden");
return 1;
}
return 1;
}Sobald ich diesen code drin hab, funktioniert kein Command mehr
-
Guten Abend,
ich bin dabei auf R39-6 ein System aufzubauen, nun ist das Problem da, das ich die Tabelle nicht so erstellen kann wie ich möchte.
new string[256];
format(string, sizeof(string), "CREATE TABLE IF NOT EXISTS `Accounts` (`Spielername` varchar(24) NOT NULL AUTO_INCREMENT, `Passwort` varchar(128), `IP` varchar(16), `Level` int(11)");
format(string, sizeof(string), "%s, `Bargeld` int(11), PRIMARY KEY(`Spielername`))", string);
mysql_tquery(Handle, string);Fehler code der MySQL Log:
[ERROR] CMySQLQuery::Execute[] - (error #1063) Incorrect column specifier for column 'Spielername' (Query: "CREATE TABLE IF NOT EXISTS `Accounts` (`Spielername` varchar(24) NOT NULL AUTO_INCREMENT, `Passwort` varchar(128), `IP` varchar(16), `Level` int(11), `Bargeld` int(11), PRIMARY KEY(`Spielername`))")Mit freundlichen Grüßen,
-
Bräuchte mal etwas Hilfe
public OnPlayerClickPlayer(playerid, clickedplayerid, source){if(SpielerInfo[playerid][uAdmin] > 4){ShowPlayerDialog(playerid,DIALOG_PLAYERCLICK,DIALOG_STYLE_LIST,"Spieler Menue","Admin-Menue\nSupporter-Menue\nTester-Menue","Auswählen","Beenden");return 1;}return 1;}Sobald ich diesen code drin hab, funktioniert kein Command mehr
mach mal so
public OnPlayerClickPlayer(playerid, clickedplayerid, source)
{
if(!SpielerInfo[playerid][uAdmin] > 4)return SendClientMessage(playerid,DeineFarbe,"Text");
{
ShowPlayerDialog(playerid,DIALOG_PLAYERCLICK,DIALOG_STYLE_LIST,"Spieler Menue","Admin-Menue\nSupporter-Menue\nTester-Menue","Auswählen","Beenden");
return 1;
}
return 1;
} -
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?
-
mach mal so
public OnPlayerClickPlayer(playerid, clickedplayerid, source){if(!SpielerInfo[playerid][uAdmin] > 4)return SendClientMessage(playerid,DeineFarbe,"Text");{ShowPlayerDialog(playerid,DIALOG_PLAYERCLICK,DIALOG_STYLE_LIST,"Spieler Menue","Admin-Menue\nSupporter-Menue\nTester-Menue","Auswählen","Beenden");return 1;}return 1;}Bringt nichts
Denke nicht, dass es an dem Callback liegt...das sieht so eigentlich richtig aus...
Wie haste denn DIALOG_PLAYERCLICK definiert?
So wie jeden anderen Dialog
#define DIALOG_PLAYERCLICK 11
Die anderen Funktionieren (sofern die Befehle funktionieren) wie z.B. der /help-Dialog -
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...
-
Keine Ahnung..was du damit aussagen willst.
Aber an dem Code den du geschrieben hast..ist nichts falschDer Fehler muss also woanders liegen...
Ich will damit sagen, dass alle anderen Dialoge funktionieren
Wenn ich das Callback public OnPlayerClickPlayer kommentiere funktionieren wieder alle Befehle
-
...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
-
...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
Komisch, crashdetect ist drin und plötzlich geht alles...
-
Hi, hat jemand eine bessere Funktion um die aktuelle Real Time abzufragen? Hab's aktuell so, aber der zählt alle ~10 Sekunden immer +2 hoch anstatt +1.
public settime(playerid)
{
new string[256],hours,minutes,seconds;
gettime(hours, minutes, seconds);
format(string, sizeof string, "%s%d:%s%d:%s%d", (hours < 10) ? ("0") : (""), hours, (minutes < 10) ? ("0") : (""), minutes, (seconds < 10) ? ("0") : (""), seconds);
TextDrawSetString(Time, string);
} -
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ß
-
Okay, verwende nun deine Version
Letzte Frage, wie loope ich hier korrekt, wenn meine TextDraws so erstellt werden?
new PlayerText:LoginTextDraw[MAX_PLAYERS][33];
Hab's so, aber bekomme ein Error.
stock ShowLoginTextDraws(playerid)
{
for(new i; i < LoginTextDraw[playerid]; i++)
{
PlayerTextDrawHide(playerid, LoginTextDraw[playerid][i]);
}
}logintextdraws.inc(387) : error 033: array must be indexed (variable "LoginTextDraw")
-
for(new i; i < sizeof(LoginTextDraw[]); i++)
-
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 SpeicherFazit:
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 -