From 10411182bf10c959c50e92650112b730949139da Mon Sep 17 00:00:00 2001 From: EchoDRecho Date: Mon, 18 Feb 2019 16:00:29 +0000 Subject: [PATCH 01/30] Update SAMP.ahk Added the getLastChatMessage( ) Function, and also the offset to the last message added to the ChatBox. --- SAMP.ahk | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/SAMP.ahk b/SAMP.ahk index f9e9ad8..e83da02 100644 --- a/SAMP.ahk +++ b/SAMP.ahk @@ -110,6 +110,7 @@ global FUNC_SAMP_STOPAUDIOSTR := 0x629A0 global FUNC_SAMP_SHOWDIALOG := 0x6B9C0 global FUNC_UPDATESCOREBOARD := 0x8A10 +global SAMP_LAST_CHAT_MESSAGE_OFFSET := 0x62C6 global SAMP_INFO_OFFSET := 0x21A0F8 global SAMP_PPOOLS_OFFSET := 0x3CD global SAMP_PPOOL_PLAYER_OFFSET := 0x18 @@ -160,6 +161,7 @@ global bCheckSizeOnce := 1 ; # - getUsername() get local player name # ; # - getId() get local player id # ; # - sendChatMessage(wText) send a message to the server # +; # - getLastChatMessage() get the last message added to the ChatBox # ; # - addMessageToChatWindow(wText) add a "private" text to the chatbox # ; # - showGameText(wText, dwTime, dwTextsize) show a text on the sreen # ; # - showDialog(dwStyle, wCaption, show a dialog-box # @@ -318,6 +320,25 @@ sendChatMessage(wText) { return true } +; get the last message added to the ChatBox. +getLastChatMessage(){ + if(!checkHandles()) + return "" + dwAddress := dwSAMP + ADDR_SAMP_CHATMSG_PTR + currentAddress := readDWORD(hGTA, dwAddress) + SAMP_LAST_CHAT_MESSAGE_OFFSET + if(ErrorLevel) { + ErrorLevel := ERROR_READ_MEMORY + return "Can not read from memory." + } + Message := readString(hGTA, currentAddress, 150) + if(ErrorLevel) { + ErrorLevel := ERROR_READ_MEMORY + return "Can not read from memory." + } + ErrorLevel := ERROR_OK + return Message +} + ; similar to: http://wiki.sa-mp.com/wiki/SendClientMessage ; pass a string to add a private message to the chatbox addMessageToChatWindow(wText) { From 662c3239c9403d3a79cf4de5ac1e8c29fa350709 Mon Sep 17 00:00:00 2001 From: Mukhtar Kiboigo Date: Wed, 20 Feb 2019 18:04:33 -0800 Subject: [PATCH 02/30] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d878e0e..3379dd6 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # SAMPAHK +![Image of Build Status](https://ci.appveyor.com/api/projects/status/ys6gm8pk3xg02pvx?svg=true) Based off: [SAMPUDF](https://github.com/paul-phoenix/SAMP-UDF-for-AutoHotKey) by paul-phoenix From ff2580c3cca9ca6624457a078c5f131840205d08 Mon Sep 17 00:00:00 2001 From: Mukhtar Kiboigo Date: Wed, 20 Feb 2019 18:05:05 -0800 Subject: [PATCH 03/30] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d878e0e..3379dd6 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # SAMPAHK +![Image of Build Status](https://ci.appveyor.com/api/projects/status/ys6gm8pk3xg02pvx?svg=true) Based off: [SAMPUDF](https://github.com/paul-phoenix/SAMP-UDF-for-AutoHotKey) by paul-phoenix From 4be28cacb3b1aab471e95ba37a3a876cf90edb59 Mon Sep 17 00:00:00 2001 From: Mukhtar Kiboigo Date: Wed, 20 Feb 2019 18:05:45 -0800 Subject: [PATCH 04/30] Update SAMP.ahk --- SAMP.ahk | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/SAMP.ahk b/SAMP.ahk index e83da02..308cd19 100644 --- a/SAMP.ahk +++ b/SAMP.ahk @@ -1,8 +1,9 @@ ; #### SAMPAHK #### -; SOFTWARE VERSION: v0.1.0 ; https://github.com/sampudf/SAMPAHK ; #################### +; UPDATE THIS OR YOUR MERGE WILL BE CLOSED. +; SOFTWARE VERSION: v0.2.0 ; ErrorLevels From d246609d634989c8e424691c631ce154b7cc6518 Mon Sep 17 00:00:00 2001 From: muki Date: Wed, 20 Feb 2019 19:29:27 -0800 Subject: [PATCH 05/30] Update README.md --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 3379dd6..63b5a71 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,4 @@ -# SAMPAHK -![Image of Build Status](https://ci.appveyor.com/api/projects/status/ys6gm8pk3xg02pvx?svg=true) +## SAMPAHK v0.2.0 ![Image of Build Status](https://ci.appveyor.com/api/projects/status/ys6gm8pk3xg02pvx?svg=true) Based off: [SAMPUDF](https://github.com/paul-phoenix/SAMP-UDF-for-AutoHotKey) by paul-phoenix @@ -44,7 +43,7 @@ return +T:: ~t:: Suspend On -Hotkey, Enter, On +Hotkey, Enter, On8 Hotkey, Escape, On Hotkey, t, Off return From 5ee9ec7a1a690d4e269db5674688f58fbce9924a Mon Sep 17 00:00:00 2001 From: muki Date: Wed, 20 Feb 2019 19:31:18 -0800 Subject: [PATCH 06/30] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 63b5a71..b16def4 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ -## SAMPAHK v0.2.0 ![Image of Build Status](https://ci.appveyor.com/api/projects/status/ys6gm8pk3xg02pvx?svg=true) +## SAMPAHK (0.2) +![Image of Build Status](https://ci.appveyor.com/api/projects/status/ys6gm8pk3xg02pvx?svg=true) Based off: [SAMPUDF](https://github.com/paul-phoenix/SAMP-UDF-for-AutoHotKey) by paul-phoenix From e160dde318cb3949da39795f147b5f682be4ff94 Mon Sep 17 00:00:00 2001 From: muki Date: Wed, 20 Feb 2019 19:31:30 -0800 Subject: [PATCH 07/30] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b16def4..4b941eb 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -## SAMPAHK (0.2) +## SAMPAHK (V0.2) ![Image of Build Status](https://ci.appveyor.com/api/projects/status/ys6gm8pk3xg02pvx?svg=true) Based off: [SAMPUDF](https://github.com/paul-phoenix/SAMP-UDF-for-AutoHotKey) by paul-phoenix From 82c8aba955b109e26f3dcfeeabe5dcdcb0ddd60e Mon Sep 17 00:00:00 2001 From: muki Date: Wed, 20 Feb 2019 19:47:09 -0800 Subject: [PATCH 08/30] Rename LICENSE to LICENSE.txt --- LICENSE => LICENSE.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename LICENSE => LICENSE.txt (100%) diff --git a/LICENSE b/LICENSE.txt similarity index 100% rename from LICENSE rename to LICENSE.txt From 69f3c0a5e619f789547518a48fb14b477e862576 Mon Sep 17 00:00:00 2001 From: muki Date: Wed, 20 Feb 2019 19:47:58 -0800 Subject: [PATCH 09/30] Delete memorycodes.txt --- memorycodes.txt | 141 ------------------------------------------------ 1 file changed, 141 deletions(-) delete mode 100644 memorycodes.txt diff --git a/memorycodes.txt b/memorycodes.txt deleted file mode 100644 index c0c0eb2..0000000 --- a/memorycodes.txt +++ /dev/null @@ -1,141 +0,0 @@ -Complied from: https://gtaforums.com/topic/194199-documenting-gta-sa-memory-addresses/?page=4 - -0xA49960 = start of scm block -00B74490 = Pool of CPed structures -00B74494 = Occupied CVehicle (Player when on foot) -CPed + 0x540 = Health. (float) -0x464080 - GetOpcodeParameters() -0xA43C78 - Where the routine above stores opcode parameters values. Max 16 paramters for an opcode it seems. -0x53BC80 - LoadGame(char* fileName), initializes all data structures and loads fileName (which is gta.dat). -0x5B9030 - LoadMapDefinitionFile(char* fileName), parses and loads dat-files, such as default.dat and gta.dat. -0x550F10 - AllocatePools(), allocates stuff which LimitAdjuster modifies, such as Peds and Buildings. -0x82119A - malloc(size_t size) -0x438480 - Looks like cheat processor -0xB7CE50 - money -0xBAA420 - wanted level -0xB70153 - current hour -0xB70152 - current minute -CPed + 0x740 - current weapon -CPed + 0x718 = Current weapon slot. (1 byte) -CPed + 0x5A0 = Start of weapon data. Each slot has 28 bytes. -CPed + 0x14 = pointer to XYZ position structure (and rotation) -0x863984 = gravity -Player + 368 = x pos -Player + 372 = y pos -Player + 376 = z pos -DWORD(CPed+0x14) + 0x30 = XPos -DWORD(CPed+0x14) + 0x34 = YPos -DWORD(CPed+0x14) + 0x38 = ZPos -DWORD(CPed+0x14) + 0x0 to 0x2C is the rotation matrix -0x00B6F3B8 = Player CVehicle pointer. -0x00B6F5F0 = Player pointer. -0xBA6784 - Brightness [long] -0xBA6792 - Legend -0xBA676C - Radar Mode -0xBA6769 - Hud Mode -0xBA678C - Subtitles -0xBA6830 - Store gallery photos -0xBA6788 - Draw Distance [long] -0xBA6794 - Frame limiter -0xBA6793 - Widescreen -0xA9AE54 - Visual FX Quality -0xBA680C - Mip Mapping -0xBA6814 - Antialiasing [1 = off, 2 = 1, 3 = 2, 4 = 3] -0xBA6820 - Resolution [640x480=11, 800x400 = 12, 800x600=13, 1024x1068=15] -0xBA6798 - Radio Volume [0 through 64] -0xBA6797 - SFX Volume [0 through 64] -0xBA6799 - Radio Equalizer -0xBA6795 - Radio Auto-tune -0xBA67F8 - Usertrack/Play mode [0 = radio, 1 = random] -0xBA680D - Usertrack/Automatic Media Scan -0xBA679A - Radio Station [0 through 11, 12 = usertrack player] -0xBA6818 - Controller Configuration [0 = mouse+keys, 1 = joypad] -0xB6EC1C - Mouse sensivity [float] -0xC1CC02 - BYTE - Steer with mouse -0xC1CC03 - BYTE - Invert mouse vertically -B793D4: Float, Fat stat -B793D8: Float, Stamina stat -B793DC: Float, Muscle stat -B79496: Float, pistol stat -B79498: Float, silenced pistol stat -B7949C: Float, desert eagle stat -B794A0: Float, shotgun stat -B794A4: Float, sawn-off shotgun stat -B794A8: Float, combat shotgun stat -B794AC: Float, machine pistol stat -B794B0: Float, smg stat -B794B4: Float, AK47 stat -B794B8: Float, M4 stat - -0x96C048 Commerce Region, Loading Bay Garage -0x96C120 Unknown Garage -0x96C1F8 Unknown Garage near El Corona -0x96C2D0 Eight Ball Autos near El Corona -0x96C3A8 Unknown Garage near El Corona -0x96C480 Player Garage: El Corona -0x96C558 Unknown Garage near Playe del Seville -0x96C630 LowRider Tuning Garage in Willowfield -0x96C708 Pay'n Spray in Idlewood -0x96C7E0 Player Garage: Johnson House -0x96C8B8 Pay'n Spray in Temple -0x96C990 Transfender in Temple -0x96CA68 Pay'n Spray in Santa Maria Beach -0x96CB40 Player Garage: Santa Maria Beach -0x96CC18 Player Garage: Mulholland -0x96CCF0 Wheel Archangels in Ocean Flats -0x96CDC8 Unknown Garage in Ocean Flats -0x96CEA0 Player Garage: Hashbury -0x96CF78 Transfender near Wang Cars in Doherty -0x96D050 Pay'n Spray near Wang Cars in Doherty -0x96D128 Unknown Garage, Loading Bay near Doherty -0x96D200 Player Garage: Doherty -0x96D2D8 Unknown Garage in Doherty -0x96D3B0 Unknown Garage in Chinatown -0x96D488 Michelles Pay'n Spray in Downtown -0x96D560 Player Garage: Calton Heights -0x96D638 Police Garage in DownTown -0x96D710 Pay'n Spray in Juniper Hollow -0x96D7E8 Player Garage: Paradiso -0x96D8C0 Unknown Garage near Emerald Isle -0x96D998 Airport Plane Garage in Las Venturas -0x96DA70 Unknown Garage near Camel's Toe -0x96DB48 Pay'n Spray near Royal Casino -0x96DC20 Transfender in come-a-lot -0x96DCF8 Player Garage: Rockshore West -0x96DDD0 Welding Wedding Bomb-workshop in Emerald Isle -0x96DEA8 Pay'n Spray in Redsands East -0x96DF80 Player Garage: Redland West -0x96E058 Player Garage: Prickle Pine -0x96E130 Player Garage: Whitewood Estates -0x96E208 Pay'n Spray in El Quebrados -0x96E2E0 Pay'n Spray in Fort Carson -0x96E3B8 Player Garage: Fort Carson -0x96E490 Player Garage: Derdant Meadows -0x96E568 Unknown Garage in Bone County -0x96E640 Airport Garage in Verdant Meadows -0x96E718 Unknown Garage in Angel Pine -0x96E7F0 Pay'n Spray in Dillimore -0x96E8C8 Player Garage: Palomino Creek -0x96E9A0 Player Garage: Dillimore - -CPed + 0x544 = [float] Max health -CPed + 0x548 = [float] Armor -CPed + 0x5D8 = [dword] Pistol weapon type (9mm, silenced 9mm, desert eagle = 24) -CPed + 0x5DC = [dword] Pistol state -CPed + 0x5E0 = [dword] Pistol ammo in clip -CPed + 0x5E4 = [dword] Pistol total ammo (including clip) -CPed + 0x5E8 = [float] Unknown, increases each time you fire your weapon -CPed + 0x5EC = Unknown, is 0 for me -CPed + 0x5F0 = Unknown, is 0 for me, the game freezes when you change it to 1 -CPed + 0x5F4 = [dword] Shotgun weapon type (26 = sawn-off) -CPed + 0x5F8 = [dword] Shotgun state (1 = firing? 2 = reloading) -CPed + 0x5FC = [dword] Shotgun ammo in clip -CPed + 0x600 = [dword] Shotgun total ammo (including clip) -CPed + 0x604 = [float] Unknown, increases each time you fire your weapon, 0 when weapon not active? -CPed + 0x608 = Unknown, is 0 for me -CPed + 0x60C = Unknown, is 0 for me -0xB7CDBC [dword] current weapon slot -0xBAB22C [4 bytes] = health bar color (RGBA) in bytes -0xBAB230 [4 bytes] = money font color (RGBA) in bytes - - \ No newline at end of file From d0608095bbab38e160a6eb7ed2291958bed8e1a1 Mon Sep 17 00:00:00 2001 From: muki Date: Wed, 20 Feb 2019 20:07:34 -0800 Subject: [PATCH 10/30] changed license type to MIT. --- LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..998248c --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Kessec / The SAMPAHK Team + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From cdc2d8b1804f827004360bd108b21e38c3dbb7ea Mon Sep 17 00:00:00 2001 From: muki Date: Wed, 20 Feb 2019 20:07:46 -0800 Subject: [PATCH 11/30] Delete LICENSE.txt --- LICENSE.txt | 165 ---------------------------------------------------- 1 file changed, 165 deletions(-) delete mode 100644 LICENSE.txt diff --git a/LICENSE.txt b/LICENSE.txt deleted file mode 100644 index 0a04128..0000000 --- a/LICENSE.txt +++ /dev/null @@ -1,165 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. From 88ac927bb297447fd824e60b459545f06d52b139 Mon Sep 17 00:00:00 2001 From: muki Date: Wed, 20 Feb 2019 20:07:56 -0800 Subject: [PATCH 12/30] Rename LICENSE to LICENSE.txt --- LICENSE => LICENSE.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename LICENSE => LICENSE.txt (100%) diff --git a/LICENSE b/LICENSE.txt similarity index 100% rename from LICENSE rename to LICENSE.txt From bdee347b79c473cb86457862bc7e643906f9cb1d Mon Sep 17 00:00:00 2001 From: muki Date: Wed, 20 Feb 2019 20:13:08 -0800 Subject: [PATCH 13/30] Update README.md --- README.md | 44 ++++---------------------------------------- 1 file changed, 4 insertions(+), 40 deletions(-) diff --git a/README.md b/README.md index 3379dd6..9025358 100644 --- a/README.md +++ b/README.md @@ -35,47 +35,11 @@ SetWorkingDir %A_ScriptDir% #SingleInstance force #include %A_ScriptDir%\SAMP.ahk -Hotkey, Enter, Off -Hotkey, Escape, Off -bchat:=0 -return - -+T:: -~t:: -Suspend On -Hotkey, Enter, On -Hotkey, Escape, On -Hotkey, t, Off -return - -~NumpadEnter:: -~Enter:: -Suspend Permit -Suspend Off -Hotkey, t, On -Hotkey, Enter, Off -Hotkey, Escape, Off -return - -~Escape:: -Suspend Permit -Suspend Off -Hotkey, t, On -Hotkey, Enter, Off -Hotkey, Escape, Off -return - -Numpad1:: -SendInput tName:{Space} -Suspend On -Hotkey, Enter, On -Hotkey, Escape, On -Input varName, V I M,{enter} -SendInput {end}+{home}{Del}{esc} -varID := getPlayerIdByName(varName) -showGameText(getPlayerNameById(varID) "~n~Score: " getPlayerScoreById(varID) "~n~Ping: " getPlayerPingById(varID), 2000, 5) -return +F1:: + global lCM := getLastChatMessage() + addMessageToChatWindow(lCM) + return ``` ### REQUIREMENTS #### [AutoHotKey](https://autohotkey.com) (32bit!) From bb35b07e81ab5eadb8d06e19adad3f71d65f256b Mon Sep 17 00:00:00 2001 From: muki Date: Thu, 21 Feb 2019 14:05:09 -0800 Subject: [PATCH 14/30] Update SAMP.ahk --- SAMP.ahk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SAMP.ahk b/SAMP.ahk index 308cd19..b1a643e 100644 --- a/SAMP.ahk +++ b/SAMP.ahk @@ -1,5 +1,5 @@ ; #### SAMPAHK #### -; https://github.com/sampudf/SAMPAHK +; https://github.com/kessec/SAMPAHK ; #################### ; UPDATE THIS OR YOUR MERGE WILL BE CLOSED. From ba80f0a51982489ef121ce4583dc3d50602884da Mon Sep 17 00:00:00 2001 From: muki Date: Tue, 21 Apr 2020 21:46:24 -0700 Subject: [PATCH 15/30] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 2d1df37..48296e2 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,7 @@ SetWorkingDir %A_ScriptDir% #NoEnv #SingleInstance force #include %A_ScriptDir%\SAMP.ahk +``` ### REQUIREMENTS #### [AutoHotKey](https://autohotkey.com) (32bit!) From 3f1a956abbd10be4e6bc23674edff504f3aae7b8 Mon Sep 17 00:00:00 2001 From: muki Date: Tue, 21 Apr 2020 21:46:35 -0700 Subject: [PATCH 16/30] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 48296e2..2c6be8f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -## SAMPAHK (V0.2) +## SAMPAHK (v0.2) ![Image of Build Status](https://ci.appveyor.com/api/projects/status/ys6gm8pk3xg02pvx?svg=true) From afaccf9698e944a13d90ed0c5e5263903ab8867e Mon Sep 17 00:00:00 2001 From: muki Date: Wed, 29 Apr 2020 04:00:49 -0700 Subject: [PATCH 17/30] Version 0.3.0 -README.md- - Some text edited. - SAMPAHK.ahk- - WriteFloat() function added. - WriteDWORD() function added. - Gun Recoil Address added. - CPed broken anim addresses removed. - editRecoil() Function added and working. - getGunType() Function added but not working. - getGunAmmo() Function added but not working. --- README.md | 7 ++--- SAMP.ahk | 79 ++++++++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 71 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 2c6be8f..ed0101f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -## SAMPAHK (v0.2) +## SAMPAHK (v0.3) ![Image of Build Status](https://ci.appveyor.com/api/projects/status/ys6gm8pk3xg02pvx?svg=true) @@ -11,9 +11,10 @@ Based off: [SAMPUDF](https://github.com/paul-phoenix/SAMP-UDF-for-AutoHotKey) by SAMPAHK is an API specifically made to be used inside of [AutoHotKey](https://www.ahkscript.org). A majority of the framework comes from the original repository made by paul-phoenix, linked above.The end goal for SAMPAHK is to be able to provide a more complete platform for SA-MP memory modding in AutoHotKey. If you have any issues with the program, please leave an issue ticket. ### SUPPORTED SAMP VERSIONS -_Currently. only [SA-MP Version 0.3.7 R1.](https://dracoblue.net/downloads/samp-client/)_ +_Currently. only [SA-MP Version 0.3.7 R1.](https://dracoblue.net/downloads/samp-client/) and Version 1 of the GTA SA Executable._ -### USAGE + +### USAGE #### (MAKE SURE THE SAMP.AHK FILE IS IN THE SAME DIRECTORY AS THE .AHK YOU ARE WRITING) #### Referencing the API in your script: diff --git a/SAMP.ahk b/SAMP.ahk index b1a643e..e09d594 100644 --- a/SAMP.ahk +++ b/SAMP.ahk @@ -3,7 +3,7 @@ ; #################### ; UPDATE THIS OR YOUR MERGE WILL BE CLOSED. -; SOFTWARE VERSION: v0.2.0 +; SOFTWARE VERSION: 0.3.0 ; ErrorLevels @@ -36,12 +36,6 @@ global ADDR_CPED_HPOFF := 0x540 global ADDR_CPED_ARMOROFF := 0x548 global ADDR_CPED_MONEY := 0xB7CE50 global ADDR_CPED_INTID := 0xA4ACE8 -; global ADDR_CPED_PEDSTATE := 0x530 -; global ADDR_CPED_RUNSTATE := 0x534 -; global ADDR_CPED_ANIM_STATE := 1247 -; global ADDR_CPED_ANIM_CROUCH := 1135 -; global ADDR_CPED_ANIM_JUMP := 1133 -; global ADDR_CPED_ANIM_GEN := 348 ;GTA Car Addresses global ADDR_VEHICLE_HPOFF := 0x4C0 @@ -55,7 +49,6 @@ global ADDR_CVEH_BIKE := 0x6C8 global ADDR_CVEH_BIKE_FTIRE := 0x65E global ADDR_CVEH_BIKE_RTIRE := 0x65F - ;GTA Enviroment Addresses global ADDR_CURRENT_WEATHER := 0xC81320 global ADDR_CURRENT_GRAVITY := 0x863984 @@ -68,8 +61,6 @@ global ADDR_POSITION_Z := 0xB6F2EC global ADDR_MOUSE_SENS := 0xB6EC1C global ADDR_HBAR_COLOR := 0xBAB22C global ADDR_MFONT_COLOR := 0xBAB230 -; global ADDR_TEXT_BSTUNT := 0xBAB040 -; global ADDR_TEXT_TMIDDLE := 0xBAAEC0 global ADDR_MENU_CID := 0x15D global ADDR_MENU_IHOVER := 0x78D global ADDR_MENU_SELECT := 0x54 @@ -80,6 +71,7 @@ global ADDR_MENU_MAPY := 0x6C global ADDR_MENU_PLAYINMENU := 0x5C ; GTA Gun Addresses +global ADDR_GUN_RECOIL := 0x858CEC global ADDR_CPED_GUN := 0x740 global ADDR_CPED_PISTOLAMMO := 0x5E0 global ADDR_CPED_SHOTGUNAMMO := 0x5FC @@ -162,7 +154,7 @@ global bCheckSizeOnce := 1 ; # - getUsername() get local player name # ; # - getId() get local player id # ; # - sendChatMessage(wText) send a message to the server # -; # - getLastChatMessage() get the last message added to the ChatBox # +; # - getLastChatMessage() get the last message added to the ChatBox # ; # - addMessageToChatWindow(wText) add a "private" text to the chatbox # ; # - showGameText(wText, dwTime, dwTextsize) show a text on the sreen # ; # - showDialog(dwStyle, wCaption, show a dialog-box # @@ -194,6 +186,11 @@ global bCheckSizeOnce := 1 ; # - getPlayerInteriorId() get interior id # ; # - getPlayerMoney() get player money # ; ##################################################################################################################### +; # Gun Functions : # +; # - editRecoil() changes the recoil/spread # +; # - getGunType() gets the type of gun the local player has in hand. # +; # - getGunAmmo() gets the current ammo in the gun in hand. # +; ##################################################################################################################### ; # Vehicle Functions: # ; # - isPlayerInAnyVehicle() check if the local player is inside some vehicle # ; # - isPlayerDriver() check if player is driver # @@ -325,7 +322,7 @@ sendChatMessage(wText) { getLastChatMessage(){ if(!checkHandles()) return "" - dwAddress := dwSAMP + ADDR_SAMP_CHATMSG_PTR + dwAddress := dwSAMP + ADDR_SAMP_CHATMSG_PTR currentAddress := readDWORD(hGTA, dwAddress) + SAMP_LAST_CHAT_MESSAGE_OFFSET if(ErrorLevel) { ErrorLevel := ERROR_READ_MEMORY @@ -1401,6 +1398,16 @@ GetChatLine(Line, ByRef Output, timestamp=0, color=0) output := RegExReplace(output, "Ui)\{[a-f0-9]{6}\}") return } + +; -1 = Error +editRecoil(wValue) +{ + if(!checkHandles()) + return -1 + + writeFloat(hGTA, ADDR_GUN_RECOIL, wValue) +} + ;################################################## /* @@ -2058,6 +2065,30 @@ readFloat(hProcess, dwAddress) { return NumGet(dwRead, 0, "Float") } +;internal Stuff +writeFloat(hProcess, dwAddress, dwValue) { + if(!hProcess) { + ErrorLevel := ERROR_INVALID_HANDLE + return 0 + } + + VarSetCapacity(dwWrite, 4) ; float = 4 + dwRet := DllCall( "WriteProcessMemory" + , "UInt", hProcess + , "UInt", dwAddress + , "Float*", dwValue + , "Uint", 4 + , "Uint*", 0) + if(dwRet == 0) { + ErrorLevel := ERROR_WRITE_MEMORY + return 0 + } + + ErrorLevel := ERROR_OK + return 1 +} + + ; internal stuff readDWORD(hProcess, dwAddress) { if(!hProcess) { @@ -2081,6 +2112,30 @@ readDWORD(hProcess, dwAddress) { return NumGet(dwRead, 0, "UInt") } +; internal stuff +writeDWORD(hProcess, dwAddress, dwValue) { + if(!hProcess) { + ErrorLevel := ERROR_INVALID_HANDLE + return 0 + } + + VarSetCapacity(dwWrite, 4) ; DWORD = 4 + dwRet := DllCall( "WriteProcessMemory" + , "UInt", hProcess + , "UInt", dwAddress + , "Str*", dwValue + , "Uint", 4 + , "Uint*", 0) + if(dwRet == 0) { + ErrorLevel := ERROR_WRITE_MEMORY + return 0 + } + + ErrorLevel := ERROR_OK + return 1 +} + + ; internal stuff readMem(hProcess, dwAddress, dwLen=4, type="UInt") { if(!hProcess) { From 056bdac949606bef46f7b8fed7527ddf55308dda Mon Sep 17 00:00:00 2001 From: muki Date: Wed, 29 Apr 2020 04:01:53 -0700 Subject: [PATCH 18/30] Delete LICENSE.txt --- LICENSE.txt | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 LICENSE.txt diff --git a/LICENSE.txt b/LICENSE.txt deleted file mode 100644 index 998248c..0000000 --- a/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2019 Kessec / The SAMPAHK Team - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. From e590286afc606954dad7ecd303853cd1eac8311f Mon Sep 17 00:00:00 2001 From: muki Date: Wed, 29 Apr 2020 04:05:31 -0700 Subject: [PATCH 19/30] Create LICENSE --- LICENSE | 165 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..0a04128 --- /dev/null +++ b/LICENSE @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. From b1f0e8b731fbf1c3add280142c9bd6ffa228246a Mon Sep 17 00:00:00 2001 From: muki Date: Wed, 29 Apr 2020 04:17:01 -0700 Subject: [PATCH 20/30] Update README.md --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index ed0101f..2065740 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,5 @@ ## SAMPAHK (v0.3) -![Image of Build Status](https://ci.appveyor.com/api/projects/status/ys6gm8pk3xg02pvx?svg=true) - Based off: [SAMPUDF](https://github.com/paul-phoenix/SAMP-UDF-for-AutoHotKey) by paul-phoenix ### [CODE DOCUMENTATION](https://github.com/sampudf/SAMPAHK/wiki) From f612dea2ad82fa1eb3412c662e7694c151270ec4 Mon Sep 17 00:00:00 2001 From: muki Date: Wed, 29 Apr 2020 10:03:16 -0700 Subject: [PATCH 21/30] Initial 0.4.0 Setup --- README.md | 4 ++-- SAMP.ahk | 10 +++++++--- SAMPAHK.asi | Bin 0 -> 83968 bytes 3 files changed, 9 insertions(+), 5 deletions(-) create mode 100644 SAMPAHK.asi diff --git a/README.md b/README.md index 874b365..78f346e 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -## SAMPAHK (0.3.0) +## SAMPAHK (0.4.0) Based off: [SAMPUDF](https://github.com/paul-phoenix/SAMP-UDF-for-AutoHotKey) by paul-phoenix @@ -6,7 +6,7 @@ Based off: [SAMPUDF](https://github.com/paul-phoenix/SAMP-UDF-for-AutoHotKey) by ### Synopsis -SAMPAHK is an API specifically made to be used inside of [AutoHotKey](https://www.ahkscript.org). A majority of the framework comes from the original repository made by paul-phoenix, linked above.The end goal for SAMPAHK is to be able to provide a more complete platform for SA-MP memory modding in AutoHotKey. If you have any issues with the program, please leave an issue ticket. +SAMPAHK is an API specifically made to be used inside of [AutoHotKey](https://www.ahkscript.org). A part of the framework comes from the original repository made by paul-phoenix, linked above. The end goal for SAMPAHK is to be able to provide a more complete platform for SA-MP memory modding in AutoHotKey. If you have any issues with the program, please leave an issue ticket. ### SUPPORTED SAMP VERSIONS _Currently. only [SA-MP Version 0.3.7 R1.](https://dracoblue.net/downloads/samp-client/) and Version 1 of the GTA SA Executable._ diff --git a/SAMP.ahk b/SAMP.ahk index b85de16..dd2c7ae 100644 --- a/SAMP.ahk +++ b/SAMP.ahk @@ -1,9 +1,9 @@ ; #### SAMPAHK #### ; https://github.com/kessec/SAMPAHK -; #################### +; ################################ ; UPDATE THIS OR YOUR MERGE WILL BE CLOSED. -; SOFTWARE VERSION: 0.3.0 +; SOFTWARE VERSION: 0.4.0 ; ErrorLevels @@ -23,6 +23,10 @@ global ERROR_WAIT_FOR_OBJECT := 12 global ERROR_CREATE_THREAD := 13 +; Address Styling: +; Similar to this: ADDR_POINTER_INFO +; Example: ADDR_CPED_HPOFF is dependent on the CPED pointer and is the offset for HP information. + ;GTA Control Block Addresses global ADDR_CPED_PTR := 0xB6F5F0 global ADDR_VEHICLE_PTR := 0xBA18FC @@ -322,7 +326,7 @@ sendChatMessage(wText) { getLastChatMessage(){ if(!checkHandles()) return "" - + dwAddress := dwSAMP + ADDR_SAMP_CHATMSG_PTR currentAddress := readDWORD(hGTA, dwAddress) + SAMP_LAST_CHAT_MESSAGE_OFFSET if(ErrorLevel) { diff --git a/SAMPAHK.asi b/SAMPAHK.asi new file mode 100644 index 0000000000000000000000000000000000000000..c165f174d3de7ea368e87c7129d224a2e6dd6fc6 GIT binary patch literal 83968 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 Date: Wed, 29 Apr 2020 10:04:12 -0700 Subject: [PATCH 22/30] Update 1 for 0.4.0 --- SAMPAHK.asi | Bin 83968 -> 0 bytes SAMPAHKASI.cpp | 56 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) delete mode 100644 SAMPAHK.asi create mode 100644 SAMPAHKASI.cpp diff --git a/SAMPAHK.asi b/SAMPAHK.asi deleted file mode 100644 index c165f174d3de7ea368e87c7129d224a2e6dd6fc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83968 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 +#include +#include +#include +#include "shellapi.h" +#include + +// SAMP AHK ASI +// by mister muki & Kessec Development +// Software Version: 0.1.0 + +using namespace plugin; + +class SAMPAHKASI { +public: + std::string workingdir() + { + char buf[256]; + GetCurrentDirectoryA(256, buf); + return std::string(buf) + '\\'; + } + + SAMPAHKASI() { + std::string a = workingdir(); + std::string path = a + "sam\\sam.exe"; + + // additional information + STARTUPINFOA si; + PROCESS_INFORMATION pi; + + // set the size of the structures + ZeroMemory(&si, sizeof(si)); + si.cb = sizeof(si); + ZeroMemory(&pi, sizeof(pi)); + + // start the program up + CreateProcess + ( + path.c_str(), // the path + NULL, // Command line + NULL, // Process handle not inheritable + NULL, // Thread handle not inheritable + FALSE, // Set handle inheritance to FALSE + 0, // Opens file in a separate console + NULL, // Use parent's environment block + NULL, // Use parent's starting directory + &si, // Pointer to STARTUPINFO structure + &pi // Pointer to PROCESS_INFORMATION structure + ); + // Close process and thread handles. + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + } + // int haha = system("F:\\GitHub\\test.ahk"); + } sAMPAHKASI; From 6cda93d932f396ab82da6c062b07024bf4a51a97 Mon Sep 17 00:00:00 2001 From: muki Date: Wed, 29 Apr 2020 10:05:38 -0700 Subject: [PATCH 23/30] Create LICENSE --- LICENSE | 165 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..0a04128 --- /dev/null +++ b/LICENSE @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. From 23accf4b884df167e6abbc4091827aa31c621a5e Mon Sep 17 00:00:00 2001 From: muki Date: Wed, 29 Apr 2020 10:05:48 -0700 Subject: [PATCH 24/30] Delete LICENSE.txt --- LICENSE.txt | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 LICENSE.txt diff --git a/LICENSE.txt b/LICENSE.txt deleted file mode 100644 index 998248c..0000000 --- a/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2019 Kessec / The SAMPAHK Team - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. From 007b2ac46a06d79d8829ef4d68b707028d22dc6d Mon Sep 17 00:00:00 2001 From: muki Date: Wed, 29 Apr 2020 10:06:49 -0700 Subject: [PATCH 25/30] Update 2 for 0.4.0 --- SAMPAHKASI.cpp | 56 -------------------------------------------------- 1 file changed, 56 deletions(-) delete mode 100644 SAMPAHKASI.cpp diff --git a/SAMPAHKASI.cpp b/SAMPAHKASI.cpp deleted file mode 100644 index 7c3a43b..0000000 --- a/SAMPAHKASI.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include "plugin.h" -#include -#include -#include -#include -#include "shellapi.h" -#include - -// SAMP AHK ASI -// by mister muki & Kessec Development -// Software Version: 0.1.0 - -using namespace plugin; - -class SAMPAHKASI { -public: - std::string workingdir() - { - char buf[256]; - GetCurrentDirectoryA(256, buf); - return std::string(buf) + '\\'; - } - - SAMPAHKASI() { - std::string a = workingdir(); - std::string path = a + "sam\\sam.exe"; - - // additional information - STARTUPINFOA si; - PROCESS_INFORMATION pi; - - // set the size of the structures - ZeroMemory(&si, sizeof(si)); - si.cb = sizeof(si); - ZeroMemory(&pi, sizeof(pi)); - - // start the program up - CreateProcess - ( - path.c_str(), // the path - NULL, // Command line - NULL, // Process handle not inheritable - NULL, // Thread handle not inheritable - FALSE, // Set handle inheritance to FALSE - 0, // Opens file in a separate console - NULL, // Use parent's environment block - NULL, // Use parent's starting directory - &si, // Pointer to STARTUPINFO structure - &pi // Pointer to PROCESS_INFORMATION structure - ); - // Close process and thread handles. - CloseHandle(pi.hProcess); - CloseHandle(pi.hThread); - } - // int haha = system("F:\\GitHub\\test.ahk"); - } sAMPAHKASI; From 336a5ddbb439b3fde60545d4c23fb3eaaadb4c8e Mon Sep 17 00:00:00 2001 From: muki Date: Sun, 3 May 2020 06:44:07 -0700 Subject: [PATCH 26/30] Version 0.4.0 - Added the SAM Core. Handles all the logging, launching of AHKS, and closing on game close. - Added Returns in a couple places on SAMP.ahk --- SAM.ahk | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ SAMP.ahk | 8 ++++++-- 2 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 SAM.ahk diff --git a/SAM.ahk b/SAM.ahk new file mode 100644 index 0000000..bc0c0d5 --- /dev/null +++ b/SAM.ahk @@ -0,0 +1,55 @@ +; #### SAMPAHK #### +; https://github.com/kessec/SAMPAHK +; ################################ + +; UPDATE THIS OR YOUR MERGE WILL BE CLOSED. +; SOFTWARE VERSION: 0.4.0 +Version := "Version: 0.4.0" + + +#NoEnv +SendMode Input +SetWorkingDir %A_ScriptDir% +#IfWinActive GTA:SA:MP +#Persistent + +PIDS := Array() +Names := Array() +logLoc = %A_ScriptDir%\log.txt + +FormatTime, tsVar, T12, Time +FileDelete, %logLoc% +FileAppend,/$$$$$$ /$$$$$$ /$$ /$$ /$$$$$$$ /$$$$$$ /$$ /$$ /$$ /$$`n/$$__ $$ /$$__ $$| $$$ /$$$| $$__ $$ /$$__ $$| $$ | $$| $$ /$$/`n| $$ \__/| $$ \ $$| $$$$ /$$$$| $$ \ $$| $$ \ $$| $$ | $$| $$ /$$/`n| $$$$$$ | $$$$$$$$| $$ $$/$$ $$| $$$$$$$/| $$$$$$$$| $$$$$$$$| $$$$$/`n\____ $$| $$__ $$| $$ $$$| $$| $$____/ | $$__ $$| $$__ $$| $$ $$`n/$$ \ $$| $$ | $$| $$\ $ | $$| $$ | $$ | $$| $$ | $$| $$\ $$`n| $$$$$$/| $$ | $$| $$ \/ | $$| $$ | $$ | $$| $$ | $$| $$ \ $$`n\______/ |__/ |__/|__/ |__/|__/ |__/ |__/|__/ |__/|__/ \__/ `n, %logLoc% +FileAppend, %VersioN% `n`n, %logLoc% +FileAppend, %tsVar%: SAM Core successfully loaded.`n, %logLoc% +Sleep, 20000 + +Loop, %A_ScriptDir%\sam_mods\*.ahk{ + Run, %A_LoopFileFullPath% ,,, vPID + SplitPath % A_LoopFileFullPath,,,, name + Names.push(name) + FormatTime, tsVar, T12, Time + FileAppend, %tsVar%: %name% successfully loaded.`n, %logLoc% + PIDS.push(vPID) + } + +Loop, %A_ScriptDir%\sam_mods\*.exe{ + Run, %A_LoopFileFullPath% + SplitPath % A_LoopFileFullPath, name + Names.push(name) + FormatTime, tsVar, T12, Time + FileAppend, %tsVar%: %name% successfully loaded.`n, %logLoc% + PIDS.push(vPID) +} + +while(true) +{ + if(!WinExist("GTA:SA:MP")){ + Loop % PIDS.Length() + { + vTemp := PIDS[A_Index] + Process, Close, %vTemp% + } + ExitApp +} +} diff --git a/SAMP.ahk b/SAMP.ahk index dd2c7ae..8092af3 100644 --- a/SAMP.ahk +++ b/SAMP.ahk @@ -5,7 +5,6 @@ ; UPDATE THIS OR YOUR MERGE WILL BE CLOSED. ; SOFTWARE VERSION: 0.4.0 - ; ErrorLevels global ERROR_OK := 0 global ERROR_PROCESS_NOT_FOUND := 1 @@ -1352,7 +1351,6 @@ isGameIntialized(){ return true } } -return ;By GoodBlokeAri aka David_Luchs getTargetPed() @@ -1411,6 +1409,7 @@ editRecoil(wValue) return -1 writeFloat(hGTA, ADDR_GUN_RECOIL, wValue) + return } ;################################################## @@ -1819,6 +1818,7 @@ initZonesAndCities() { AddZone("Las Venturas", 869.461, 596.349, -242.990, 2997.060, 2993.870, 900.000) AddZone("Red County", -1213.910, -768.027, -242.990, 2997.060, 596.349, 900.000) AddZone("Los Santos", 44.615, -2892.970, -242.990, 2997.060, -768.027, 900.000) + return } ; internal stuff @@ -1832,6 +1832,7 @@ AddZone(sName, x1, y1, z1, x2, y2, z2) { zone%nZone%_y2 := y2 zone%nZone%_z2 := z2 nZone := nZone + 1 + return } ; internal stuff @@ -1845,6 +1846,7 @@ AddCity(sName, x1, y1, z1, x2, y2, z2) { city%nCity%_y2 := y2 city%nCity%_z2 := z2 nCity := nCity + 1 + return } ; ##### Memory Stuff ##### @@ -2430,3 +2432,5 @@ __unicodeToAnsi(wString, nLen = 0) { , "Uint", 0) return sString } + +return From 9bc8a3d65042682aaab408b9afcd37ccafaffcfc Mon Sep 17 00:00:00 2001 From: muki Date: Sun, 3 May 2020 09:02:23 -0700 Subject: [PATCH 27/30] Version 0.5.0 - Removed SAMPTest.ahk - Updated SAM.ahk to include logging functions. (Loading and Closing) - Fixed sendToDebug(), logDebug() --- README.md | 2 +- SAM.ahk | 12 +++-- SAMP.ahk | 6 +-- SAMPTest.ahk | 126 --------------------------------------------------- 4 files changed, 12 insertions(+), 134 deletions(-) delete mode 100644 SAMPTest.ahk diff --git a/README.md b/README.md index 78f346e..d8acc72 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -## SAMPAHK (0.4.0) +## SAMPAHK (0.5.0) Based off: [SAMPUDF](https://github.com/paul-phoenix/SAMP-UDF-for-AutoHotKey) by paul-phoenix diff --git a/SAM.ahk b/SAM.ahk index bc0c0d5..5bef3b7 100644 --- a/SAM.ahk +++ b/SAM.ahk @@ -3,11 +3,10 @@ ; ################################ ; UPDATE THIS OR YOUR MERGE WILL BE CLOSED. -; SOFTWARE VERSION: 0.4.0 -Version := "Version: 0.4.0" +; SOFTWARE VERSION: 0.5.0 +Version := "Version: 0.5.0" - -#NoEnv +#NoEnv SendMode Input SetWorkingDir %A_ScriptDir% #IfWinActive GTA:SA:MP @@ -47,9 +46,14 @@ while(true) if(!WinExist("GTA:SA:MP")){ Loop % PIDS.Length() { + FormatTime, tsVar, T12, Time vTemp := PIDS[A_Index] + vName := Names[A_Index] + FileAppend, %tsVar%: %vName% sucessfully closed.`n, %logLoc% Process, Close, %vTemp% } + FormatTime, tsVar, T12, Time + FileAppend, %tsVar%: SAM Core sucessfully closed.`n, %logLoc% ExitApp } } diff --git a/SAMP.ahk b/SAMP.ahk index 8092af3..81491a5 100644 --- a/SAMP.ahk +++ b/SAMP.ahk @@ -3,7 +3,7 @@ ; ################################ ; UPDATE THIS OR YOUR MERGE WILL BE CLOSED. -; SOFTWARE VERSION: 0.4.0 +; SOFTWARE VERSION: 0.5.0 ; ErrorLevels global ERROR_OK := 0 @@ -1306,7 +1306,7 @@ calculateCity(posX, posY, posZ) { ; sends a string to the debug text file, good for checking if chunks of code work. (Included due to ease of access for me.) sendToDebug(tString){ -dbLoc = %A_ScriptDir%\debug.txt +dbLoc = %A_ScriptDir%\log.txt FormatTime, tsVar, R FileAppend, @@ -1319,7 +1319,7 @@ FileAppend, ; logging basic debugging information (Work In Progress) logDebug(){ -dbLoc = %A_ScriptDir%\debug.txt +dbLoc = %A_ScriptDir%\log.txt uN := getUsername() gC := getCoordinates() gPH := getPlayerHealth() diff --git a/SAMPTest.ahk b/SAMPTest.ahk deleted file mode 100644 index fe7a51a..0000000 --- a/SAMPTest.ahk +++ /dev/null @@ -1,126 +0,0 @@ -SendMode Input -SetWorkingDir %A_ScriptDir% -#Warn -#UseHook -#NoEnv -#SingleInstance force -#include %A_ScriptDir%\SAMP.ahk - -Hotkey, Enter, Off -Hotkey, Escape, Off - -bchat:=0 -return - -+T:: -~t:: -Suspend On -Hotkey, Enter, On -Hotkey, Escape, On -Hotkey, t, Off -return - -~NumpadEnter:: -~Enter:: -Suspend Permit -Suspend Off -Hotkey, t, On -Hotkey, Enter, Off -Hotkey, Escape, Off -return - -~Escape:: -Suspend Permit -Suspend Off -Hotkey, t, On -Hotkey, Enter, Off -Hotkey, Escape, Off -return - - -;######################################################################################################### - - -;Type in a nickname and it shows some info about this player -Numpad1:: -SendInput tName:{Space} -Suspend On -Hotkey, Enter, On -Hotkey, Escape, On -Input varName, V I M,{enter} -SendInput {end}+{home}{Del}{esc} -varID := getPlayerIdByName(varName) -showGameText(getPlayerNameById(varID) "~n~Score: " getPlayerScoreById(varID) "~n~Ping: " getPlayerPingById(varID), 2000, 5) -return - -;Type in a ID and it shows some info about this player -Numpad2:: -SendInput tID:{Space} -Suspend On -Hotkey, Enter, On -Hotkey, Escape, On -Input varID, V I M,{enter} -SendInput {end}+{home}{Del}{esc} -;updateScoreboardData() ;wird nun implizit aufgerufen -showGameText(getPlayerNameById(varID) "~n~Score: " getPlayerScoreById(varID) "~n~Ping: " getPlayerPingById(varID) "~n~IsNPC: " isNPCById(varID), 2000, 5) -return - -;play an "audio stream" -Numpad3:: -playAudioStream("http://breakz.us/radio/listen.pls") -return - -;stopp an "audio stream" -Numpad4:: -stopAudioStream() -return - -;show some info about the local player, use some functions -Numpad5:: -if ( isInChat() ) - return -addMessageToChatWindow("{FFFFFF}IP: {FF0000}" getIP() "{FFFFFF}, Hostname: {FF0000}" getHostname()) -addMessageToChatWindow("{FFFFFF}Players: {FF0000}" countOnlinePlayers()) -addMessageToChatWindow("{FFFFFF}Name: {FF0000}" getUsername()) -addMessageToChatWindow("{FFFFFF}HP: {FF0000}" getPlayerHealth() "{FFFFFF}, ARMOR: {FF0000}" getPlayerArmor()) -addMessageToChatWindow("{FFFFFF}Money: {FF0000}" getPlayerMoney()) -addMessageToChatWindow("{FFFFFF}Interior id: {FF0000}" getPlayerInteriorId()) -pos := getCoordinates() -addMessageToChatWindow("{FFFFFF}Zone: {FF0000}" calculateZone(pos[1],pos[2],pos[3]) "{FFFFFF}, Stadt: {FF0000}" calculateCity(pos[1],pos[2],pos[3])) -sendChatMessage("blub") -sendChatMessage("/asd") -showGameText("test", 2000, 5) -return - -;shows a dialog-box -Numpad6:: -showDialog(5, "Titel", "Weapon`tPrice`tAmmo`nDeagle`t$5000`t100`nSawnoff`t$5000`t100`nPistol`t$1000`t50", "OK" ) -return - -;show some info about the current vehicle -Numpad7:: -addMessageToChatWindow("{FFFFFF}Vehicle Type:" getVehicleType()) -addMessageToChatWindow("{FFFFFF}Model:" getVehicleModelId()) -addMessageToChatWindow("{FFFFFF}Model Name:" getVehicleModelName()) -addMessageToChatWindow("{FFFFFF}Is Driver:" isPlayerDriver()) -addMessageToChatWindow("{FFFFFF}Light State:" getVehicleLightState()) -addMessageToChatWindow("{FFFFFF}Engine State:" getVehicleEngineState()) -addMessageToChatWindow("{FFFFFF}Door State:" getVehicleLockState()) -return - -Numpad8:: -addMessageToChatWindow("{FFFFFF}block chat " (bchat ? "{FF0000}off" : "{00FF00}on")) -if(bchat) - unBlockChatInput() -else - blockChatInput() -bchat:=!bchat -return - -; Sending a string to the debug.txt with sendToDebug() and logging the current conditions with logDebug() if the game is currently initalized. -NumPad9:: -init := isGameIntialized() -if(init){ -sendToDebug("Sample Text") -logDebug() -return From 12476e5535e8b674eb9cb057b0468be6b9716e65 Mon Sep 17 00:00:00 2001 From: muki Date: Mon, 4 May 2020 06:58:34 -0700 Subject: [PATCH 28/30] Version 0.6.0 - Fixed logging comamnds in SAMP.ahk - Removed logDebug() because it's useless. - SAM Core now logs the version of itself and of SAMP.AHK - Attempted fix for Issue #11 --- README.md | 2 +- SAM.ahk | 20 +++++++++++---- SAMP.ahk | 76 +++++++++++++++++++------------------------------------ 3 files changed, 42 insertions(+), 56 deletions(-) diff --git a/README.md b/README.md index d8acc72..e505418 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -## SAMPAHK (0.5.0) +## SAMPAHK (0.6.0) Based off: [SAMPUDF](https://github.com/paul-phoenix/SAMP-UDF-for-AutoHotKey) by paul-phoenix diff --git a/SAM.ahk b/SAM.ahk index 5bef3b7..460fe6a 100644 --- a/SAM.ahk +++ b/SAM.ahk @@ -1,10 +1,18 @@ -; #### SAMPAHK #### +; /$$$$$$ /$$$$$$ /$$ /$$ /$$$$$$$ /$$$$$$ /$$ /$$ /$$ /$$ +; /$$__ $$ /$$__ $$| $$$ /$$$| $$__ $$ /$$__ $$| $$ | $$| $$ /$$/ +;| $$ \__/| $$ \ $$| $$$$ /$$$$| $$ \ $$| $$ \ $$| $$ | $$| $$ /$$/ +;| $$$$$$ | $$$$$$$$| $$ $$/$$ $$| $$$$$$$/| $$$$$$$$| $$$$$$$$| $$$$$/ +; \____ $$| $$__ $$| $$ $$$| $$| $$____/ | $$__ $$| $$__ $$| $$ $$ +; /$$ \ $$| $$ | $$| $$\ $ | $$| $$ | $$ | $$| $$ | $$| $$\ $$ +;| $$$$$$/| $$ | $$| $$ \/ | $$| $$ | $$ | $$| $$ | $$| $$ \ $$ +; \______/ |__/ |__/|__/ |__/|__/ |__/ |__/|__/ |__/|__/ \__/ +; +; ################################ ; https://github.com/kessec/SAMPAHK ; ################################ ; UPDATE THIS OR YOUR MERGE WILL BE CLOSED. -; SOFTWARE VERSION: 0.5.0 -Version := "Version: 0.5.0" +Version := "SAM CORE VERSION: 0.6.0" #NoEnv SendMode Input @@ -19,10 +27,12 @@ logLoc = %A_ScriptDir%\log.txt FormatTime, tsVar, T12, Time FileDelete, %logLoc% FileAppend,/$$$$$$ /$$$$$$ /$$ /$$ /$$$$$$$ /$$$$$$ /$$ /$$ /$$ /$$`n/$$__ $$ /$$__ $$| $$$ /$$$| $$__ $$ /$$__ $$| $$ | $$| $$ /$$/`n| $$ \__/| $$ \ $$| $$$$ /$$$$| $$ \ $$| $$ \ $$| $$ | $$| $$ /$$/`n| $$$$$$ | $$$$$$$$| $$ $$/$$ $$| $$$$$$$/| $$$$$$$$| $$$$$$$$| $$$$$/`n\____ $$| $$__ $$| $$ $$$| $$| $$____/ | $$__ $$| $$__ $$| $$ $$`n/$$ \ $$| $$ | $$| $$\ $ | $$| $$ | $$ | $$| $$ | $$| $$\ $$`n| $$$$$$/| $$ | $$| $$ \/ | $$| $$ | $$ | $$| $$ | $$| $$ \ $$`n\______/ |__/ |__/|__/ |__/|__/ |__/ |__/|__/ |__/|__/ \__/ `n, %logLoc% -FileAppend, %VersioN% `n`n, %logLoc% +FileAppend, %Version%`n, %logLoc% +FileReadLine, cVersion, %A_ScriptDir%\sam_mods\SAMP.ahk, 17 +FileAppend, %cVersion%`n`n, %logLoc% FileAppend, %tsVar%: SAM Core successfully loaded.`n, %logLoc% -Sleep, 20000 +Sleep, 20000 Loop, %A_ScriptDir%\sam_mods\*.ahk{ Run, %A_LoopFileFullPath% ,,, vPID SplitPath % A_LoopFileFullPath,,,, name diff --git a/SAMP.ahk b/SAMP.ahk index 81491a5..4761458 100644 --- a/SAMP.ahk +++ b/SAMP.ahk @@ -1,9 +1,21 @@ -; #### SAMPAHK #### +; /$$$$$$ /$$$$$$ /$$ /$$ /$$$$$$$ /$$$$$$ /$$ /$$ /$$ /$$ +; /$$__ $$ /$$__ $$| $$$ /$$$| $$__ $$ /$$__ $$| $$ | $$| $$ /$$/ +;| $$ \__/| $$ \ $$| $$$$ /$$$$| $$ \ $$| $$ \ $$| $$ | $$| $$ /$$/ +;| $$$$$$ | $$$$$$$$| $$ $$/$$ $$| $$$$$$$/| $$$$$$$$| $$$$$$$$| $$$$$/ +; \____ $$| $$__ $$| $$ $$$| $$| $$____/ | $$__ $$| $$__ $$| $$ $$ +; /$$ \ $$| $$ | $$| $$\ $ | $$| $$ | $$ | $$| $$ | $$| $$\ $$ +;| $$$$$$/| $$ | $$| $$ \/ | $$| $$ | $$ | $$| $$ | $$| $$ \ $$ +; \______/ |__/ |__/|__/ |__/|__/ |__/ |__/|__/ |__/|__/ \__/ +; +; ################################ ; https://github.com/kessec/SAMPAHK ; ################################ ; UPDATE THIS OR YOUR MERGE WILL BE CLOSED. -; SOFTWARE VERSION: 0.5.0 +; KEEP THE VERSION TEXT AT LINE 17 OR YOUR MERGE WILL BE CLOSED. +/* +SAMPAHK VERSION: 0.6.0 +*/ ; ErrorLevels global ERROR_OK := 0 @@ -26,7 +38,7 @@ global ERROR_CREATE_THREAD := 13 ; Similar to this: ADDR_POINTER_INFO ; Example: ADDR_CPED_HPOFF is dependent on the CPED pointer and is the offset for HP information. -;GTA Control Block Addresses +; GTA Control Block Addresses global ADDR_CPED_PTR := 0xB6F5F0 global ADDR_VEHICLE_PTR := 0xBA18FC global ADDR_CVEH_PTR := 0xB6F980 @@ -40,7 +52,7 @@ global ADDR_CPED_ARMOROFF := 0x548 global ADDR_CPED_MONEY := 0xB7CE50 global ADDR_CPED_INTID := 0xA4ACE8 -;GTA Car Addresses +; GTA Car Addresses global ADDR_VEHICLE_HPOFF := 0x4C0 global ADDR_VEHICLE_DOORSTATE := 0x4F8 global ADDR_VEHICLE_ENGINESTATE := 0x428 @@ -52,7 +64,7 @@ global ADDR_CVEH_BIKE := 0x6C8 global ADDR_CVEH_BIKE_FTIRE := 0x65E global ADDR_CVEH_BIKE_RTIRE := 0x65F -;GTA Enviroment Addresses +; GTA Enviroment Addresses global ADDR_CURRENT_WEATHER := 0xC81320 global ADDR_CURRENT_GRAVITY := 0x863984 global ADDR_ZONECODE := 0xA49AD4 @@ -83,7 +95,7 @@ global ADDR_CPED_SHOTGUNAMMO := 0x5FC ; global ADDR_GUN_AMMO := 08 ; global ADDR_GUN_RAMMO := 12 -;GTA Misc. Addresses +; GTA Misc. Addresses global ADDR_GARAGE_DOORSTATE := 0x4D @@ -1306,51 +1318,11 @@ calculateCity(posX, posY, posZ) { ; sends a string to the debug text file, good for checking if chunks of code work. (Included due to ease of access for me.) sendToDebug(tString){ -dbLoc = %A_ScriptDir%\log.txt - -FormatTime, tsVar, R -FileAppend, -( -%tsVar% -%tString% - -), %dbLoc% -} - -; logging basic debugging information (Work In Progress) -logDebug(){ -dbLoc = %A_ScriptDir%\log.txt -uN := getUsername() -gC := getCoordinates() -gPH := getPlayerHealth() -iPD := isPlayerDriver() -gVT := getVehicleType() -gVHI := getVehicleModelId() -gIP := getIP() -FormatTime, tsVar, T12, Time +logLoc = %A_ScriptDir%\..\log.txt -FileAppend, -( -%tsVar% -%uN%, %gC%, %gPH%, %iPD%, %gVT%, %gVHI%, %gIP% -ER = %ErrorLevel% - - -), %dbLoc% +FormatTime, tsVar, T12, Time +FileAppend, %tsVar%: %tString%.`n, %logLoc% } -return - -; uses checkHandles() to check if the game is initalized. (Work In Progress) -isGameIntialized(){ - if(!checkHandles()) - { - SendtoDebug("S1, IGI, F-cHC") - return false - } else { - SendtoDebug("S1, IGI, S-cHC") - return true - } - } ;By GoodBlokeAri aka David_Luchs getTargetPed() @@ -1402,12 +1374,16 @@ GetChatLine(Line, ByRef Output, timestamp=0, color=0) return } -; -1 = Error +; -1 = Error checking handles. +; -2 = In plane. editRecoil(wValue) { if(!checkHandles()) return -1 + if(getVehicleType() = 5) + return -2 + writeFloat(hGTA, ADDR_GUN_RECOIL, wValue) return } From 800cdef1752fdaaee2e091433a10c03f1a941d5f Mon Sep 17 00:00:00 2001 From: muki Date: Fri, 8 May 2020 20:15:28 -0700 Subject: [PATCH 29/30] Version 0.7.0 (SAMPAHK) - Added X, Y, Z Coord CPed offsets. - Added getPlayerRotation() - Added the getTargetPedCoordinates() function that returns the X,Y, and Z of a targeted ped. -Added writeFloat() -Added writeDWORD() -Added writeMem() --- SAMP.ahk | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 113 insertions(+), 4 deletions(-) diff --git a/SAMP.ahk b/SAMP.ahk index 4761458..60ab6c0 100644 --- a/SAMP.ahk +++ b/SAMP.ahk @@ -14,7 +14,7 @@ ; UPDATE THIS OR YOUR MERGE WILL BE CLOSED. ; KEEP THE VERSION TEXT AT LINE 17 OR YOUR MERGE WILL BE CLOSED. /* -SAMPAHK VERSION: 0.6.0 +SAMPAHK VERSION: 0.7.0 */ ; ErrorLevels @@ -71,6 +71,10 @@ global ADDR_ZONECODE := 0xA49AD4 global ADDR_POSITION_X := 0xB6F2E4 global ADDR_POSITION_Y := 0xB6F2E8 global ADDR_POSITION_Z := 0xB6F2EC +global ADDR_CPED_X_OFF := 0x30 +global ADDR_CPED_Y_OFF := 0x34 +global ADDR_CPED_Z_OFF := 0x38 +global ADDR_CPED_ROTZ := 0x558 ; GTA Menu Addresses global ADDR_MOUSE_SENS := 0xB6EC1C @@ -95,6 +99,10 @@ global ADDR_CPED_SHOTGUNAMMO := 0x5FC ; global ADDR_GUN_AMMO := 08 ; global ADDR_GUN_RAMMO := 12 +; GTA Cheat Addresses +global ADDR_CHEAT_INFRUN := 0xB7CEE4 + + ; GTA Misc. Addresses global ADDR_GARAGE_DOORSTATE := 0x4D @@ -200,6 +208,7 @@ global bCheckSizeOnce := 1 ; # - getPlayerArmor() get ARMOR # ; # - getPlayerInteriorId() get interior id # ; # - getPlayerMoney() get player money # +; # - getPlayerRotation() get the rotation of the player. # ; ##################################################################################################################### ; # Gun Functions : # ; # - editRecoil() changes the recoil/spread # @@ -221,6 +230,7 @@ global bCheckSizeOnce := 1 ; ##################################################################################################################### ; # Coordinates: # ; # - getCoordinates() get local player's position # +; # - getTargetPedCoordinates() get targeted player's position # ; # ----------------------------------------------------------------------------------------------------------------- # ; # - calculateZone(X, Y, Z) get zone # ; # - calculateCity(X, Y, Z) get city # @@ -236,7 +246,6 @@ global bCheckSizeOnce := 1 ; # - refreshGTA() # ; # - refreshSAMP() # ; # - refreshMemory() # -; # - isGameIntialized() -WORK IN PROGRESS- # ; # - getPID(szWindow) # ; # - openProcess(dwPID, dwRights) # ; # - closeProcess(hProcess) # @@ -246,6 +255,9 @@ global bCheckSizeOnce := 1 ; # - readDWORD(hProcess, dwAddress) # ; # - readMem(hProcess, dwAddress, dwLen=4, type="UInt") # ; # - writeString(hProcess, dwAddress, wString) # +; # - writeFloat(hProcess, dwAddress, dwValue) # +; # - writeDWORD(hProcess, dwAddress, dwValue) # +; # - writeMem(hProcess, dwAddress, dwValue, dwLen=4, type="UInt") # ; # - writeRaw(hProcess, dwAddress, data, dwLen) # ; # - callWithParams(hProcess, dwFunc, aParams, bCleanupStack = true) # ; # - virtualAllocEx(hProcess, dwSize, flAllocationType, flProtect) # @@ -257,8 +269,7 @@ global bCheckSizeOnce := 1 ; # - __unicodeToAnsi(wString, nLen = 0) # ; ##################################################################################################################### ; # Debug Functions: # -; # - sendToDebug(tString) # -; # - logDebug() # +; # - sendToDebug(tString) # # ; ##################################################################################################################### ; ##### SAMP-Functions ##### @@ -984,6 +995,34 @@ getPlayerMoney() { return money } + +; Creates an object that stores the Z rotation. +; Example +; o := getPlayerRotation() +; o[1] := Z in Rotation Matrix +; o[2] := Z in Degrees + + getPlayerRotation() { + if(!checkHandles()) + return -1 + + dwCPedPtr := readDWORD(hGTA, ADDR_CPED_PTR) + if(ErrorLevel) { + ErrorLevel := ERROR_READ_MEMORY + return -2 + } + + dwAddr := dwCPedPtr + ADDR_CPED_ROTZ + fRot := readFloat(hGTA, dwAddr) + if(ErrorLevel) { + ErrorLevel := ERROR_READ_MEMORY + return -1 + } + + ErrorLevel := ERROR_OK + return [fRot, fRot * -55.77] + } + ; ##### Vehicle Functions ##### ; 1 = local player is inside a vehicle @@ -1253,6 +1292,53 @@ getCoordinates() { return [fX, fY, fZ] } +; returns an object which contains targeted players position +; returns an empty string on error +; example: +; o := getTargetPedCoordinates() +; o[1] //x pos +; o[2] //y pos +; o[3] //z pos +getTargetPedCoordinates(){ + if(!checkHandles()) + return "" + + dwCPedPtr := getTargetPed() + if(ErrorLevel) { + ErrorLevel := ERROR_READ_MEMORY + return "" + } + + dwAddressPos := readDword(hGTA, dwCPedPtr + 0x14) + dwAddressX := dwAddressPos + ADDR_CPED_X_OFF + dwAddressY := dwAddressPos + ADDR_CPED_Y_OFF + dwAddressZ := dwAddressPos + ADDR_CPED_Z_OFF + + tpX := readFloat(hGTA, dwAddressX) + if(ErrorLevel) { + ErrorLevel := ERROR_READ_MEMORY + return "" + } + + tpY := readFloat(hGTA, dwAddressY) + if(ErrorLevel) { + ErrorLevel := ERROR_READ_MEMORY + return "" + } + + + tpZ := readFloat(hGTA, dwAddressZ) + if(ErrorLevel) { + ErrorLevel := ERROR_READ_MEMORY + return "" + } + + + ErrorLevel := ERROR_OK + return [tpX, tpY, tpZ] + } + + ; pass coordinates to get a zone name or get an empty string on error calculateZone(posX, posY, posZ) { posX += 0 @@ -2142,6 +2228,29 @@ readMem(hProcess, dwAddress, dwLen=4, type="UInt") { return NumGet(dwRead, 0, type) } +;interal stuff +writeMem(hProcess, dwAddress, dwValue, dwLen=4, type="UInt") { + if(!hProcess) { + ErrorLevel := ERROR_INVALID_HANDLE + return 0 + } + + VarSetCapacity(dwRead, dwLen) + dwRet := DllCall( "WriteProcessMemory" + , "UInt", hProcess + , "UInt", dwAddress + , "Str*", dwValue + , "UInt", dwLen + , "UInt*", 0) + if(dwRet == 0) { + ErrorLevel := ERROR_READ_MEMORY + return 0 + } + + ErrorLevel := ERROR_OK + return NumGet(dwRead, 0, type) +} + ; internal stuff writeString(hProcess, dwAddress, wString) { if(!hProcess) { From 0e205a8611781e4ccc4b7f77e5be9157f5074314 Mon Sep 17 00:00:00 2001 From: muki Date: Fri, 8 May 2020 20:42:07 -0700 Subject: [PATCH 30/30] Version 0.8.0 -Fixed Issue #9. --- README.md | 3 ++- SAMP.ahk | 34 +++++++++++++++++++++++++++++++--- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index e505418..36d5900 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ -## SAMPAHK (0.6.0) +## SAMPAHK (0.8.0) +## SAM (0.6.0) Based off: [SAMPUDF](https://github.com/paul-phoenix/SAMP-UDF-for-AutoHotKey) by paul-phoenix diff --git a/SAMP.ahk b/SAMP.ahk index 60ab6c0..24e9199 100644 --- a/SAMP.ahk +++ b/SAMP.ahk @@ -14,7 +14,7 @@ ; UPDATE THIS OR YOUR MERGE WILL BE CLOSED. ; KEEP THE VERSION TEXT AT LINE 17 OR YOUR MERGE WILL BE CLOSED. /* -SAMPAHK VERSION: 0.7.0 +SAMPAHK VERSION: 0.8.0 */ ; ErrorLevels @@ -91,7 +91,7 @@ global ADDR_MENU_PLAYINMENU := 0x5C ; GTA Gun Addresses global ADDR_GUN_RECOIL := 0x858CEC -global ADDR_CPED_GUN := 0x740 +global ADDR_CPED_GUN_TYPE := 0x740 global ADDR_CPED_PISTOLAMMO := 0x5E0 global ADDR_CPED_SHOTGUNAMMO := 0x5FC ; global ADDR_GUN_TYPE := 00 @@ -1009,7 +1009,7 @@ getPlayerMoney() { dwCPedPtr := readDWORD(hGTA, ADDR_CPED_PTR) if(ErrorLevel) { ErrorLevel := ERROR_READ_MEMORY - return -2 + return -1 } dwAddr := dwCPedPtr + ADDR_CPED_ROTZ @@ -1474,6 +1474,34 @@ editRecoil(wValue) return } + +; Retrieves the gun type you are currently holding. +; EXAMPLES: +; 92 = Deagle +; 97 = MP5 +; -1 = Fist +; -2 = Error +getGunType() +{ + if(!checkHandles()) + return -2 + + dwCPedPtr := readDWORD(hGTA, ADDR_CPED_PTR) + if(ErrorLevel) { + ErrorLevel := ERROR_READ_MEMORY + return -2 + } + + dwGunType := readMem(hGta, dwCpedPtr + ADDR_CPED_GUN_TYPE, 4, "Char") + if(ErrorLevel) { + ErrorLevel := ERROR_READ_MEMORY + return -2 + } + + ErrorLevel := ERROR_OK + return dwGunType +} + ;################################################## /*