Beiträge von Simon
-
-
Ich möchte ein Login-System machen. Dazu habe ich eine Klasse User, die ist aktuell noch ziemlich leer.
Aufjedenfall soll für jeden eingeloggten Client ein Objekt User erstellt werden, in welchem dann Daten verwaltet werden (Level, Geld, etc). Ich kann dann mit Hilfe des Objektes auf die Daten zugreifen.Ich muss nun aber jedem User-Objekt einem Client zuweisen.
Deswegen wollte ich eine Liste von allen User-Objekten machen, welche einem Client zugewiesen sind.
Sobald ein Event/Command aufgerufen wird, kann ich dann mit Hilfe des Clients das User-Objekt finden und die Daten lesen/schreiben.Es wäre sehr einfach, wenn es in irgendeiner Form (Am besten numerisch) eine ID gibt, die einen Clienten identifiziert.
Bisher habe ich eine sortedDictonaryList<Client,User>. Das Problem ist, das die Regel zur Sortierung beim Client implementiert werden muss. Ich möchte an dieser Klasse aber nichts verändern.
Mal Beispiel-Code:
Code: User.cs
Alles anzeigenpublic class User { public int level { get; set; } public User() { } public void loadUser() { } public void updateUser() { } }
Code: Main.cs
Alles anzeigenpublic class Main : Script { SortedDictionary<Client, User> users = new SortedDictionary<Client, User>(); [RemoteEvent("OnPlayerLoginAttempt")] public void OnPlayerLoginAttempt(Client client, string username, string password) { //[...] User user = new User(); users.Add(client, user); } [Command("level")] public void SetLevel(Client client, int level) { if (users.TryGetValue(client, out User user)) { Console.WriteLine($"Level vorher: {user.level}"); user.level = level; Console.WriteLine($"Level nachher: {user.level}"); } } }
Fehlermeldung: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.ArgumentException: At least one object must implement IComparable.
-
-
Also es gibt ja nicht so ein Event wie in SA:MP, welches aufgerufen wird, wenn sich der state vom Spieler ändert, zum Beispiel von Fußgänger auf Beifahrer oder Fahrer.
An deiner Stelle würde ich einen Timer machen, der bei jeden aufruf alle Spieler durchgeht und den aktuellen Fahrzeug-Sitz abfragt und diesen Speichert.
Du vergleichst einfach den vorherigen Wert (zum Beispiel -1 = Fußgänger) mit dem neuen Wert(zum Beispiel 0 = Fahrer oder 1 = Beifahrer) und löst dann ein event aus welches dir den newstate und oldstate angibt. so weiß du, ob er vom Beifahrersitz auf Fahrersitz gewechselt hat.
-
wenn du /getdoor eingibst, hast du deine maus, mit der du über objekte "hovern" kannst.
Wenn diese leicht transparent werden, kannst du durch einen klick diese registrieren und anschließend mit /setdoorstate öffnen.
Das was in der Ressource geschieht bei den Befehlen /getdoor und /setdoorstate, müsstest du quasi nur nachbauen. Habs selber aber noch nicht gemacht.
Es gibt aber eine Liste mit vielen türen und deren Position im GTA:N Forum. dort kannst du mal schauen.
Aber vermutlich hast du das alles richtig gemacht und es liegt an anderen Fehlern, wie zum Beispiel die Vermutung von toor. Da ist mein wissen aber derzeit am Ende.
-
Hast du zuvor mal nur über die resource mit /getdoor und /setdoorstate zur Laufzeit die Türen geöffnet?
Eventuell ist die Position nicht ganz richtig.
-
-
-
-
Es ist lange her, dass ich aktiv HTML gemacht habe, aber wenn ich mich recht erinnere, braucht man eine Form, damit mein klicken auf den Button auch etwas ausgelöst wird.
Bin mir an dieser Stelle nicht sicher und lasse mich gerne korrigieren.
Aber aufjedenfall schadet es nicht. Ich hatte wie bereits erwähnt genau dieses Problem, wie du es jetzt hast: es ist einfach gar nichts passiert. Bis ich die erwähnten Änderungen vorgenommen habe.
Was ich auch gemacht habe: ich habe mir an geeigneten Stellen Debug Meldungen ausgegeben und nach und nach Code auskommentiert, umzu schauen ob überhaupt die Funktion aufgerufen wird.
In der HTML Datei habe ich in den Javascript funktionen, die durch den Button-Klick aufgerufen werden, einfach mal alerts ausgegeben und dies im Browser getestet (alert bringt den client zum crashen).
Du solltest ähnlich vorgehen, um zu schauen ob die Funktionen im Browser aufgerufen werden und um zu schauen ob inGame deine Clientside Funktionen im Script aufgerufen werden.
-
Eine Liste findest du hier
Wie genau muss ich mir die interiors denn vorstellen?Sind die geladenen Interiors dann wie in Samp ein in sich geschlossender Raum, in den man den Spieler teleportieren muss oder so wie mit dem Amnunations einfach ein Raum hinter einer Tür, die man mit Hilfe vom doormanager öffnen muss.
-
Hallo,
ich habe eine ganz allgemeine Frage zum Thema Interiors:
Wie funktioniert der ganze Kram.
Ich habe bisher folgendes herausgefunden:
Es gibt Türen, dessen state man ändern kann. Dazu muss man diese Tür wohl erst registrieren und den status der registrierten Tür durch Angabe der ID ändern.
Standardmäßig sind die Türen abgeschlossen und zu, mann kann sie aufschließen, so dass sie sich bewegen wenn man dagegen läuft (man kommt ins interior rein) und man kann von anfang an sogar die Tür auf einen bestimmten "Stand" bringen, z.B.: halb geöffnet oder komplett geöffnet.Es gibt Interiors, sogenannte IPLs. Was genau die Abkürzung bedeutet weiß ich nicht. Aufjedenfall gibt es da jede Menge und da hört mein Wissen auf. Die paar zugehörigen Funktionen, die ich im wiki gefunden habe, geben mir leider keine weitere Auskunft.
Wenn sich da jemand mit auskennt, würde ich gerne wissen, wie das alles funktioniert. Ich brauche keine Lösung mit Beispiel, sondern nur eine Erklärung.
Bei SA:MP war es ja so: Interiors hatten eine Interior-ID und Koordinaten. Um den Spieler da hin zu bringen, musste man einfach die Position und das Interior setzen.
Das ganze scheint mit bei GTA:N etwas komplizierter, da man ja auch wie bereits erwähnt diese Türen hat, die sich durch anpassen des Status beweglich machen und dahinter sich direkt das "Interior" befindet, ohne das man teleporiert wird. Bei anderen Eingängen, so kenne ich es aus Singleplayer/Online-Modus, da kommt eine kleine Sequenz und nach kurzer Ladezeit war man dann in einem Gebäude drinne. -
Ich hatte ähnliche Probleme.
Bei mir war das das Login/Register System. Ich habe mir da eine <From> mit HTML anzeigen lassen und durch Button-Klicks Javascript Funktionen aufgerufen, die wiederum Client-Side Funktionen im Script ausführen.
Bei mir ist oftmals jedoch gar nichts passiert.
Das Problem habe ich gelöst, indem ich mich streng an die HTML vorgaben gehalten habe.
Also meine Frage: Wie genau ist deine HTML-Datei aufgebaut?
Sie müsste so aufgebaut sein:HTML
Alles anzeigen<html> <head> <title>Title</title> <script> Javascript </script> </head> <body> <element>...</element> </body> </html>
Anschließend ging es bei mir wunderbar.
Außerdem habe ich noch Probleme mit den Parametern gehabt, die ich an das Script übergeben habe.
So musste ich Username und Passwort an das Script übergeben, um dann eine Datenbank abfrage zu machen:
JavaScriptvar Username = document.getElementById("username").value; var Password = document.getElementById("password").value; ressourceCall function(Username, Password);
Damit gab es komischerweise Probleme. Habe es geändert in:
-
Sehr schön, genau so eine Antwort habe ich gesucht.
Ich bedanke mich
-
Wenn ich ein Textdraw anklickbar machen möchte, muss ich auch die anklickbare fläche dafür definieren.
Angenommen ich habe ein Button: Dann habe ich ein Text und eine Box umzu, und alles inerhalb der Box kann angeklickt werden.
Ich bin nach dem wiki vorgegangen und habe die Box so definiert, sie wird mir auch richtig angezeigt. Jedoch ist die klickbare Fläche nicht die, die ich definiert habe.
Von Links nach Rechts betrachtet stimmt alles. alles über dem Textdraw stimmt auch, nur alles unter dem Textdraw ist anklickbar, welches nicht so sein sollte.
Nun habe ich 2 neue TextDraws, wo mir keine Box angezeigt werden soll, jedoch muss die größe der Box ebenfalls definiert werden. Wenn ich sie nun genauso definiere wie vorher, dann habe ich das selbe Problem wie bei den vorherigen Textdraws.
Außerdem ist das eine Textdraw zentriert, weshalb man da auch noch etwas beachten muss, woraus ich jedoch aus dem wiki nicht ganz schlau werde. Man muss da X und Y vertauschen, gleichzeitig wird aber gesagt, das X quasi die Breite und Y die Höhe ist, was ja logisch ist. nur in wiefern muss ich X und Y vertauschen? breite (x) und höche(y) werden zu breite(y) und höhe(x) ? Und selbst dann werde ich sicherlich wieder das oben beschriebene Problem haben.
Mal eine Grafik im Anhang, Grün bedeutet nicht klickbar also in Ordnung. Rot bedeutet klickbar, obwohl nicht in der klickbaren Fläche.
-
Hallo,
Textdraws waren nie meine stärke. Ich brauche Hilfe bei der klickbaren Fläche von Textdraws.
Ich weiß das man dazu die TextSize verändern muss, Es ist quasi die Box die da wäre, wenn man diese aktiviert.
Jedoch haut das bei mir nicht ganz so hin.
Wie genau sollte ich da am besten vorgehen. Ich habe ein TextDraw, welches Zentriert ist und eins, welches Linksbündig ist.
Ich habe 2 andere Textdraws, bei denen ich durch langes probieren eine einigermaßen passende Fläche hatte. die Breite passt, nur die Höhe passt nicht ganz:
Zwar beginnt die Fläche bei beiden an richtiger Stelle (von oben nach unten gehend) aber alles unterhalb des Textdraws und innerhalb der breite ist auch klickbar.
Auch bei diesen beiden hat das mit der Box nicht so ganz hingehauen, die nebenbei gesagt sogar angezeigt wird.Bevor ich nun bei meinen Hauptproblem, dem zentrierten und dem linksbündigen rumprobiere und die selbe Lösung bekomme, würde ich gerne nochmal Hilfe dazu bekommen, um die 2 ungefär passenden Textdraws zu korrigieren, und es direkt richtig zu machen.
Vielen Dank
-
Gibt es bereits bekannte Möglichkeiten eine GangZone bewegen zu lassen?
Mir würde jetzt spontan nur das Zerstören und neu erstellen in kurzen Zeitabständen einfallen.
-
public OnVehicleMod(playerid, vehicleid, componentid){ if(GetPlayerInterior(playerid) >= 1 && GetPlayerInterior(playerid) <= 3) { switch(componentid) { case 1024: GivePlayerMoney(playerid, -50); case 1006: GivePlayerMoney(playerid, -80); case 1004, 1145, 1013, 1091, 1086: GivePlayerMoney(playerid, -100); case 1005, 1143, 1022, 1035, 1088: GivePlayerMoney(playerid, -150); case 1021, 1009, 1002, 1016, 1068, 1153: GivePlayerMoney(playerid, -200); case 1011: GivePlayerMoney(playerid, -220); case 1012, 1020, 1003, 1067: GivePlayerMoney(playerid, -250); case 1019: GivePlayerMoney(playerid, -300); case 1018, 1023, 1093: GivePlayerMoney(playerid, -350); case 1014, 1000: GivePlayerMoney(playerid, -400); case 1163, 1090, 1070: GivePlayerMoney(playerid, -450); case 1008, 1007, 1017, 1015, 1044, 1043, 1036: GivePlayerMoney(playerid, -500); case 1045: GivePlayerMoney(playerid, -510); case 1001, 1158, 1069, 1164: GivePlayerMoney(playerid, -550); case 1050, 1058, 1097: GivePlayerMoney(playerid, -620); case 1162, 1089: GivePlayerMoney(playerid, -650); case 1028, 1085: GivePlayerMoney(playerid, -770); case 1122, 1106, 1108, 1118: GivePlayerMoney(playerid, -780); case 1134: GivePlayerMoney(playerid, -800); case 1082: GivePlayerMoney(playerid, -820); case 1064, 1133: GivePlayerMoney(playerid, -830); case 1165, 1167, 1065: GivePlayerMoney(playerid, -850); case 1175, 1177, 1172, 1080: GivePlayerMoney(playerid, -900); case 1100, 1119, 1192: GivePlayerMoney(playerid, -940); case 1173, 1161, 1166, 1168: GivePlayerMoney(playerid, -950); case 1010, 1149, 1176, 1042, 1136, 1025, 1096, 1174: GivePlayerMoney(playerid, -1000); case 1155, 1154: GivePlayerMoney(playerid, -1030); case 1160, 1159: GivePlayerMoney(playerid, -1050); case 1150: GivePlayerMoney(playerid, -1090); case 1193, 1073: GivePlayerMoney(playerid, -1100); case 1190, 1078: GivePlayerMoney(playerid, -1200); case 1135, 1087: GivePlayerMoney(playerid, -1500); case 1083, 1076: GivePlayerMoney(playerid, -1560); case 1179, 1184: GivePlayerMoney(playerid, -2150); case 1046: GivePlayerMoney(playerid, -710); case 1152: GivePlayerMoney(playerid, -910); case 1151: GivePlayerMoney(playerid, -840); case 1054: GivePlayerMoney(playerid, -210); case 1053: GivePlayerMoney(playerid, -130); case 1049: GivePlayerMoney(playerid, -810); case 1047: GivePlayerMoney(playerid, -670); case 1048: GivePlayerMoney(playerid, -530); case 1066: GivePlayerMoney(playerid, -750); case 1034: GivePlayerMoney(playerid, -790); case 1037: GivePlayerMoney(playerid, -690); case 1171: GivePlayerMoney(playerid, -990); case 1148: GivePlayerMoney(playerid, -890); case 1038: GivePlayerMoney(playerid, -190); case 1146: GivePlayerMoney(playerid, -490); case 1039: GivePlayerMoney(playerid, -390); case 1059: GivePlayerMoney(playerid, -720); case 1157: GivePlayerMoney(playerid, -930); case 1156: GivePlayerMoney(playerid, -920); case 1055: GivePlayerMoney(playerid, -230); case 1061: GivePlayerMoney(playerid, -180); case 1060: GivePlayerMoney(playerid, -530); case 1056: GivePlayerMoney(playerid, -520); case 1057: GivePlayerMoney(playerid, -430); case 1029: GivePlayerMoney(playerid, -680); case 1169: GivePlayerMoney(playerid, -970); case 1170: GivePlayerMoney(playerid, -880); case 1141: GivePlayerMoney(playerid, -980); case 1140: GivePlayerMoney(playerid, -870); case 1032: GivePlayerMoney(playerid, -170); case 1033: GivePlayerMoney(playerid, -120); case 1138: GivePlayerMoney(playerid, -580); case 1139: GivePlayerMoney(playerid, -470); case 1026: GivePlayerMoney(playerid, -480); case 1031: GivePlayerMoney(playerid, -370); case 1092: GivePlayerMoney(playerid, -750); case 1128: GivePlayerMoney(playerid, -3340); case 1103: GivePlayerMoney(playerid, -3250); case 1183: GivePlayerMoney(playerid, -2040); case 1182: GivePlayerMoney(playerid, -2130); case 1181: GivePlayerMoney(playerid, -2050); case 1104: GivePlayerMoney(playerid, -1610); case 1105: GivePlayerMoney(playerid, -1540); case 1126: GivePlayerMoney(playerid, -3340); case 1127: GivePlayerMoney(playerid, -3250); case 1185: GivePlayerMoney(playerid, -2040); case 1180: GivePlayerMoney(playerid, -2130); case 1178: GivePlayerMoney(playerid, -2050); case 1123: GivePlayerMoney(playerid, -860); case 1125: GivePlayerMoney(playerid, -1120); case 1130: GivePlayerMoney(playerid, -3380); case 1131: GivePlayerMoney(playerid, -3290); case 1189: GivePlayerMoney(playerid, -2200); case 1188: GivePlayerMoney(playerid, -2080); case 1187: GivePlayerMoney(playerid, -2175); case 1186: GivePlayerMoney(playerid, -2095); case 1129: GivePlayerMoney(playerid, -1650); case 1132: GivePlayerMoney(playerid, -1590); case 1113: GivePlayerMoney(playerid, -3340); case 1114: GivePlayerMoney(playerid, -3250); case 1117: GivePlayerMoney(playerid, -2040); case 1115: GivePlayerMoney(playerid, -2130); case 1116: GivePlayerMoney(playerid, -2050); case 1109: GivePlayerMoney(playerid, -1610); case 1110: GivePlayerMoney(playerid, -1540); case 1191: GivePlayerMoney(playerid, -1040); case 1079: GivePlayerMoney(playerid, -1030); case 1075: GivePlayerMoney(playerid, -980); case 1077: GivePlayerMoney(playerid, -1620); case 1074: GivePlayerMoney(playerid, -1030); case 1081: GivePlayerMoney(playerid, -1230); case 1084: GivePlayerMoney(playerid, -1350); case 1098: GivePlayerMoney(playerid, -1140); } } return 1;}
Hatte ich noch hier, ich weiß dennoch nicht wer die Liste erstellt hatte (bin mir sicher das ich sie nicht erstellt habe :'d).Danke, sowas hatte ich gesucht.
Bin nun aber gleichzeitig auch fündig geworden.
-
Es gibt etwa 200 Komponennten. Viele Fahrzeuge teilen sich die selben Komponenten, aber nun nicht alle.
Ich müsste für jedes Fahrzeug die Komponennten alle durchgehen und die Preise rausschreiben.Ist an sich kein Problem, jedoch würde das warscheinlich ewig dauern.
Daher die Frage, ob es eine preisliste gibt.
Ich muss leider für jede Komponennte den Preis wissen, da das Geld vom Server anders verwaltet wird. Ich muss also den Betrag, der abgezogen wird beim Tuning, anders verwalten.
Am einfachsten ist das, wenn die Preise vorab bekannt sind. -
Gibt es eine existierende Liste für die Tuning-Komponennten und den dazugehörigen Preisen?
Ich weiß von der offiziellen Liste der Komponennten, wobei dort jedoch keine Preise angegeben sind. Diese sind jedoch sehr wichtig für mich.