Ich kann da keinen Klammerfehler entdecken. Was gibt der Compiler denn für Fehler aus, oder was funktioniert ingame nicht?
Beiträge von Padarom
-
-
Du findest es Flamm? Was zur Hölle ist Flamm?
ZitatZwischenzeitlich (Stand 25.08.2011, 9.00 Uhr) sind über 6.800 Beschwerden zu diesem Beitrag auf programmbeschwerde eingegangen.
Die für die Aufsicht über RTL zuständige Landesmedienanstalt, die NLM, ist über den Vorgang informiert.
Der rechtliche Umgang mit dem Beitrag ist von der Anzahl eingegangener Beschwerde völlig unabhängig. Weitere Beschwerden sind mithin für die rechtliche Beurteilung des Beitrags ohne Bedeutung.
Mit Blick auf die Vielzahl der eingegangenen Beschwerden bittet die LMS um Verständnis dafür, dass nicht auf jede einzelne Beschwerde gesondert geantwortet wird.
Auf http://www.programmbeschwerde.de wird über den weiteren Umgang mit den eingagngenen Beschwerden zeitnah informiert. [...]
Mission Accomplished -
Master_FM: Die hat wahrscheinlich schon mehr als 100 Nachrichten, bei denen sie ins übelste beleidigt und durch den Dreck gezogen wird. Was soll das helfen? Beschwerde bei RTL (u.A. Programmbeschwerde.de) ist besser, als hier irgendwie aggressiv zu werden und Leute zu beleidigen. Die hat ihr Profil glücklicherweise nurnoch für Freunde freigegeben, die Tage konnte man noch ihr Profilbild sehen, Interessen, Lieblingsserien, ...
Sachlichkeit und Objektivität bringt nämlich mehr als Rage.Hier nochmal eine Stellungsnahme eines Redakteurs.
Auf RTL-now.de oben bei News -> Punkt 6 vom 19.08.2011 ist ab 23:48 noch ein Bericht zu sehen, der das gleiche bezweckt. Das Video gibts in guter Qualität leider noch nicht auf Youtube. -
Ich glaube, dass das jetzt ein bisschen viel zu erklären wäre. Schau dir mal bei diesem Filterscript von Meta das Callback SetPlayerBurn und die damit bezogenen Timer/Objekte an. In etwa so solltest du das schreiben, und dann mit einem sehr frequentiven Timer und IsPlayerInRangeOfPoint überprüfen, ob ein Spieler in der Nähe des Feuers ist. Wenn ja, setze diesen Code.
-
Meinst du gescriptetes oder echtes (beispielsweise durch Flammenwerfer angebranntes) Feuer?
Beim gescripteten müsstest du eine IsPlayerInRangeOfPoint-Abfrage zusammen mit einem Timer machen, ansonsten sollte man eigentlich anfangen zu brennen und verliert auch Leben. -
Wie du in Interiors (und anderen virtuellen Welten) mappst, weiß ich leider auch nicht, aber du kannst irgendwo im Himmel oder unter der Erde ein Interior mappen und dann bei einer OnPlayerKeyStateChange-Abfrage den Spieler da hin teleportieren.
-
Ist sowas nicht im Serverpack von SAMP enthalten? Berichtige mich, wenn ich mich irre.
-
Keine Ursache, dafür ist die Hilfe ja gedacht ;D
Mit freundl. Grüßen
Padarom -
Bei OnPlayerText das return 1; zu 'nem return 0; setzen, das sollte eigentlich klappen.
-
Ist droptime auch der Name des Timers? Ansonsten würde ich nicht verstehen, was du damit erreichen willst.
Mit freundl. Grüßen
Padarom -
if(!IsPlayerInRangeOfPoint(playerid, 31, x, y, z) && IsPlayerInRangeOfPoint(playerid, 40, x, y, z))
{
// Sprich
}So würde ich das umsetzen.
@Kagayushi: Er fragt doch wie er das Umändern muss, damit nur Spieler in einer Entfernung von 31-40 Metern ausgewählt werden sollen.Mit freundl. Grüßen
Padarom -
Oh natürlich, ich habe ausversehen beim /register Command den gleichen Dialog genutzt, also login. Ändere das in register1 und es funktioniert. Werde das im Tutorial auch gleich berichtigen.
Mit freundlichen Grüßen
Padarom -
Hallo alle zusammen und Willkommen zu meinem 3. Tutorial.
Hier möchte ich euch erklären, wie ihr ein auf Dialogen aufgebauetes Login-/Registersystem mit einer ingame Passwort-vergessen Funktion schreiben könnt.
Ich weiß natürlich, dass es genug Tutorials zu dialogbezogenen Login-/Registersystemen auf Dini gibt, deshalb werde ich auf diese Punkte garnicht allzu viel näher eingehen, sondern eher das Hauptaugenmerk auf die eben angemerkte "Sonderfunktion" legen.Ablauf
- Spieler registriert sich mit Passwort, geheimer Frage & geheimer Antwort.
- Spieler vergisst sein Passwort und gibt ingame /passwortvergessen ein.
- Spieler gibt die Antwort auf seine geheime Frage ein.
- Wenn richtig wird ein neues Passwort (zufällig aus einer Liste vorgegebener Passwörter) erstellt und ihm zugewiesen.
- Spieler kann sich mit diesem Passwort einloggen und danach mit /pwändern ein neues zuweisen.
Dann fangen wir mal an. Das erste was wir benötigen sind die Defines der Dialoge- Nicht zu vergessen natürlich die implementierte Dini-Include, was ihr aber wissen solltet.
#define login 1
#define register1 2
#define register2 3
#define register3 4
#define lostpw 5
#define pwchange 6
Kurze Erklärung: login ist unser Dialog für den Login. In register1 gibt man sein Passwort ein, in register2 kann man seine geheime Frage wählen und in register3 die Antwort dazu eintragen. lostpw ist natürlich dann der Dialog um die Antwort abzufragen. Und zu guter letzt kommt pwchange was den Dialog zum Ändern des Passwortes darstellt.Als nächstes wollen wir eine Liste mit Passwörtern erstellen, die dem Nutzer zufällig zugewiesen werden.
new lostpws[][] =
{
"Ivamdub",
"gimfves",
"Fb53Ac",
"Every90",
"Deutschland",
"Gefaafny",
"Ftgenrl",
"Oranan",
"Lituania",
"UwAff3",
"fhhalc",
"fhn76",
"75hd",
"a7jvjmz",
"fsdhr"
};
In diesem Fall sind es 15 Passwörter. Diese Zahl müssen wir uns für später noch merken. Welche Passwörter ihr verwendet ist grundsätzlich egal, ich hab im Moment einfach mal ein paar Nonsense-Wörter eingetragen.Nun gehen wir zum Callback OnPlayerConnect, wo wir überprüfen ob der Spieler registriert ist und ihm dementsprechend schreiben ob er sich einloggen oder registrieren soll.
new name[MAX_PLAYER_NAME], path[128];
GetPlayerName(playerid, name, MAX_PLAYER_NAME);
format(path, 128, "/spieler/%s.ini", name);
if(dini_Exists(path)) SendClientMessage(playerid, COLOR_ORANGE, "Willkommen zurück! Logge dich bitte mit /login ein.");
else SendClientMesssage(playerid, COLOR_ORANGE, "Willkommen auf unserem Server. Du bist noch nicht registriert. Erledige das bitte mit /register.");
Das sollte es für den Moment tun. Zuerst erstellen wir den Pfad zur Spielerdatei im Userfiles-Ordner (Pfad auf jeden Fall erstellen. In diesem Fall den Ordner "spieler"!) und überprüfen dann ob eine Datei mit dem Namen des Spielers bereits existiert. Wenn ja, geben wir ihm die Nachricht zum einloggen, ansonsten zum registrieren. COLOR_ORANGE muss natürlich auch als solche definiert sein.Jetzt geht es zu den eigentlichen Commands unter OnPlayerCommandText.
if (strcmp(cmd, "/login", true) == 0)
{
new name[MAX_PLAYER_NAME], path[128];
GetPlayerName(playerid, name, MAX_PLAYER_NAME);
format(path, 128, "/spieler/%s.ini", name);
if(dini_Exists(path)) ShowPlayerDialog(playerid, login, DIALOG_STYLE_INPUT, "Bitte einloggen.", "Willkommen zurück auf unserem Server.\r\nBitte logge dich ein.", "Annehmen", "Abbrechen");
else SendClientMessage(playerid, COLOR_RED, "Du bist noch nicht registriert. Bitte erledige das mit /register.");
return 1;
}if (strcmp(cmd, "/register", true) == 0)
{
new name[MAX_PLAYER_NAME], path[128];
GetPlayerName(playerid, name, MAX_PLAYER_NAME);
format(path, 128, "/spieler/%s.ini", name);
if(!dini_Exists(path)) ShowPlayerDialog(playerid, register1, DIALOG_STYLE_INPUT, "Registrierung.", "Willkommen auf unserem Server.\r\nBitte gib hier dein gewünschtes Passwort ein (nachträglich änderbar).", "Weiter", "Abbrechen");
else SendClientMessage(playerid, COLOR_RED, "Du bist bereits registriert. Bitte logge dich mit /login ein");
return 1;
}if (strcmp(cmd, "/pwändern", true) == 0)
{
if(GetPVarInt(playerid, "loggedin") == 1)
{
ShowPlayerDialog(playerid, pwchange, DIALOG_STYLE_INPUT, "Passwort ändern", "Bitte gebe hier dein gewünschtes neues Passwort ein.", "Annehmen", "Abbrechen");
}
else SendClientMessage(playerid, COLOR_RED, "Du bist nicht eingeloggt.");
return 1;
}
Wie ihr seht habe ich gleich alle 3 Commands die wir brauchen werden eingetragen. Kurze Erklärung zu den einzelnen:
/login - Der Pfad der Spielerdatei wird gesucht. Wenn er existiert, wird der Dialog zum Login aufgerufen, ansonsten der Verweis auf /register.
/register - Der Pfad der Spielerdatei wird gesucht. Wenn er nicht existiert, wird der Dialog zum Register aufgerufen, ansonsten der Verweis auf /login.
/pwändern - Es wird überprüft ob der Spieler eingeloggt ist (Durch PVar, welche später beim Login gesetzt wird). Wenn dem so ist, wird der Login zum Passwortändern aufgerufen.Das war es zum leichten Teil. Nun kommen die Dialogabfragen. Anfangen tun wir diesmal auch mit dem Login. Wir setzen den Code in OnDialogResponse.
new name[MAX_PLAYER_NAME], path[128];
GetPlayerName(playerid, name, MAX_PLAYER_NAME];
format(path, 128, "/spieler/%s.ini", name);
if(dialogid == login && response)
{
new pw[256];
pw = dini_Get(path, "PW");
if(strcmp(pw, inputtext)) SendClientMessage(playerid, COLOR_RED, "Das eingegebene Passwort ist falsch.");
else
{
SetPVarInt(playerid, "loggedin", 1);
// Was immer nun passieren soll
}
return 1;
}
Da wir den Pfad der Spielerdatei nun öfter benutzen, schreibe ich ihn nicht jedes Mal neu, sondern einfach lokal für das gesamte Callback.
Eigentlich ganz leicht. Zuerst überprüfen wir ob die Dialogid Login ist und eine Antwort (Button "Akzeptieren" gedrückt) gegeben wurde. Danach holen wir uns das Passwort des Spielers aus der Dini-Datei und speichern es in der Variable pw. Wenn pw und der eingegebene Text nicht gleich sind, wird die Nachricht gesendet, ansonsten wird die PVar "loggedin" auf 1 gesetzt und ihr könnt tun was immer ihr nun tun möchtet.Jetzt zu den einzelnen register-Dialogen, welche auch in OnDialogResponse gesetzt werden.
if(dialogid == register1 && response)
{
dini_Create(path);
dini_Set(path, "PW", inputtext);
ShowPlayerDialog(playerid, register2, DIALOG_STYLE_LIST, "Geheime Frage auswählen", "Wie ist der Name deiner Mutter?\r\nWie heißt dein Haustier?\r\nWo bist du geboren?", "Weiter", "Abbrechen");
return 1;
}if(dialogid == register2)
{
if(!response) dini_Remove(path);
else
{
switch(listitem)
{
case 0:
{
dini_Set(path, "Frage", "Mutter");
ShowPlayerDialog(playerid, register3, DIALOG_STYLE_INPUT, "Geheime Frage beatnworten", "Bitte beantworte nun, wie deine Mutter heißt.", "Akzeptieren", "Abbrechen");
}
case 1:
{
dini_Set(path, "Frage", "Haustier");
ShowPlayerDialog(playerid, register3, DIALOG_STYLE_INPUT, "Geheime Frage beatnworten", "Bitte beantworte nun, wie dein Haustier heißt.", "Akzeptieren", "Abbrechen");
}
case 2:
{
dini_Set(path, "Frage", "Geburtsort");
ShowPlayerDialog(playerid, register3, DIALOG_STYLE_INPUT, "Geheime Frage beatnworten", "Bitte beantworte nun, was dein Geburtsort ist.", "Akzeptieren", "Abbrechen");
}
}
}
return 1;
}if(dialogid == register3)
{
if(!response) dini_Remove(path);
else
{
dini_Set(path, "Antwort", inputtext);
SendClientMessage(playerid, COLOR_GREEN, "Herzlichen Glückwunsch! Du bist nun erfolgreich auf unserem Server registriert.");
}
return 1;
}
Das sieht auf den ersten Blick vielleicht etwas wirr aus, ist aber eigentlich ganz einfach. Im ersten Teil (register1) wird die Dini-Datei erstellt und das eingegebene Passwort dort hinein geschrieben. Danach wird der Dialog register2 als ListBox geöffnet, in dem man seine geheime Frage auswählen kann (Momentan Name der Mutter, - des Haustieres und Geburtsort, natürlich beliebig erweiterbar).
Wenn dieser abgebrochen wird, wird die Dini wieder gelöscht, ansonsten wird durch einen switch die Frage (oder zumindest eine Kurzform davon) in die Dini gespeichert und gleichzeitig der neue Dialog gestartet.
Wenn dieser abgebrochen wird, wird die Dini natürlich auch wieder gelöscht. Falls nicht, wird die Antwort auch in die Dini geschrieben und die Nachricht, dass man nun erfolgreich registriert ist, wird wiedergegeben.Nun fehlt es uns eigentlich nurnoch an 2 Dialogen, dann sind wir fertig. Das ist einmal der Dialog für das vergessene Passwort und zum Ändern des Passwortes.
if(dialogid == lostpw && response)
{
new answer[256];
answer = dini_Get(path, "Antwort");if(!strcmp(answer,inputtext))
{
dini_Set(path, "PW", lostpws[random(15)]);
new string[128], pw[256];
pw = dini_Get(path, "PW");
format(string, 128, "Dir wurde das Passwort \"%s\" zugeteilt. Ändere dies bitte nach dem Login mit /pwändern.", pw);
SendClientMessage(playerid, COLOR_GREEN, string);
}
else SendClientMessage(playerid, COLOR_RED, "Deine Antwort war nicht korrekt.");
return 1;
}
Hier läuft das ganze eigentlich auch recht einfach ab. Beim vergessenen Passwort wird zuerst die Antwort aus der Dini geladen und überprüft, ob sie mit der eingegebenen Antwort übereinstimmt. Ansonsten wird eine Nachricht ausgegeben. Wenn dem allerdings der Fall ist, dann wird aus dem Array lostpws den wir oben ja mit unseren Passwörtern definiert haben ein zufälliges von der Zahl 1-15 rausgepickt. Deshalb sollten wir uns die 15 merken. Wenn ihr 20 Passwörter eintragt, müsst ihr dies nämlich auf 20 ändern. Dieses Passwort wird in der Dini gespeichert und danach abgefragt. Wenn das Speichern nicht geklappt haben sollte, steht nun nochmal das alte Passwort da, das ja noch in der Dini eingetragen wäre.if(dialogid == pwchange && response)
{
new string[128];
dini_Set(path, "PW", inputtext);
format(string, 128, "Dein Passwort wurde erfolgreich auf \"%s\" geändert.", inputtext);
SendClientMessage(playerid, COLOR_GREEN, string);
return 1;
}
Nun, das ist wohl der leichteste Dialog. Zuerst wird das neue Passwort gespeichert, dann die Nachricht formatiert und dem Spieler gesendet.
Achtung: Die Passwörter werden unverschlüsselt gespeichert und deshalb von Hackern oder Leuten mit Zugriff auf den Server einsehbar. Wenn ihr Sicherheit wollt, müsst ihr noch MD5-Crypt o. andere Verschlüsselungsverfahren einbauen.
MD5: http://www.file-upload.net/download-3726477/md5.inc.html
Whirlpool: http://forum.sa-mp.com/showthread.php?t=65290
(Danke an Dudalus für die Links )Das war es dann schon mit dem Tutorial. Ich hoffe es hat euch gefallen, geholfen und wenn ja- empfehlt es gerne weiter
Mit freundl. Grüßen
Padarom -
Hallo,
ich habe ein kleines Problem, bei einem Menü auf meinem Server. Wenn man den Server betritt, wird mit Textdraws ein Menü angezeigt, welches drei Auswahlmöglichkeiten bietet. Man soll zwischen den einzelnen Menüpunkten mit den Pfeiltasten umherwechseln können (wobei die jeweilige Überschrift ein Outline bekommt, und von der aktuellen das Outline abgenommen wird). Mein Problem ist allerdings, dass mit einem Druck auf die Pfeiltasten nichts passiert. Könnte das womöglich daran liegen, dass diese (oder das Callback OnPlayerUpdate) bei der ClassSelection nicht auf-/abgerufen werden?
Hier der Code:
public OnPlayerUpdate(playerid)
{
GetPlayerKeys(playerid,Keys[playerid],ud[playerid],lr[playerid]);
if (Menu[playerid] != 0)
{
if (ud[playerid] > 0)
{
if (Menu[playerid] == 1)
{
Menu[playerid] = 2;
TextDrawSetOutline(Welcomesz, 1);
TextDrawSetOutline(Welcomese, 0);
}
if (Menu[playerid] == 2)
{
Menu[playerid] = 3;
TextDrawSetOutline(Welcomesd, 1);
TextDrawSetOutline(Welcomesz, 0);
}
}else if (ud[playerid] < 0)
{
if (Menu[playerid] == 3)
{
Menu[playerid] = 2;
TextDrawSetOutline(Welcomesz, 1);
TextDrawSetOutline(Welcomesd, 0);
}
if (Menu[playerid] == 2)
{
Menu[playerid] = 1;
TextDrawSetOutline(Welcomese, 1);
TextDrawSetOutline(Welcomesz, 0);
}
}
}
return 1;
}Danke für die Hilfe.
Mit freundl. Grüßen
Padarom -
Und wieso fragst du dann? Muss man nicht verstehen, oder?
Erst fragst du wie man es zur Seite macht, dann sagst du Leuten, dass das keine Hilfe war und am Ende sagst du, dass du beim alten bleibst... -
@Speedfight: Steht ja auch dabei, dass Grundwissen erwartet wird.
pain: Sollte eigentlich nicht sein, da das Fahrzeug mit ausgeschaltetem Motor auch nicht rückwärts fahren sollte.@Never: Stimmt nicht, damit wird nur die Bool-Variable auf false gesetzt, der Motor bleibt trotzdem an. Resultat: Man muss im Auto zweimal /m eingeben, damit der Motor ausgeschaltet wird.
Allgemeine Frage: Wird OnVehicleSpawn auch aufgerufen, wenn Fahrzeuge im OnGameModeInit gespawnt werden? Konnte davon im Wiki nichts finden und wäre praktischer den Motor dort auszuschalten, da man dann die Schleife (und folglich auch etwas Rechenleistung) weglassen könnte.
-
Hallo,
ich habe mal wieder eine Frage zu VB.net
Nämlich möchte ich eine Datei öffnen und dazu dann aus den ersten drei Zeilen die Informationen auslesen.
Das sind der Firmenname, der -standort und der gewünschte Liefertermin. Diese Informationen sollen dann gesplittet werden und in einen Labeltext gebracht werden. Das habe ich wie folgt gemacht:Code
Alles anzeigenWith OpenFileDialog1 .Filter = _ "Textdokumente (*.txt)|*.txt" .FileName = "Bestellung.txt" .Title = "Bestellung importieren" If .ShowDialog() = DialogResult.OK Then Dim line As String For Each line In File.ReadAllLines(.FileName) Dim parts As String() = line.Split(New Char() {","c}) If parts(0) = "Firmenname" Then Label1.Text = "Firma:" + vbNewLine + parts(1) ElseIf parts(0) = "Firmenstandort" Then Label2.Text = "Standort:" + vbNewLine + parts(1) ElseIf parts(0) = "Gewünschter Liefertermin" Then Label3.Text = "Termin:" + vbNewLine + parts(1) End If Next End If End With
Ursprünglich hat der Code so auch funktioniert, nachdem ich die Form dann allerdings erweitert habe (ListBox, ...) ging es auf einmal nicht mehr. Das heißt ich öffne die Datei, der Labeltext bleibt allerdings gleich.Hier der Inhalt der Datei.
ZitatFirmenname: Hotdogs
Firmenstandort: Jefferson
Gewünschter Liefertermin: Morgen
Zu liefernde Waren (Liste der Artikelnummern):
8. Sandwich mit Belag - 8$ | Anzahl: 15 | Kosten: 120$Ich hoffe ihr könnt mir erklären was ich falsch gemacht habe.
Mit freundl. Grüßen
Padaromedit:
Problem gelöst, habe ausversehen das ":" zu einem "," geändert. -
@Myfarmer: Dankeschön
@BuzZ: Also hast du dein eigenes Tanksystem? Dann musst du aber auch die Variable Tank[vehicleid] (so heißt sie bei mir) so umbenennen, dass dann die Variable in deinem Script rauskommt. Hast du also z.B. statt new Tank[MAX_VEHICLES]; new Liter[MAX_VEHICLES]; gemacht, dann musst du in der Abfrage auch Liter[vehicleid] machen.Mit freundl. Grüßen
Padarom -
Hast du bei Verlust auch einen Wert in Millisekunden eingetragen? Vielleicht hast du ja 1-2 Nullen zu viel und deswegen dauert es länger um 1 Liter zu verlieren. Oder eventuell hast du vergessen den Timer "BenzinVerlust" zu repeaten oder gar zu starten? Ansonsten wüsste ich leider nicht weiter, ich habe die Scriptbeispiele aus meinem eigenen Script (etwas abgeändert, bei mir ist das ganze komplexer gestaltet) und bei mir funktioniert alles.
-
Wenn du in Japan lebst, wüsstest du , dass es manchmal sein kann, dass es fast Wöchentlich kleinere Erbeben / Stöße gibt.
Und man sollte es doch schon wissen, wenn man es Plant, dass Japan nahe der 4 Erdplatten Aufteilungen liegt, und das es in 40 Jahren ein Erdbeben gibt.Ich lebe nicht in Japan und sage es auch nicht, außerdem weiß ich, dass in Japan des Öfteren kleine Beben sind. Aber wie Snap bereits sagte, war das Kraftwerk bis auf 8,0 ausgelegt und das sollte eigentlich auch reichen, denn wie gesagt: NIEMAND kalkuliert ein Erdbeben der Stärke 9 ein, vorallem nicht vor 40 Jahren.