Hast du auch das http Package requiret? Versuch mal innerhalb der loginUser Funktion ein paar Logs zu platzieren und guck wo es stehen bleibt.
Beiträge von LeonMrBonnie
-
-
JavaScript
Alles anzeigenmp.events.add("sendDataToServer", (player, username, password, state) => { let loggedAccount = mp.players.toArray().find(p => p.loggedInAs == username); switch(state){ //Account Login case 0: { if(loggedAccount){ console.log("Logged in already."); player.call("loginHandler", ["logged"]); } else { function loginUser(username, password, callback) { if(!username || !password || typeof callback !== "function") return console.error(`loginUser was called with invalid parameters`); // Die angegeben Parameter sind falsch http.get({ host: `${apiHost}`, path: `/index.php?user-api&method=login&username=${username}&password=${password}&secret=${apiSecret}`, // Die Daten des Users werden in die URL geschrieben headers: { 'User-Agent': 'Projekt Reallife Agent 1.0.0' } }, (response) => { let status = response.statusCode; if(status !== 200) // Die Antwort war nicht 200, also ist irgendwas schief gelaufen { response.resume(); // Den Rest der Anfrage verarbeiten, damit kein Memory Overflow entsteht callback({ Status: status, Error: "The server did not respond with 200 - OK" }); } else { let data = ""; response.on('data', (chunk) => { data += chunk; }); response.on('end', () => { let parsed = JSON.parse(data); callback(null, { id: parsed.userID, email: parsed.email, groups: parsed.groups }); }); } }); } loginUser(username, password, (error, data) => { console.log(JSON.stringify(data)); if(error) { if(error.Status === 412) return player.call("loginHandler", ["incorrectinfo"]); // Falscher Name/Passwort else return console.log(error.Error); // Bei einem Error sind keine Daten vorhanden, also muss returnt werden, damit der 2. Parameter nicht verwendet wird } if(data.groups.find(group => group.groupID === 6)) { player.name = username; player.call("loginHandler", ["success"]); gm.auth.loadAccount(player); } else { player.call("loginHandler", ["incorrectinfo"]); } }); } break; } //Account Registration case 1: { if(username.length >= 3 && pass.length >= 5){ gm.mysql.handle.query('SELECT * FROM `accounts` WHERE `username` = ?', [username], function(err, res){ if(res.length > 0){ player.call("loginHandler", ["takeninfo"]); } else { bcrypt.hash(pass, function(err, hash) { if(!err){ gm.mysql.handle.query('INSERT INTO `accounts` SET username = ?, password = ?', [username, hash], function(err, res){ if(!err){ player.name = username; console.log("\x1b[92m" + username + "\x1b[39m has just registered."); } else { console.log("\x1b[31m[ERROR] " + err) } }); } else { console.log("\x1b[31m[BCrypt]: " + err) } }); } }); } else { player.call("loginHandler", ["tooshort"]); } break; } default: { player.outputChatBox("An error has occured, please contact your server administrator.") console.log("\x1b[31m[ERROR] Login/Register state was one that isn't defined. State: " + state) break; } } });Versuch mal die Daten stringified zu printen. Dazu hast du auch statt dem data Parameter parsed verwendet, die Variable ist aber nur innerhalb der Funktion.
-
was zahlt man für ein ucp
Geld.
Komplett unterschiedlich abhängig von den Features, die Frage ist wie viel du bereit bist auszugeben. -
-
Hat keiner bestritten, nur sind die Fragen etwas dumm.
Statt den Threadersteller hier dumm von der Seite anzumachen kannst du es auch einfach komplett ignorieren oder du hilfst ihm. Deine Beiträge bringen hier niemanden auch nur ansatzweise weiter.
Wie vorher gefragt;
Wenn du selber eins erstellen willst, hast du schon Vorerfahrung? Weißt du was es können soll?
Wenn du eins kaufen willst, wie viel möchtest du maximal ausgeben? -
Ein Becks - ~1,25
-
Der Server brauch wahrscheinlich eine MySQL Datenbank, nicht eine SQLite Datenbank. Deswegen funktioniert es auch nicht.
Du kannst mit Programmen wie WAMP, XAMPP oder MAMP (ja die heißen echt so) einen MySQL Server lokal aufsetzen. -
JavaScript
Alles anzeigenconst apiHost = "https://testseite.de"; const apiSecret = "SECRET123"; function loginUser(username, password, callback) { if(!username || !password || typeof callback !== "function") return console.error(`loginUser was called with invalid parameters`); // Die angegeben Parameter sind falsch http.get({ host: `${apiHost}`, path: `/index.php?user-api&method=login&username=${username}&password=${password}&secret=${apiSecret}`, // Die Daten des Users werden in die URL geschrieben headers: { 'User-Agent': 'Projekt Reallife Agent 1.0.0' } }, (response) => { let status = response.statusCode; if(status !== 200) // Die Antwort war nicht 200, also ist irgendwas schief gelaufen { response.resume(); // Den Rest der Anfrage verarbeiten, damit kein Memory Overflow entsteht callback(`Request failed. Server responded with status code ${status}`); } else { let data = ""; response.on('data', (chunk) => { data += chunk; }); response.on('end', () => { let parsed = JSON.parse(data); callback(null, { id: parsed.userID, email: parsed.email, groups: parsed.groups }); }); } }); }Der erste Parameter des Callbacks ist der Fehler, falls keiner vorhanden ist, ist dieser null. Der zweite Parameter sind die empfangenen Daten.
Du nutzt es also so: -
Guten Morgen!
Da kein Problem mit dem Keybinder an sich vorlag. Dieser Funktioniert einwandfrei. Es lag lediglich daran, dass SAMP AC installiert warUnd? Vielleicht haben andere genau die gleiche Frage. Es bringt niemanden weiter seine Fragen zu löschen. Wenn es dir zu peinlich ist, dass du eine Frage gestellt hast, dann frag garnicht erst.
-
Du erweiterst die Funktion um 2 Parameter, Name und Passwort, dann kannst du mit diesen Variablen die URL für die Anfrage zusammensetzen. Da es eine HTTP Anfrage ist, würd es sich auch lohnen Promises zu verwenden. (Async/await) Dann kannst du das Callback weglassen. Ist aber natürlich deine Entscheidung ob du den klassischen Callbackstil von NodeJS verwendest oder es mit einer modernen Methode (Promises) machst.
-
Warum verbindest du dich nicht einfach zum MySQL Server des Forums auf deinem NodeJS Server? Wenn der Gameserver vom Forum abhängig ist, sorgt das eher für Probleme. (Forum Mal down = Niemand kann sich auf dem Server einloggen)
Auch sendest du dann dort Name und Passwort des Nutzers nicht nur von Client zu Server sondern nochmal weiter übers Internet zu einem weiteren Server. Stichwort: Datensicherheit -
https://wiki.rage.mp/index.php?title=Marker::Marker
Codelet marker = mp.markers.new(0, new mp.Vector3(0.0, 0.0, 0.0), 1); // Im Key Handler für E if(mp.game.system.vdist(mp.players.local.position.x, mp.players.local.position.y, mp.players.local.position.z, marker.position.x, marker.position.y, marker.position.z) < 2.5) mp.events.callRemote("markerPosition"); -
Mit mp.keys.bind einen neuen Handler für die E-Taste setzen, in diesem Handler fragst du ab ob der Spieler in der Nähe von dem Marker ist, wenn ja dann teleportierst du den Spieler in das Interior. (mp.keys.bind ist clientside, und das teleportieren machst du serverside)
-
Du installierst es einfach ganz normal für GTA V und dann funktioniert es automatisch in RageMP.
-
-
-
Eine Weitere Frage ist, wie kann ich für alle Spieler zum beispiel eine schranke rotieren lassen, so dass es jeder spieler sieht, hab schon etwas bei Natives gefunden aber das wäre ja nur Client side (nur für den spieler der das ausführt
Das ist auch nur Serverside möglich, du musst es selber synchronisieren indem du es bei allen Spielern abspielen lässt.
-
Ohne 1. Richtig geiles Team 2. Richtig geiles Script und 3. Viel Innovation, wirst du leider keinen guten Server mehr aufbauen können.
-
Wie hast du Textdraw0-Textdraw13 definiert?
-
Das könnte bei dir der Fehler sein. Es gibt Tools die dir deine verbundenen Grafikkarten mit genauen Informationen anzeigen, google mal und lad dir davon eins runter und guck ob deine GTX 880 überhaupt erkannt wird.