[Sammelthema] Objektorientierte Programmierung (OOP)

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • @MasterM:

      Wenn ich triggerClientEvent so verwende, bekomme ich einen Game-Crash.

      Crashdump und Schritte zum Reproduzieren bitte. Ein Gamecrash sollte da niemals auftreten.

      Die Lösung für dein Problem ist vermutlich deinen Startprozess in onResourceStart auszulagern. onResourceStart wird erst aufgerufen, wenn alle Skripte geladen sind.
      Mich per PN bezüglich Freischaltungen zu nerven ist der beste Weg eine Freischaltung zu verhindern.

      neon-gaming.de
    • @sbx320: Danke für dein Feedback. Luxorion hat sich das mal angeschaut, es lag daran das ich von einer neuen, registrierten Spielerklasse (also mit registerElementClass) ein Event nach self triggern wollte, was von self kommt. Wir haben einfach das zweite self durch rootElement ersetzt und die normale Spieler Klasse um meine Methoden ersetzt, jetzt geht es. Mittlerweile macht das auch Sinn, aus irgendeinem Grund wollte ich die metatabellen mit dem self triggern, was ja leider nicht geht.
    • Guten Tag,
      Ich habe folgendes Problem ich sitze gerade vor eine Checkbox Klasse und komm nicht weiter. Ersteinmal hier ist das Klassensystem:

      LUA-Quellcode

      1. dxCheckbox = {}
      2. function dxCheckbox:createCheckBoxInstanz ()
      3. local self = setmetatable({},{__index = self})
      4. self.sel = {}
      5. self.sel = false
      6. self.activ = true
      7. self.visible = true
      8. self.selectedCheckbox = 0
      9. self.click = function(key,state) self:onCheckboxClick(key,state) end
      10. self.render = function() self:onCheckboxRender() end
      11. addEventHandler("onClientClick",getRootElement(),self.click)
      12. addEventHandler("onClientRender",root,self.render)
      13. return self
      14. end
      15. function dxCheckbox:createNewCheckbox(id,x,y,text,r,g,b,a)
      16. self.sel = {}
      17. local i = id
      18. self.sel[i] = {}
      19. self.sel[i]["text"] = text
      20. self.sel[i]["x"] = gx*(x/gpx)
      21. self.sel[i]["y"] = gy*(y/gpy)
      22. self.sel[i]["w"] = 20
      23. self.sel[i]["h"] = 20
      24. self.sel[i]["r"] = r
      25. self.sel[i]["g"] = g
      26. self.sel[i]["b"] = b
      27. self.sel[i]["a"] = a
      28. end
      29. function dxCheckbox:onCheckboxClick(key,state)
      30. if self.activ then
      31. if state == "down" then
      32. for i,pi in ipairs(self.sel) do
      33. if getCursorArea(self.sel[i]["x"],self.sel[i]["y"],self.sel[i]["w"],self.sel[i]["h"]) then
      34. self.selectedCheckbox = i
      35. end
      36. end
      37. end
      38. end
      39. end
      40. function dxCheckbox:onCheckboxRender()
      41. if self.activ then
      42. if self[id] == false then return end
      43. for i,pi in ipairs(self.sel) do
      44. dxDrawRectangle(self.sel[i]["x"],self.sel[i]["y"],self.sel[i]["w"],self.sel[i]["h"],tocolor(self.sel[i]["r"],self.sel[i]["g"],self.sel[i]["b"],self.sel[i]["a"]))
      45. dxDrawText(self.sel[i]["text"],self.sel[i]["x"]+self.sel[i]["w"]+2,self.sel[i]["y"]+2,self.sel[i]["w"],self.sel[i]["h"],tocolor(255,255,255,255),1,"default-bold")
      46. if i == self.selectedCheckbox then
      47. dxDrawLine(self.sel[i]["x"],self.sel[i]["y"],self.sel[i]["x"]+self.sel[i]["w"],self.sel[i]["y"]+self.sel[i]["h"],tocolor(255,255,255,255))
      48. dxDrawLine(self.sel[i]["x"],self.sel[i]["y"]+self.sel[i]["h"],self.sel[i]["x"]+self.sel[i]["w"],self.sel[i]["y"],tocolor(255,255,255,255))
      49. end
      50. end
      51. end
      52. end
      53. function dxCheckbox:getSelectedCheckbox()
      54. return self.selectedCheckbox
      55. end
      Alles anzeigen


      Wenn ich nur eine Checkbox habe dann klappt es aber wenn ich dann zwei habe dann klappts net.

      LUA-Quellcode

      1. local checkbox = dxCheckbox:createCheckBoxInstanz()
      2. checkbox:createNewCheckbox(1,509, 300,"HallO",0,0,0,255)
      3. checkbox:createNewCheckbox(2,509, 340,"Hallo2",0,0,0,255)
    • Normalerweiße sollte es so genutzt werden, dass jede Checkbox eine eigene Instanz ist. So wie du es hier nutzt, werd ich nicht so ganz schlau daraus. Vielleicht solltest du auch zur Classlib greifen. Die erleichtert das Lua pseudo OOP extremst.

      Wenn du es trotzdem so nutzen willst, fasse am besten die Methoden createNewCheckbox und createCheckBoxInstanz zusammen.
      Und nutzt es dann in etwa wie folgt:

      LUA-Quellcode

      1. local checkBox1 = dxCheckbox:createCheckBox("Ich bin die erste Checkbox", 200, 450, 100, 21, tocolor(255, 255, 255))
      2. local checkBox2 = dxCheckbox:createCheckBox("Ich bin die zweite Checkbox", 200, 500, 100, 21, tocolor(255, 255, 255))
      3. checkBox1:show() --Startet das rendern von checkBox1
      4. checkBox2:show() --Startet das rendern von checkBox2

      Lediglich als Beispiel an zu sehen.
    • Ahoi,
      irgendwie komme ich hier nicht weiter:


      LUA-Quellcode

      1. function oMySql:Insert(tabl, names, values)
      2. self.table = tabl
      3. if type(names) == "table" then
      4. for i, v in pairs(names) do
      5. self.all_names = self.all_names.."'"..v.."',"
      6. end
      7. else
      8. self.all_names = names
      9. end
      10. if type(values) == "table" then
      11. for i, v in pairs(values) do
      12. self.all_values = self.all_values.."'"..v.."',"
      13. end
      14. else
      15. self.all_values = values
      16. end
      17. local ini = dbExec(self.handler, "INSERT INTO `"..self.table.."` ("..self.all_names..") VALUES ("..self.all_values..")")
      18. if ini then
      19. outputServerLog("Erfolgreich!")
      20. end
      21. dbFree(ini)
      22. end
      23. local instanz = oMySql:Create("127.0.0.1", "poofismus", "root", "")
      24. instanz:Insert("accounts", "username", "username")
      Alles anzeigen


      Erhalte folgenden Fehler: Bad Argument @ dbFree(Expected db-query at argument 1, got boolean)

      Fehler verstehe ich soweit auch, aber irgendwie komme ich nicht auf die Lösung.

      Handler, etc. ist hier definiert:

      LUA-Quellcode

      1. oMySql = {}
      2. function oMySql:Create(...)
      3. local self = setmetatable({}, {__index = self})
      4. if oMySql.Connect then
      5. oMySql:Connect(...)
      6. end
      7. return self
      8. end
      9. function oMySql:Connect(host, db, user, pass)
      10. self.host = host
      11. self.db = db
      12. self.user = user
      13. self.pass = pass
      14. self.handler = dbConnect("mysql", "dbname="..self.db..";host="..self.host, self.user, self.pass)
      15. if self.handler then
      16. return true
      17. else
      18. return false
      19. end
      20. end
      Alles anzeigen
      Lua-Tutorials
      (http://bit.ly/lua-rookietutorials)
    • dbFree war an der Stelle nicht mehr notwendig, deswegen der Fehler. Dein SQL Syntax wird wohl nicht ganz richtig wenn du nichts in der Datenbank hast.
      Gib doch mal in einer Chatbox (oder besser in der Client Console) aus, was du bei folgendem erhählst:
      outputConsole("INSERT INTO `"..self.table.."` ("..self.all_names..") VALUES ("..self.all_values..")")
      So ganz richtig kommt mir das auf dem ersten Anblick nämlich nicht vor.
    • SQL-Befehl ist eigentlich richtig:


      LUA-Quellcode

      1. function oMySql:Insert(tabl, names, values)
      2. self.table = tabl
      3. if type(names) == "table" then
      4. for i, v in pairs(names) do
      5. self.all_names = self.all_names.."'"..v.."',"
      6. end
      7. else
      8. self.all_names = names
      9. end
      10. if type(values) == "table" then
      11. for i, v in pairs(values) do
      12. self.all_values = self.all_values.."'"..v.."',"
      13. end
      14. else
      15. self.all_values = values
      16. end
      17. local ini = outputServerLog("INSERT INTO `"..self.table.."` ("..self.all_names..") VALUES ("..self.all_values..")")
      18. if ini then
      19. outputServerLog("Erfolgreich!")
      20. end
      21. end
      22. local instanz = oMySql:Create("127.0.0.1", "firma", "root", "")
      23. instanz:Insert("accounts", "username", "poof")
      Alles anzeigen
      Lua-Tutorials
      (http://bit.ly/lua-rookietutorials)
    • Du hast einen kleinen Fehler in deinem Constructor. Dieser verhinderte mehrfache Instanzen.

      Richtig:

      LUA-Quellcode

      1. oMySql = {}
      2. function oMySql:Create(...)
      3. local self = setmetatable({}, {__index = self})
      4. if self.Connect then
      5. -- Fehler
      6. self:Connect(...)
      7. end
      8. return self
      9. end
      10. function oMySql:Connect(host, db, user, pass)
      11. self.host = host
      12. self.db = db
      13. self.user = user
      14. self.pass = pass
      15. self.handler = dbConnect("mysql", "dbname="..self.db..";host="..self.host, self.user, self.pass)
      16. if self.handler then
      17. return true
      18. else
      19. return false
      20. end
      21. end
      Alles anzeigen


      - StiviK
    • Nicht wirklich, es passiert genau das Selbe wie vorher. Habe jetzt bloß ne kleine Änderung gemacht und jetzt kommt auch ein anderer Fehler:

      LUA-Quellcode

      1. local instanz = oMySql:Create("127.0.0.1", "firma", "root", "")
      2. instanz:Insert("accounts", "username", "poof")

      Habe mal als Value "poof" genommen und da erhalte ich diesen Fehler: dbExec failed (1054); Unknown column "poof" in field-list.
      Ich vermute also dass irgendwo was falsch definiert ist, ich weiss bloß nicht was :D
      Lua-Tutorials
      (http://bit.ly/lua-rookietutorials)
    • @Obercaptain Pооf:

      SQL-Abfrage

      1. INSERT INTO `accounts` (username) VALUES (poof)

      Dies kann nicht funktionieren da MySQL nach einer Spalte mit dem Namen "poof" sucht du musst dies in Anführungzeichen setzen.
      If A equals success, then the formula is A equals X plus Y plus Z. X is work. Y is play. Z is keep your mouth shut.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von sbx320 ()

    • Hier ist eine kleine Zusammenfassung für eine gesynced Klasse zwischen Server und Client. Bei Fragen einfach eine PM schicken.
      URL: mta-sa.org/index.php?page=Thread&postID=325036#post325036

      Außerdem arbeite ich gerade am Community Server, der auch in OO gescripted ist. Dort findet ihr auch viele Sachen zum Lernen.
      URL: mta-sa.org/index.php?page=Thread&postID=325036#post325036
      Ignorance brings chaos, not knowledge ..