Angepinnt Nützliche Codeschnipsel

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

    • PewX schrieb:

      Gibts dafür nicht setGlitchEnabled mit fastsprint? Soll ja eigentlich schon deaktiviert sein. Oder ist das was anderes?
      Dabei bringt das mehrmalige Drücken von Leertaste nichts.
      Bei meinem Codeschnipsel kann man den Glitch aktivieren, aber nur so schnell rennen, wie man bei einer Verfolgungsjagd rennen würde.

      Mit einem Laufbot habe ich ca. 21 Schläge auf Leertaste messen können, daher ist man auch so schnell.
      Als ich versucht habe einigermaßen schnell zu schlagen, nicht so schnell wie als würde mein Leben davon abhängen, konnte ich ca. 7/8 Schläge bekommen.

      Ohne diesen Glitch ist man total langsam, das stört viele Spieler.

      Ach und auf Rise hatte ich ein total bekacktes Script dafür, war mir wichtig, dass ich zeige, dass ich es besser kann.
      Mit MTA aufgehört

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von [TDS]Bonus ()

    • Formatted Debug Function
      GitHub Gist Link

      Beschreibung
      Du kannst Debug-Nachrichten mit einer Template-Syntax ausgeben, ohne explizit die Variablen in die Argumente beim Aufruf zu schieben.

      Eingabe

      LUA-Quellcode

      1. local name = "Necktrox"
      2. local favourite = 7
      3. local pi = math.pi
      4. local foo = function() return "GitHub" end
      5. debugf("My name is {name}, my favourite number is {favourite}. PI equals to {pi|number}")
      6. debugf("Lua version: {_VERSION}")
      7. debugf("math.pi = {math.pi|natural}")
      8. debugf("math = {math}")
      9. debugf("This is hosted on {foo|execute}")
      10. debugf("{}")
      11. debugf("{math.pi|nil}")
      12. debugf("print = {print}")
      13. debugf("math as string = {math|string}")
      Alles anzeigen

      Ausgabe

      Quellcode

      1. My name is Necktrox, my favourite number is 7. PI equals to 3.142
      2. Lua version: Lua 5.3
      3. math.pi = 3.1415926535898
      4. math = math [table(31), 0x...]
      5. This is hosted on GitHub
      6. nil
      7. nil
      8. print = print [function, 0x...]
      9. math as string = table: 0...
      I hack with Lua code
    • Ich erlaube es mir unverschämterweise ein Doppelpost zu erstellen.
      Dieses Schnipsel zeigt eine einfache Kamera, die um den Spieler kreist.

      GitHub Gists: Link

      LUA-Quellcode: camera.lua

      1. -- Camera state
      2. local cameraEnabled = false
      3. -- Camera radius
      4. local sphereRadius = 5
      5. -- Cursor sensitivity
      6. local sensitivity = 100
      7. -- Field of view
      8. local fov = 90
      9. -- Horizontal angle in degree
      10. local angleH = 85
      11. -- Vertical angle in degree
      12. local angleV = 90
      13. function getCameraPositionOffset(h, v)
      14. -- Transform degrees to radians
      15. local radV = math.rad(v)
      16. local radH = math.rad(h)
      17. -- Calculate these values only once
      18. local sinH = math.sin(radH)
      19. local sphereRadiusXY = sphereRadius * sinH
      20. -- Calculate camera position on sphere around the local player
      21. local x = math.sin(radV) * sphereRadiusXY
      22. local y = math.cos(radV) * sphereRadiusXY
      23. local z = math.cos(radH) * sphereRadius + 1.0
      24. -- Create the vector for the position offset
      25. return Vector3(x, y, z)
      26. end
      27. local cameraPositionOffset = getCameraPositionOffset(angleH, angleV)
      28. function setCameraEnabled(enabled)
      29. enabled = enabled and true or false
      30. if cameraEnabled == enabled then
      31. return false
      32. end
      33. if cameraEnabled then
      34. removeEventHandler("onClientCursorMove", root, onClientCursorMove)
      35. removeEventHandler("onClientPreRender", root, onClientPreRender)
      36. else
      37. addEventHandler("onClientCursorMove", root, onClientCursorMove)
      38. addEventHandler("onClientPreRender", root, onClientPreRender)
      39. end
      40. cameraEnabled = enabled
      41. return true
      42. end
      43. function isCameraEnabled()
      44. return cameraEnabled
      45. end
      46. function onClientCursorMove(cursorX, cursorY)
      47. -- Calculate the cursor distance
      48. local cursorDistanceX = (cursorX - 0.5) * sensitivity
      49. local cursorDistanceY = (0.5 - cursorY) * sensitivity
      50. -- Calculate the new vertical angle
      51. angleV = (angleV + cursorDistanceX) % 360
      52. -- Calculate the new horizontal angle
      53. angleH = math.min(179, math.max(1, angleH + cursorDistanceY))
      54. -- Update the position offset vector
      55. cameraPositionOffset = getCameraPositionOffset(angleH, angleV)
      56. end
      57. function onClientPreRender()
      58. -- Get the current position of the local player
      59. local position = localPlayer:getPosition()
      60. -- Calculate the camera positions
      61. local cameraLookAt = position + Vector3(0, 0, 0.75)
      62. local cameraPosition = position + cameraPositionOffset
      63. -- Apply the camera matrix
      64. Camera.setMatrix(cameraPosition, cameraLookAt, 0, fov)
      65. end
      66. addCommandHandler("togglecamera",
      67. function ()
      68. -- Toggle the current camera state
      69. setCameraEnabled(not isCameraEnabled())
      70. end
      71. )
      Alles anzeigen
      I hack with Lua code
    • Hier einmal zwei sinnvolle Funktionen um gestrichelte Linien zu rendern. Dabei könnt ihr die Segmentlänge und die beiden Farben selbst wählen:

      LUA-Quellcode

      1. --//
      2. --|| dxDrawDashedLine
      3. --|| x1,y1 - Startpunkt
      4. --|| x2,y2 - Endpunkt
      5. --|| p - Segmentlänge (z.B. 10 um die Linie in 10px-Abschnitte zu teilen)
      6. --|| color1, color2 - Farbe der beiden versch. Segmente (mittels tocolor())
      7. --|| s - die Breite der Linie in px
      8. --|| pgui - posGUI (ob es über GUI-Elementen gezeichnet werden soll (true) oder nicht (false))
      9. --\\
      10. function dxDrawDashedLine(x1, y1, x2, y2, p, color1, color2, s, pgui)
      11. local p = p*2
      12. local d = Vector2(x2-x1, y2-y1).length
      13. if d == 0 then return end
      14. local i, r, c = d/p*2, d*2%(p), 0
      15. while c < i-1 do
      16. local color = color2
      17. if c%2 == 0 then color = color1 end
      18. dxDrawLine(x1+(x2-x1)/i*c, y1+(y2-y1)/i*c, x1+(x2-x1)/i*(c+1), y1+(y2-y1)/i*(c+1), color, s, pgui)
      19. c = c+1
      20. end
      21. --draw last line
      22. local color = color2
      23. if c%2 == 0 then color = color1 end
      24. dxDrawLine(x1+(x2-x1)/i*c, y1+(y2-y1)/i*c, x1+(x2-x1)/i*(c+1/p*r), y1+(y2-y1)/i*(c+1/p*r), color, s, pgui)
      25. end
      26. --//
      27. --|| dxDrawDashedLine3D
      28. --|| x1,y1,z1 - Startpunkt in Weltkoordinaten
      29. --|| x2,y2,z2 - Endpunkt in Weltkoordinaten
      30. --|| p - Segmentlänge in Weltkoordinaten
      31. --|| color1, color2 - Farbe der beiden versch. Segmente
      32. --|| s - die Breite der Linie (in "Weltpixeln", siehe dxDrawLine3D)
      33. --|| pgui - posGUI
      34. --\\
      35. function dxDrawDashedLine3D(x1, y1, z1 ,x2, y2, z2, p, color1, color2, s, pgui)
      36. local p = p*2
      37. local d = Vector3(x2-x1, y2-y1, z2-z1).length
      38. if d == 0 then return end
      39. local i, r, c = d/p*2, d*2%(p), 0
      40. while c < i-1 do
      41. local color = color2
      42. if c%2 == 0 then color = color1 end
      43. dxDrawLine3D(x1+(x2-x1)/i*c, y1+(y2-y1)/i*c, z1+(z2-z1)/i*c, x1+(x2-x1)/i*(c+1), y1+(y2-y1)/i*(c+1), z1+(z2-z1)/i*(c+1), color, s, pgui)
      44. c = c+1
      45. end
      46. --draw last line
      47. local color = color2
      48. if c%2 == 0 then color = color1 end
      49. dxDrawLine3D(x1+(x2-x1)/i*c, y1+(y2-y1)/i*c, z1+(z2-z1)/i*c, x1+(x2-x1)/i*(c+1/p*r), y1+(y2-y1)/i*(c+1/p*r), z1+(z2-z1)/i*(c+1/p*r), color, s, pgui)
      50. end
      Alles anzeigen

      Bilder:
      Spoiler anzeigen

      dxDrawDashedLine:


      dxDrawDashedLine3D:

    • Kleiner Schnipsel um die Musik von tidido.com/de/ anzugreifen und in MTA brauchbar zu benutzen für z.B einen Musikplayer etc...

      LUA-Quellcode

      1. function searchMusic(term, callback)
      2. fetchRemote ("http://tidido.com/api/search/fast?q="..term.."&size%5Bsongs%5D=2000&size%5Bartists%5D=2&size%5Balbums%5D=2&size%5Busers%5D=2", 10, parseJson, "", false, callback)
      3. end
      4. function parseJson(responseData, errno, callback )
      5. if errno == 0 then
      6. local response = fromJSON(responseData)
      7. _G[callback](false, response["songs"]["data"]["songs"])
      8. else
      9. _G[callback](true, {})
      10. end
      11. end
      12. -- Example
      13. function myResult(err, data)
      14. for _, v in pairs(data) do
      15. outputServerLog("Name: "..v['name']);
      16. outputServerLog("Url: "..v['url']);
      17. end
      18. end
      19. searchMusic("Cake by the ocean", "myResult")
      Alles anzeigen

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

      Beitrag von PewX ()

      Dieser Beitrag wurde vom Autor aus folgendem Grund gelöscht: fetchRemote kann es nicht. #Fail ().

      Beitrag von FFrozen ()

      Dieser Beitrag wurde vom Autor gelöscht ().
    • Eine Klasse für die Tidido Music API (URL von @Shyim):

      LUA-Quellcode

      1. MusicAPI = inherit(Object)
      2. local MUSIC_API_URL = "http://tidido.com/api/search/fast?q=!TERM!&size%5Bsongs%5D=2000&size%5Bartists%5D=2&size%5Balbums%5D=2&size%5Busers%5D=2"
      3. local BASE_IMG_URL = "http://am.cdnmonster.com/"
      4. local SEARCH_STATUS = {
      5. PENDING = 1;
      6. SUCCESS = 2;
      7. ERROR = 3;
      8. }
      9. function MusicAPI:constructor(term, callback)
      10. self.m_URL = MUSIC_API_URL:gsub("!TERM!", term)
      11. self.m_IMGURL = BASE_IMG_URL
      12. self.m_Callback = callback or function () error("No Callback") end
      13. self.m_SongData = {}
      14. self.m_AlbumData = {}
      15. self.m_ArtistsData = {}
      16. self.m_Status = SEARCH_STATUS.PENDING
      17. self:performSearch().next(fromJSON).done(
      18. bind(self.onSuccess, self),
      19. bind(self.onFailure, self)
      20. )
      21. end
      22. function MusicAPI:performSearch()
      23. return Promise:new(
      24. function (fullfill, reject)
      25. fetchRemote(self.m_URL, 1,
      26. function (responseData, errno)
      27. if errno == 0 then
      28. fullfill(responseData)
      29. else
      30. reject(errno)
      31. end
      32. end,
      33. "", false)
      34. end
      35. )
      36. end
      37. function MusicAPI:onSuccess(data)
      38. self.m_Status = SEARCH_STATUS.SUCCESS
      39. if data["songs"] then
      40. self.m_SongData = data["songs"]["data"]["songs"]
      41. self.m_AlbumData = data["songs"]["data"]["albums"]
      42. self.m_ArtistsData = data["songs"]["data"]["artists"]
      43. end
      44. self.m_Callback(self, true)
      45. outputDebug("Search completed successfully!")
      46. end
      47. function MusicAPI:onFailure(errno)
      48. self.m_Status = SEARCH_STATUS.ERROR
      49. self.m_Callback(self, false)
      50. outputDebug("Search failed!")
      51. end
      52. function MusicAPI:getSongs()
      53. return self.m_SongData
      54. end
      55. function MusicAPI:getAlbumData(albumId)
      56. if self.m_Status == SEARCH_STATUS.SUCCESS then
      57. local found = false
      58. for i, v in ipairs(self.m_AlbumData) do
      59. if tostring(v.id):lower() == tostring(albumId):lower() then
      60. found = v
      61. break;
      62. end
      63. end
      64. return found
      65. else
      66. return false
      67. end
      68. end
      69. function MusicAPI:getArtistData(artistId)
      70. if self.m_Status == SEARCH_STATUS.SUCCESS then
      71. local found = false
      72. for i, v in ipairs(self.m_ArtistsData) do
      73. if tostring(v.id):lower() == tostring(artistId):lower() then
      74. found = v
      75. break;
      76. end
      77. end
      78. return found
      79. else
      80. return false
      81. end
      82. end
      83. function testMusic(term)
      84. local search = MusicAPI:new(term,
      85. function (self, status)
      86. if status then
      87. local songs = self:getSongs()
      88. if #songs > 0 then
      89. local song = songs[1] -- Get the first song we found
      90. print("Name: "..song.name)
      91. print("Song-URL: "..song.url)
      92. local data = self:getAlbumData(song.albumId)
      93. if data then
      94. print(("Album-Name: %s"):format(data["name"]))
      95. print(("AlbumIMG-URL: %s/%s"):format(BASE_IMG_URL, data["avatar"]["sizes"]["q"][1]:gsub("//", "/")))
      96. local artistString = "Artist-Name(s): "
      97. local artistIMGString = "Artist-IMG(s): "
      98. for i, v in ipairs(data.aids) do
      99. local artist = self:getArtistData(v)
      100. if artist then
      101. artistString = ("%s%s"):format(artistString, artist.fullname)
      102. if i < #song.artistIds then
      103. artistString = artistString..", "
      104. end
      105. artistIMGString = artistIMGString..("%s/%s"):format(BASE_IMG_URL, artist["avatar"]["sizes"]["q"][1]:gsub("//", "/"))
      106. if i < #song.artistIds then
      107. artistIMGString = artistIMGString..", "
      108. end
      109. end
      110. end
      111. print(artistString)
      112. print(artistIMGString)
      113. end
      114. end
      115. end
      116. end
      117. )
      118. end
      Alles anzeigen
      Spoiler anzeigen

      Benötigt zusätzlich: Promise, Classlib (by sbx320), Object, nextframe
      Meine Promise Klasse

      LUA-Quellcode

      1. Promise = inherit(Object)
      2. local PENDING = 0;
      3. local FULFILLED = 1;
      4. local REJECTED = 2;
      5. function Promise:constructor(func)
      6. self.m_State = PENDING
      7. self.m_Value = nil
      8. self.m_Handlers = {}
      9. self.done = function (onFulfilled, onRejected)
      10. self.m_OnFulfilled = onFulfilled
      11. self.m_OnRejected = onRejected
      12. end
      13. self.next = function (...)
      14. Promise.addNext(self)
      15. return self.next(...)
      16. end
      17. Promise.doResolve(self, func, bind(self.resolve, self), bind(self.reject, self))
      18. end
      19. function Promise:fulfill(result)
      20. self.m_State = FULFILLED
      21. self.m_Value = result
      22. end
      23. function Promise:reject(error)
      24. self.m_State = REJECTED
      25. self.m_Value = error
      26. end
      27. function Promise:resolve(result)
      28. self:fulfill(result);
      29. end
      30. function Promise:handle(handler)
      31. if self.m_State == PENDING then
      32. table.insert(self.m_Handlers, handler)
      33. else
      34. if (self.m_State == FULFILLED and type(handler.onFulfilled) == "function") then
      35. handler.onFulfilled(self.m_Value)
      36. end
      37. if (self.m_State == REJECTED and type(handler.onRejected) == "function") then
      38. handler.onRejected(self.m_Value)
      39. end
      40. end
      41. end
      42. function Promise:doResolve(func, onFulfilled, onRejected)
      43. local done = false;
      44. func(
      45. function (value)
      46. if (done) then return end
      47. done = true
      48. onFulfilled(value)
      49. -- 'cause of Asynchronous functions we have to call it here!
      50. nextframe(
      51. function ()
      52. self:handle({onFulfilled = self.m_OnFulfilled, onRejected = self.m_OnRejected})
      53. end
      54. )
      55. end,
      56. function (reason)
      57. if (done) then return end
      58. done = true
      59. onRejected(reason)
      60. -- 'cause of Asynchronous functions we have to call it here!
      61. nextframe(
      62. function ()
      63. self:handle({onFulfilled = self.m_OnFulfilled, onRejected = self.m_OnRejected})
      64. end
      65. )
      66. end
      67. )
      68. end
      69. function Promise.addNext(self)
      70. self.next = function (onFulfilled, onRejected)
      71. return Promise:new(
      72. function (resolve, reject)
      73. return self.done(
      74. function (result)
      75. if (type(onFulfilled) == "function") then
      76. return resolve(onFulfilled(result));
      77. else
      78. return resolve(result);
      79. end
      80. end,
      81. function (error)
      82. if (type(onRejected) == "function") then
      83. return resolve(onRejected(error));
      84. else
      85. return reject(error);
      86. end
      87. end
      88. );
      89. end
      90. );
      91. end
      Alles anzeigen

      Object-Klasse:

      LUA-Quellcode

      1. Object = {}
      2. function Object:new(...)
      3. return new(self, ...)
      4. end
      5. function Object:delete(...)
      6. return delete(self, ...)
      7. end
      8. function Object:load(...)
      9. return load(self, ...)
      10. end
      11. function Object:getId()
      12. return self.m_Id
      13. end
      Alles anzeigen

      nextframe:

      LUA-Quellcode

      1. function nextframe(fn)
      2. setTimer(fn, 50, 1)
      3. end

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von StiviK ()

    • Funktion um den Winkel zwischen drei Punkten zu bestimmen.
      Gibt immer den kleinen Winkel (<180°) zurück. bx und by sind die Scheitelkoordinaten

      LUA-Quellcode

      1. function getAngleBetween3Points2D(ax, ay, bx, by, cx, cy)
      2. local x1, y1, x2, y2 = ax-bx,ay-by,cx-bx,cy-by
      3. return math.deg(math.acos((x1*x2 + y1*y2)/(math.sqrt(x1^2 + y1^2)*math.sqrt(x2^2+y2^2))))
      4. end



      Koordinaten eines Punktes auf der Sichtlinie des Peds(!) mit einer Entfernung von 1.
      Kann mit der obrigen Funktion und verwendet werden, um zu testen, ob der Ped(!) etwas sehen kann.

      LUA-Quellcode

      1. function getPointOnLineOfSight (player)
      2. local x1,y1 = getElementPosition(player)
      3. local rx, ry, rz = getElementRotation(player)
      4. return x1+math.cos(math.rad(rz+90)),y1+math.sin(math.rad(rz+90))
      5. end
      Beide Funktionen arbeiten zweidimensional
      Ein Like sagt mehr als tausend Worte

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

    • Habe mal meine Switch-Funktion verbessert:


      Kann man z.B. so nutzen:

      LUA-Quellcode

      1. element:setPosition(
      2. switch(direction) {
      3. case "F" (element.position + element.matrix.forward);
      4. case "B" (element.position - element.matrix.forward);
      5. case "R" (element.position + element.matrix.right);
      6. case "L" (element.position - element.matrix.right);
      7. case "U" (element.position + Vector3(0, 0, 1));
      8. case "D" (element.position - Vector3(0, 0, 1));
      9. }
      10. )

      Verbessert meiner Meinung nach auch die Übersicht z.B. hier:

      LUA-Quellcode

      1. outputDebugString(switch(random){case "A" (_"Hello how are you!"); case "B" (_"Looks fine!"); case "C" (_"Okay.")})
      2. outputDebugString(random == "A" and _"Hello how are you!" or random == "B" and _"Looks fine!" or random == "C" and _"Okay.")

      - StiviK
    • sbx320 schrieb:

      Interessant. Hat es einen besonderen Grund wieso du da die __call Metamethode anstatt Funktionen für switch/case verwendest?
      Fällt mir auch gerade erst auf, eigentlich Nein.

      sbx320 schrieb:

      Praktisch wäre eventuell auch noch eine Möglichkeit für einen default Wert, wenn kein anderer case Eintrag passt.
      Habe ich ganz vergessen, habe ich mal schnell implementiert und so den Code verbessert.
      (Kann man ja oben im ursprünglichen Beitrag sehen)

      - StiviK