Fahrzeug ID auslesen AutoHotkey

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

Es gibt Neuigkeiten! Ab sofort könnt ihr dem Donators Club auf Lebenszeit beitreten.
Weitere Infos im Thema Donator's Club ab heute wieder verfügbar!

  • Fahrzeug ID auslesen AutoHotkey

    Hallo,

    ich würde gerne die Fahrzeug ID auslesen in dem der Spieler sitzt. Hierzu ist in meiner SAMP.ahk API folgendes vorgegeben


    Quellcode

    1. getTargetVehicleModelIdById(dwId)
    ich habe das ganze wie folgt zuerst gemacht

    PAWN-Quellcode

    1. addMessageToChat(getTargetVehicleModelIdById(dwId))


    allerdings ohne Erfolg. Er zeigt immer 0 an. Wie ist es hier am besten zu Regeln ?

    @Madd92
  • Komisch trotzdem, dass in der UDF die ModelID-Funktion anscheinend nicht funktioniert. Schau am besten mal, ob du die aktuellste hast, also R16, für die 0.3.7, nicht R1 oder R2.

    Ich weiß noch, dass ich mich mit der Fahrzeug-ID schon einmal beschäftigt hatte, weil die vehicleID in der RemotePlayerData-Struktur nicht zurückgesetzt wird und daher auch wenn der Spieler zu Fuß unterwegs war, eine Fahrzeug-ID ausgegeben wurde. Es gab glaube ich eine einfachere Lösung, ich hab sie auf die schnelle aber nicht wiedergefunden, daher kannst du auch einfach erstmal diese Kombination verwenden:

    PHP-Quellcode

    1. getVehiclePassengers(vehicleID) {
    2. if (vehicleID < 1 || vehicleID > 2000 || !checkHandles() || !updateOScoreboardData())
    3. return ""
    4. dwAddress := readDWORD(hGTA, readDWORD(hGTA, readDWORD(hGTA, readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET) + SAMP_PPOOLS_OFFSET) + 0x1C) + 0x4FB4 + vehicleID * 0x4)
    5. if (dwAddress == 0x0 || dwAddress == "")
    6. return ""
    7. dwCPedPtr := readDWORD(hGTA, ADDR_CPED_PTR)
    8. passengers := []
    9. Loop, 10 {
    10. if ((dwPED := readDWORD(hGTA, dwAddress + 0x45C + 4 * A_Index)) == 0x0)
    11. continue
    12. if (dwCPedPtr == dwPED)
    13. passengers.Push(Object("SEAT", A_Index - 1, "PED", dwPED, "ID", getPlayerID(), "NAME", getPlayerName()))
    14. else
    15. passengers.Push(Object("SEAT", A_Index - 1, "PED", dwPED, "ID", 0xFFFF, "NAME", ""))
    16. }
    17. for i, o in oScoreboardData {
    18. for j, k in passengers {
    19. if (o.PED != k.PED)
    20. continue
    21. k.ID := o.ID
    22. k.NAME := o.NAME
    23. }
    24. }
    25. return passengers
    26. }
    27. getPlayerVehicleID(playerID) {
    28. if (playerID < 0 || playerID >= SAMP_PLAYER_MAX || !checkHandles())
    29. return 0
    30. dwAddress := readDWORD(hGTA, readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET) + SAMP_PPOOLS_OFFSET)
    31. dwPlayer := readDWORD(hGTA, readDWORD(hGTA, dwAddress + SAMP_PPOOL_PLAYER_OFFSET) + SAMP_PREMOTEPLAYER_OFFSET + playerID * 4)
    32. vehID := readMem(hGTA, readDWORD(hGTA, dwPlayer + 0x0) + 0xAD, 2, "UShort")
    33. if (vehID < 1 || vehID > 2000)
    34. return 0
    35. passengers := getVehiclePassengers(vehID)
    36. for i, o in passengers {
    37. if (o.ID == playerID)
    38. return vehID
    39. }
    40. return 0
    41. }
    Alles anzeigen
  • Scheine ich auch für zu Blöd zusein.

    So sieht mein loop derzeit aus

    Quellcode

    1. ArrestList:
    2. Loop 1
    3. {
    4. GetChatLine(0, chat1)
    5. GetChatLine(1, chat2)
    6. GetChatLine(2, chat3)
    7. GetChatLine(3, chat4)
    8. if(InStr(chat, freename))
    9. {
    10. if(RegExMatch(chat1 . chat2 . chat3 . chat4, freename " (\d+) Minuten (\d+)\$ LSPD", params_))
    11. {
    12. if(params_2 != "" || params_2 != Error)
    13. {
    14. addChatMessage("Ja")
    15. }
    16. }
    17. }
    18. }
    19. break_ArrestList:
    Alles anzeigen
    es rührt sich aber nichts

  • Ich weiß jetzt nicht genau, was deine Abbruchbedingung ist, aber im Prinzip einfach:

    PHP-Quellcode

    1. Loop, 20 ; // Maximale Anzahl an Durchläufen (Chatzeilen)
    2. {
    3. GetChatLine(A_Index - 1, chat) ; // A_Index wird von 1-20 hochgezählt
    4. if (!InStr(chat, freename) || !RegExMatch(chat, "", params)) ; // Haystack angeben
    5. continue ; // wenn der Name nicht enthalten ist, weiter mit der nächsten Zeile
    6. AddChatMessage(params1) ; // Was auch immer ausgeführt werden soll
    7. break ; // nach Erfolg den Loop vorzeitig beenden
    8. }
    Wenn das ganze in einem Timer laufen und dauerhaft überprüft werden soll, ist es vermutlich sinnvoller, regelmäßig die chatlog.txt auszulesen und zu prüfen, ob es neue Chatzeilen gibt und die neuen dann abzuarbeiten. Statt jedes Mal bis zu 20 Zeilen auszulesen und zu prüfen, die eventuell längere Zeit immer die gleichen sind.
  • Oh supi :D

    Wollte nun aber den params ausgeben lassen also params_2 und da gibt er mit immer wieder den kack freename aus

    Quellcode

    1. if(freemember==1)
    2. {
    3. Loop, 20 ; // Maximale Anzahl an Durchläufen (Chatzeilen)
    4. {
    5. GetChatLine(A_Index - 1, chat) ; // A_Index wird von 1-20 hochgezählt
    6. if (!InStr(chat, %freename%) || !RegExMatch(chat, %freename% " (\d+) Minuten (\d+)\$ LSPD", params)) ; // Haystack angeben
    7. continue ; // wenn der Name nicht enthalten ist, weiter mit der nächsten Zeile
    8. addChatMessage(params_2) ; // Was auch immer ausgeführt werden soll
    9. freemember=0
    10. break ; // nach Erfolg den Loop vorzeitig beenden
    11. }
    12. }
    Alles anzeigen
  • Madd92 schrieb:

    Komisch trotzdem, dass in der UDF die ModelID-Funktion anscheinend nicht funktioniert. Schau am besten mal, ob du die aktuellste hast, also R16, für die 0.3.7, nicht R1 oder R2.

    Ich weiß noch, dass ich mich mit der Fahrzeug-ID schon einmal beschäftigt hatte, weil die vehicleID in der RemotePlayerData-Struktur nicht zurückgesetzt wird und daher auch wenn der Spieler zu Fuß unterwegs war, eine Fahrzeug-ID ausgegeben wurde. Es gab glaube ich eine einfachere Lösung, ich hab sie auf die schnelle aber nicht wiedergefunden, daher kannst du auch einfach erstmal diese Kombination verwenden:

    PHP-Quellcode

    1. getVehiclePassengers(vehicleID) {
    2. if (vehicleID < 1 || vehicleID > 2000 || !checkHandles() || !updateOScoreboardData())
    3. return ""
    4. dwAddress := readDWORD(hGTA, readDWORD(hGTA, readDWORD(hGTA, readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET) + SAMP_PPOOLS_OFFSET) + 0x1C) + 0x4FB4 + vehicleID * 0x4)
    5. if (dwAddress == 0x0 || dwAddress == "")
    6. return ""
    7. dwCPedPtr := readDWORD(hGTA, ADDR_CPED_PTR)
    8. passengers := []
    9. Loop, 10 {
    10. if ((dwPED := readDWORD(hGTA, dwAddress + 0x45C + 4 * A_Index)) == 0x0)
    11. continue
    12. if (dwCPedPtr == dwPED)
    13. passengers.Push(Object("SEAT", A_Index - 1, "PED", dwPED, "ID", getPlayerID(), "NAME", getPlayerName()))
    14. else
    15. passengers.Push(Object("SEAT", A_Index - 1, "PED", dwPED, "ID", 0xFFFF, "NAME", ""))
    16. }
    17. for i, o in oScoreboardData {
    18. for j, k in passengers {
    19. if (o.PED != k.PED)
    20. continue
    21. k.ID := o.ID
    22. k.NAME := o.NAME
    23. }
    24. }
    25. return passengers
    26. }
    27. getPlayerVehicleID(playerID) {
    28. if (playerID < 0 || playerID >= SAMP_PLAYER_MAX || !checkHandles())
    29. return 0
    30. dwAddress := readDWORD(hGTA, readDWORD(hGTA, dwSAMP + SAMP_INFO_OFFSET) + SAMP_PPOOLS_OFFSET)
    31. dwPlayer := readDWORD(hGTA, readDWORD(hGTA, dwAddress + SAMP_PPOOL_PLAYER_OFFSET) + SAMP_PREMOTEPLAYER_OFFSET + playerID * 4)
    32. vehID := readMem(hGTA, readDWORD(hGTA, dwPlayer + 0x0) + 0xAD, 2, "UShort")
    33. if (vehID < 1 || vehID > 2000)
    34. return 0
    35. passengers := getVehiclePassengers(vehID)
    36. for i, o in passengers {
    37. if (o.ID == playerID)
    38. return vehID
    39. }
    40. return 0
    41. }
    Alles anzeigen

    Brauche das mal wieder. Leider gerade etwas eingerostet. Ich würde gerne Abfragen ob der User in einem bestimmten Fahrzeug sitzt. Wie war der passende Code nochmal dazu
  • Du meinst der lokale Spieler?
    Spoiler anzeigen

    C-Quellcode

    1. global SAMP_INFO_PTR := 0x21A0F8
    2. global SAMP_POOLS := 0x3CD
    3. global SAMP_POOL_PLAYER := 0x18
    4. global SAMP_LOCALPLAYER := 0x22
    5. global GTA_CPED_PTR := 0xB6F5F0
    6. global GTA_VEHICLE_PTR := 0xBA18FC
    7. __READMEM(hProcess, dwAddress, oOffsets, sDatatype = "Int") {
    8. if (!hProcess || !dwAddress)
    9. return ""
    10. VarSetCapacity(dwRead, 4)
    11. for i, o in oOffsets {
    12. dwRet := DllCall("ReadProcessMemory", "UInt", hProcess, "UInt", dwAddress + o, "Str", dwRead, "UInt", 4, "UInt*", 0)
    13. if (!dwRet)
    14. return ""
    15. if (i == oOffsets.MaxIndex())
    16. return NumGet(dwRead, 0, sDatatype)
    17. dwAddress := NumGet(dwRead, 0, "UInt")
    18. }
    19. }
    20. isPlayerInAnyVehicle() {
    21. return checkHandles() && __READMEM(hGTA, GTA_VEHICLE_PTR, [0x0], "UInt") > 0
    22. }
    23. isPlayerDriver() {
    24. return checkHandles() && __READMEM(hGTA, GTA_VEHICLE_PTR, [0x0, 0x460], "UInt") == __READMEM(hGTA, GTA_CPED_PTR, [0x0], "UInt")
    25. }
    Alles anzeigen


    C-Quellcode

    1. getVehicleID() {
    2. if (!checkHandles() || !isPlayerInAnyVehicle())
    3. return 0
    4. return __READMEM(hGTA, dwSAMP, [SAMP_INFO_PTR, SAMP_POOLS, SAMP_POOL_PLAYER, SAMP_LOCALPLAYER, isPlayerDriver() ? 0xAA : 0x5C], "UShort")
    5. }
  • Madd92 schrieb:

    Du meinst der lokale Spieler?
    Spoiler anzeigen

    C-Quellcode

    1. global SAMP_INFO_PTR := 0x21A0F8
    2. global SAMP_POOLS := 0x3CD
    3. global SAMP_POOL_PLAYER := 0x18
    4. global SAMP_LOCALPLAYER := 0x22
    5. global GTA_CPED_PTR := 0xB6F5F0
    6. global GTA_VEHICLE_PTR := 0xBA18FC
    7. __READMEM(hProcess, dwAddress, oOffsets, sDatatype = "Int") {
    8. if (!hProcess || !dwAddress)
    9. return ""
    10. VarSetCapacity(dwRead, 4)
    11. for i, o in oOffsets {
    12. dwRet := DllCall("ReadProcessMemory", "UInt", hProcess, "UInt", dwAddress + o, "Str", dwRead, "UInt", 4, "UInt*", 0)
    13. if (!dwRet)
    14. return ""
    15. if (i == oOffsets.MaxIndex())
    16. return NumGet(dwRead, 0, sDatatype)
    17. dwAddress := NumGet(dwRead, 0, "UInt")
    18. }
    19. }
    20. isPlayerInAnyVehicle() {
    21. return checkHandles() && __READMEM(hGTA, GTA_VEHICLE_PTR, [0x0], "UInt") > 0
    22. }
    23. isPlayerDriver() {
    24. return checkHandles() && __READMEM(hGTA, GTA_VEHICLE_PTR, [0x0, 0x460], "UInt") == __READMEM(hGTA, GTA_CPED_PTR, [0x0], "UInt")
    25. }
    Alles anzeigen


    C-Quellcode

    1. getVehicleID() {
    2. if (!checkHandles() || !isPlayerInAnyVehicle())
    3. return 0
    4. return __READMEM(hGTA, dwSAMP, [SAMP_INFO_PTR, SAMP_POOLS, SAMP_POOL_PLAYER, SAMP_LOCALPLAYER, isPlayerDriver() ? 0xAA : 0x5C], "UShort")
    5. }
    Ja es geht um die Ermittlung der Fahrzeugid des Spielers der den Keybinder verwendet.

    Ich habe es nun wie folgt mal gemacht


    Quellcode

    1. status = getVehicleID()
    2. addChatMessage(status)
    3. if(status)==482
    Leider aber ohne Richtige funktion. Die AddChatMessage gibt nichts aus.