2430 Commits

Author SHA1 Message Date
ba37f2f428 Merge branch 'patch-4' of https://github.com/luxxxoor/amxmodx 2022-07-11 13:37:39 +00:00
0de7beb351 Merge branch 'patch-5' of https://github.com/WPMGPRoSToTeMa/amxmodx 2022-07-11 13:34:36 +00:00
4d38b9c73b https://github.com/alliedmodders/amxmodx/pull/567 2022-07-11 13:24:13 +00:00
03cdb55266 https://github.com/alliedmodders/amxmodx/pull/575 2022-07-11 13:22:45 +00:00
950e63d62f https://github.com/alliedmodders/amxmodx/pull/576 2022-07-11 13:20:30 +00:00
0a0a8bc13d https://github.com/alliedmodders/amxmodx/pull/579 2022-07-11 13:18:27 +00:00
63c18bba6c https://github.com/alliedmodders/amxmodx/pull/993 2022-07-11 13:10:17 +00:00
338e8307f8 https://github.com/alliedmodders/amxmodx/pull/1049 2022-07-11 13:01:02 +00:00
475b1cdc29 fix gcc 12.1 compilation 2022-07-10 15:25:45 +00:00
e5c519cf07 update sqlite to version 3.39.0 2022-07-10 15:24:46 +00:00
df6b589ba1 nextmap.sma - Fix mp_chattime getting increased on quick map change (#1044) 2022-06-30 23:16:05 -07:00
fde732f66d Update trie_natives.cpp (#1052)
"Invalid map handle provided (%d)" error is very unclear when it appears in complex code.
2022-06-16 18:47:08 -07:00
49a8b959b3 Update newmenus.inc (#1043) 2022-04-05 00:32:55 -07:00
ec82e3f34c now amxmodx can use std (#1026) 2021-12-06 10:38:46 -08:00
8ee3da24cb Added new debug feature: Performance Monitor. (#1019)
* Performance Monitor.

Search big performance issues for any plugin that in debug mode. No server slow down.
Output is plugin and function name, and server execution lag in ms. Output target: current amxlog file.

* Adding cvar to enable perflog. Force for all plugin if amx_debug is 2.

* Update cvar name

* Use another clock from chrono

* Fix debug check

* Skip internal amxx exec

* Move includes

* Fix debug check in amx_ExecPerf

* Tried to compile without min/max undefined
2021-12-05 18:38:49 -08:00
6e8554d1d2 Fix ConfigsExecutedForward (my mistake) (#1024)
* Fix one big issue what broken all plugins!

If found any config from servercmd, m_ConfigsExecutedForward not called !!!!!!!
If m_ConfigsExecutedForward  not called, this is broke all plugins where used m_ConfigsExecutedForward (example restmenu)

Revert "Fix one big issue what broken all plugins!"

This reverts commit 6ce36f22e1c278f0831ebbddbc1dbbceb91dacb9.

* Fix m_ConfigsExecutedForward after my missprint from previous pr

Fix my missprint from previous pull request 275be8b0a8
2021-12-04 12:04:08 -08:00
275be8b0a8 Fix one big issue what broken all plugins! (#1022)
If found any config from servercmd, m_ConfigsExecutedForward not called !!!!!!!
If m_ConfigsExecutedForward  not called, this is broke all plugins where used m_ConfigsExecutedForward (example restmenu)
2021-12-03 15:07:59 -08:00
f8ac58c839 Fix some misprints and mistakes in code, part 2 (#1021)
* Fix compiler warnings about broken syntax

Revert "Fix compiler warnings about broken syntax"

This reverts commit cd0649806feaab064e93a0fbcd1f4488747f9b79.

Unbreak code

* Unbreak code

* Stop breaking code, please

* Small real unused check

* Fix "breaked" code and fix MAX_WEAPONS misprints

* Compiler break in debug mode if passing upper case strings
2021-12-02 21:24:15 -08:00
e8909c1583 Fixed value check in json_object_set_value (#1015)
Regression from #983
2021-12-02 19:32:04 -08:00
3cda059669 Fix some errors (#1020)
Fix some critical errors
2021-12-02 13:47:57 -08:00
5dcda02b65 [Build] Implement CI for MacOS via appveyor (#1013) 2021-10-24 17:22:56 -07:00
e6d9d9b71c Update stats.sma (#1001)
Triggered the "Invalid weapon id" at another location in the source code, so patched all cases where the argument could be 0.
2021-10-07 17:12:37 -07:00
2563bf6c26 Updated get_user_flags documentation (#1007) 2021-10-07 17:12:04 -07:00
c61735130d [Build] Fix latest MSVC and CLang compiler errors (#1008)
* Explicit cast specification

* Explicit cast specification

* Suppress -Wno-tautological-compare in Clang 10 and above

https://reviews.llvm.org/rG8b0d14a8f0cc085afa2a9c86c237da81c74517fc

* Explicit cast specification

* Add HAVE_STDINT_H compiler flag

* Explicit casting mechanism type specification

* typo
2021-10-07 17:11:49 -07:00
cac80584a0 Setup Github Actions (#1003) 2021-10-05 23:39:38 -07:00
3eefe5562e [Build] Migrate to Python3 (#1000)
* Configure Travis build env for Py3

Using default available version of 3.6.3 in `xenial` dist

* Migrate to py3

* Fix documentation
2021-09-28 11:41:04 -07:00
c317dc55c7 Update stats.sma (#997)
Fix runtime error when a player "killed self with teledeath". Happens when a map hasn't enough spawn points.
2021-09-28 09:56:21 -07:00
8fefd48af2 Create FUNDING.yml and add a ❤️Sponser button (#994) 2021-09-23 10:12:43 -07:00
f37f9d1c66 Fix gcc 9.2 compilation. (#835)
Fix gcc 9.2 compilation.
2021-09-22 17:01:35 -07:00
8413946ace Minor German Language Update (#926)
* Update admincmd.txt

* Update statsx.txt

* Update miscstats.txt

* Update menufront.txt

* Update menufront.txt

* Update admincmd.txt

* Update adminvote.txt

* Update restmenu.txt

* Update mapsmenu.txt

* Update nextmap.txt

* Update stats_dod.txt

* Update statscfg.txt

* Update stats_dod.txt

* Update adminvote.txt
2021-09-17 13:22:30 +02:00
be9ccc42eb European Portuguese Language translation fixes (#902)
* European Portuguese translation fix: admin.txt

* European Portuguese translation fix: admincmd.txt

* Added European Portuguese translation: adminslots.txt

Added new translations

* European Portuguese translation fix: common.txt

* European Portuguese translation fix: menufront.txt

* European Portuguese translation fix: miscstats.txt

* European Portuguese translation fix: pausecfg.txt

* European Portuguese translation fix: restmenu.txt

* European Portuguese translation fix: statscfg.txt
2021-09-17 13:12:46 +02:00
fb7ab6d08d Add missing kRenderFx constant (#928)
* Add missing kRenderFx constant

* Change constant name to match SDK
2021-09-17 13:11:17 +02:00
01e60834fa Use precache_generic() for sounds that are played client-side (#934) 2021-09-17 13:10:46 +02:00
3289b3c63c Update parson and fix json_object_set_value (#983)
* Remove parson folder

* add submodule parson

* FIX amxx_json_object_set_value generate a crash if invalid value is passed

* restore parson folder status
2021-09-17 13:06:54 +02:00
e17d37abe3 [FEATURE REQUEST] set_hudmessage add missing parameters (#992)
Same as https://github.com/alliedmodders/amxmodx/pull/981

Co-Authored-By: Franco Romaniello <romax.cs@gmail.com>

Co-authored-by: Franco Romaniello <romax.cs@gmail.com>
2021-09-17 13:05:28 +02:00
51c3f1b195 Fix typo in message_const.inc TE_FIZZ comment (#990) 2021-09-17 13:03:37 +02:00
2c8be75057 [TFCX] Fix Medic infection Crash on Linux (#991)
* [TFCX] Fix Medic infection Crash on Linux

Issue: #988

* [TFCX] Removed redundant code

- Added `_DEBUG_TFCX` preprocessor directive
- Deleted redundant code (which fetches pdata)
2021-09-17 12:59:54 +02:00
10db2e5c85 Revert "Update CMisc.h (#984)" (#986)
Turned out both test servers still had an old "tfc_i386.so" file which took precedence over the newer "tfc.so" library, so both servers were misconfigured and that's why the offsets didn't work.
2021-09-02 11:51:50 -07:00
05f86f05c0 Update CMisc.h (#984)
LINUXOFFSET is back at 3 since HLDS Linux build 8308 (dated July 24, 2019).
2021-08-26 22:28:01 -07:00
36d5aa97b1 Add missing set_task_* callback info (#952) 2021-08-07 17:31:18 +02:00
b8c490b5e6 Fix newmenus.inc documentation (#942) 2021-08-07 17:30:07 +02:00
301701b1da Fix typo in admincmd.txt (#951)
slaped => slapped

Let's just ignore the fact that the key is misspelled too.
2021-08-07 17:29:11 +02:00
5b1b844184 Fix incorrect uses of feof() (#957)
Using feof() as the while loop condition for detecting the end of the file is incorrect.
2021-08-07 17:28:35 +02:00
6c9c37eb45 Fixed Romanian translation, and added diacritics (#974) 2021-08-07 17:20:50 +02:00
d88b7e3c98 Change default chat time to 0.0 (#977) 2021-08-07 17:19:38 +02:00
6b9d82fa60 Add TIME_ELEMENT_* Romanian language keys in time.txt (#971) 2021-07-26 10:45:55 +02:00
08494d0d66 macOS build fix. 2021-07-11 22:14:16 -07:00
97b03ea567 Another macOS build fix. 2021-07-11 22:10:02 -07:00
344fb3d410 Fix mac build. 2021-07-11 22:08:37 -07:00
37cbccef6a Quell warning on macOS. 2021-07-11 22:08:36 -07:00
7fb6440ce9 Update minimum macOS to 10.7. 2021-07-11 20:55:09 -07:00
1a1b16614a Switch to libc++ on mac. 2021-07-11 20:51:19 -07:00
af32a9790b Switch to Python3 for bootstrapping. 2021-07-11 17:30:38 -07:00
2e5e3ce060 Add month and year support to get_time_length() (#969)
* Add RU

* Add EN

* Add DE

* Add SR

* Add BP

* Add HU

* Add SECONDS_IN_MONTH & timeunit_months

* Add months for API description

* Add SECONDS_IN_YEAR & timeunit_years

* fix typo

* Add FR
2021-07-01 10:51:24 +02:00
c58daeafca Fix stock "SQL_QueryAndIgnore" documentation (#965) 2021-06-19 10:38:25 +02:00
7fef58c374 Fix for loop index out of bounds error (#966)
Fixes an index out of bounds error when refreshMenus() and subsequently findAdminsWithMenu() is called when there is 32 players in the server. Indexing the playersList array in the for loop condition causes it to try to index with a value of 32 on the very last condition check which is not valid for this array.
2021-06-19 10:36:56 +02:00
3c1856f7af Add ignore for amxx binaries (#960) 2021-05-06 20:40:48 -07:00
9fbf91ded0 Fixed a typo in open_dir native (#955)
dir[] parameter is not const, but it never changes.
2021-03-25 10:04:00 -07:00
3d517d69e2 Revert "Update meta_api.cpp (#883)" (#950)
This reverts commit 7cb045c688.
2021-03-12 18:36:40 +01:00
70d1aff519 Revert "Resolve old bot's connection state issues (#917)" (#949)
This reverts commit bee4b47b07.
2021-03-12 18:31:01 +01:00
bee4b47b07 Resolve old bot's connection state issues (#917)
* final bot's fixes

Fixes: #916
Fixes: #883
Fixes: #875

* suggestions

* suggestions

Co-authored-by: shel <2@shelru.ru>
2021-03-09 23:10:59 +01:00
8c6b0f84bb Fix Windows build. 2021-02-10 13:32:02 -08:00
a4e929eedc Possible memory leaks on deattach (#912)
Co-authored-by: shel <2@shelru.ru>
2020-12-06 12:09:57 -08:00
c81f68aac3 Update cvars.inc (#919) 2020-12-06 12:01:52 -08:00
03f4c7dd2c Update checkout-deps.sh (#915) 2020-12-06 11:59:11 -08:00
7cb045c688 Update meta_api.cpp (#883)
Fixes: #875
2020-11-22 18:02:53 -08:00
73f3afa95f push (#911)
Co-authored-by: shel <2@shelru.ru>
2020-11-22 15:43:17 -08:00
2fadf887e6 Return max heap size note (#910)
Co-authored-by: shel <2@shelru.ru>
2020-11-22 15:12:54 -08:00
1027df054a Updated 'checkout-deps' to check for 'pip'/'pip3' prior to installing 'AMBuild' (#897) 2020-07-31 14:33:28 -07:00
2e3c105c7d Pass menu ID in MPROP_PAGE_CALLBACK function (#885)
Co-authored-by: shel <2@shelru.ru>
2020-07-17 11:05:13 +02:00
ff2fc19b08 Update newmenus.cpp (#884)
Fixes: #881

Co-authored-by: shel <2@shelru.ru>
2020-07-17 01:57:29 +02:00
f4fefd0bb4 Fix uninitialized member unexpected results (#896)
Co-authored-by: shel <2@shelru.ru>
2020-07-16 16:40:31 -07:00
b26118006a Revert "Do not allow admins to change cvars with FCVAR_SPONLY flag when not in singleplayer via amx_cvar"
adbc3e0c53

Behavior change. For now reverting it to give time and decide how it should be handled properly.
2020-06-24 22:49:19 +02:00
ed1ab00faf Fix internal player's team id returning -1 in a specific but valid situation (#772)
* Fix internal player's team id returning -1 in a specific but valid situation

* Use a local variable

* Fix spaces
2020-06-03 23:53:26 +02:00
6d6a41b894 Improve AdminSlot plugin (#631)
* Adminslot: Trim spaces

* Adminslot: Use semicolon everywhere

* Adminslot: Use brackets everywhere

* Adminslot: Hook cvars change and make sure max visible players is set right away

* Adminslot: Rename g_sv_visiblemaxplayers

* Adminslot: Move free slot calculation in its own function

* Adminslot: Use create_cvar and define appropriate bounds

* Adminslot: Use get_playersnum_ex with flag for clarity

* Adminslot: Move all the logic inside setVisibleSlots

Looks like the commit should have been split for clarity.

The initial purpose is to avoid code duplication and regroup checks.
The logic is the same with a little improvement to handle situations where a cvar is changed on-the-fly and sv_visiblemaxplayers needs to be reset.

Ultimately, the logic is the following:

 - At player's connection:
 -- Do nothing if amx_reservation == 0 and sv_visiblemaxplayers <= 0. If sv_visiblemaxplayers is set, we reset it directly.
 -- Check if player needs to be kicked. If not, and amx_hideslots == 0, then do nothing.
 -- Otherwise we update sv_visiblemaxplayers

 - Others events:
 -- Do nothing if either amx_reservation == 0 or amx_hideslots == 0, and if sv_visiblemaxplayers <= 0. If sv_visiblemaxplayers is set, we reset it directly.
 -- Otherwise we update sv_visiblemaxplayers

* Adminslot: Rename variables and adjust constantness

* Adminslot: Add a description to the cvars

* Adjust CVAR_HIDESLOTS english sentence

* Add the Deutsch translations
2020-06-03 23:52:47 +02:00
b9b4001bf9 Add menu_item_setaccess native (#826)
* Add set access.

* Update newmenus.inc

* typo

* Update newmenus.inc
2020-05-29 21:40:35 +02:00
1bc342a692 Public vars for plugin data (#714)
* Add public vars for plugin data and small refactoring get_xvar_id native

* Add new command to display info about the plugin and add url to amxx plugins command

* Add optional args to register_plugin native (url, description)

* Add enum of args for register_plugin native

* Creating a variable inside an if statement (C++17)

* Displaying the URL of the plugin if it is present

* Getting an ID only with more than three arguments

* Creating a variable inside an if statement (C++17)

* Fix typo

* Revert "Creating a variable inside an if statement (C++17)"

This reverts commit 835e0bc6c413f11b1bbf964daea87b57f653f5d7.

* Revert "Creating a variable inside an if statement (C++17)"

This reverts commit b2c1e7c77576c02a00c8c3f103457000d3298ceb.

* Revert "Displaying the URL of the plugin if it is present"

This reverts commit 9e31230368449966d16635c696d97c04adadeaa9.

* Binary compatibility for previously compiled plugins

* Displaying the URL of the plugin if it is present

* Quotation marks replaced by square brackets and change arg name to id

* Fix getting url

* The 'atoi' function replaced to 'stoi'

* Add likely/unlikely defines for using built-in function provided by GCC

* Small fixes with auto and inconsistent var name

* Replace stoi to strtol function

* Removed explicit buffer id

* Revert "Add likely/unlikely defines for using built-in function provided by GCC"

This reverts commit 94cee479ed245b98195501466850d01a3f08fd13.

* Add url and description params to get_plugin function
2020-05-29 12:37:40 +02:00
368bde1d07 Yet another Hungarian langugage revise (#816)
Revised by Norbee. @ ebateam.eu

He was just lazy to do a PR :P
2020-05-29 01:13:38 +02:00
51ede1097d admincmd.sma exploits fix (#822)
* [admincmd.sma] Fix typo in isCommandArgSafe

'

* [admincmd.sma] Update amx_cvar command handler

- Fix exploiting of "mapchangecfgfile" cvar to execute potentially dangerous console commands
- Add newline delimiter check and restrict for ****cfgfile cvars values

* Restrict having ".." character sequence in amx_map command argument

Fixes exploit on Windows servers that allows executing potentially dangerous console commands

* Do not allow admins to change cvars with FCVAR_SPONLY flag when not in singleplayer via amx_cvar

1. Make amx_cvar command obey FCVAR_SPONLY flag.
2. Fix exploiting of amx_nextmap cvar value which is used in nextmap plugin.
2020-05-29 01:10:38 +02:00
a5f2b5539f adminvote.sma exploit fix (#823)
* Restrict having ".." character sequence in amx_votemap command arguments

Fixes exploit on Windows servers that allows executing potentially dangerous console commands

* Fix typo

containi -> contain
2020-05-29 01:04:16 +02:00
307e71455a Fix broken DoD Fun module natives (#851)
* Update hardcorded offsets

* Fixed using incorrect parameter for setting string
2020-05-29 00:54:36 +02:00
b60f58ac34 Turkish Translation Fixes/Addings (#862)
* Update admin.txt

Fixed translation [tr]

* Update adminchat.txt

* Update admincmd.txt

* Update adminhelp.txt

* Update adminslots.txt

* Update adminvote.txt

* Update antiflood.txt

* Update cmdmenu.txt

* Update common.txt

* Update imessage.txt

* Update mapchooser.txt

* Update menufront.txt

* Update mapsmenu.txt

* Update miscstats.txt

* Update multilingual.txt

* Update nextmap.txt

* Update pausecfg.txt

* Update plmenu.txt

* Update restmenu.txt

* Update scrollmsg.txt

* Update stats_dod.txt

* Update statscfg.txt

* Update telemenu.txt

* Update time.txt

* Update timeleft.txt

* Update statsx.txt

* Update adminhelp.txt

* Update admincmd.txt
2020-05-29 00:51:14 +02:00
6ef40779e7 Add missing is_user_authorized() native (#840)
* Add missing is_user_authorized() native

It is implemented in core, but missing in amxmodx.inc

* Fix typo
2020-03-05 14:52:14 +01:00
18a5f6f5ea Fix MySQL connector link (#844) 2020-03-04 21:10:41 +01:00
d3ef881f31 Fix unreachable code warning in constraint_offset() (#784) 2019-12-20 11:17:08 +01:00
0eba9b3708 Close cmdaccess.ini file if fopen found the file... (#815)
Close file if fopen found the file...
2019-12-20 11:12:46 +01:00
0ccba67006 Fix compilation with GCC 8.2+ (#617)
* GCC 8.2 support

* Add GCC version check

* -Werror=class-memaccess fix in code

* Use assignment for Stats
2019-10-29 21:48:31 +01:00
c86813697a Fix new lines with TextMsg and SayText (side-effect of #763) (#778)
* Fix newlines for TextMsg

* Fix newlines for SayText

* Adjust comments

* Replace hardcoded detination value with HUD_* constants

* Make sure only official mods can use format string

* Fix typos

* Split condition for readability

* CS only: Fix newlines in TextMsg and with print_center
2019-10-28 00:21:09 +01:00
4f6b779bf4 Adjust TextMsg/SayText maximum buffer length from 190 to 187 due to "%s" parameter added in #763 2019-10-23 16:27:26 +02:00
d819df80f9 Fix issues with amxclient_cmd and read_args/read_argv* natives (#761)
* Fixes to read_args and read_argv* natives

* Fixed crash with read_argv* natives and commands sent with amxclient_cmd native
* Fixed read_args returning argv[0] instead of empty string when both amxclient_cmd's arguments were not specified

* Fix spaces
2019-10-22 10:28:40 +02:00
5120deaf74 Update gamedata for all supported mods (#771)
* Update CS gamedata

* Update TFC gamedata

* Update DoD gamedata

* Update Valve gamedata

* Update Gearbox gamedata
2019-10-21 11:49:30 +02:00
d01aa5762f Fix behavior change about endianness check in maxmind/libmaxminddb#123 (#770) 2019-10-20 23:21:57 +02:00
8930ecf7c5 Add new plugin defines regarding the AMX Mod X version (#723)
* Add AMXX_VERSION_LOCAL define

* Add new defines regarding version of AMX Mod X

Added new defines: AMXX_VERSION_MAJOR_NUM and AMXX_VERSION_MINOR_NUM

* Rename AMXX_VERSION_LOCAL define

Define AMXX_VERSION_LOCAL was renamed to AMXX_VERSION_LOCAL_REV_NUM
2019-10-17 18:55:05 +02:00
aa06e5ab93 European Portuguese Language translation support (#750)
* Added European Portuguese translation: admin.txt

* Added European Portuguese translation: adminchat.txt

* Added European Portuguese translation: admincmd.txt

* Added European Portuguese translation: adminhelp.txt

* Added European Portuguese translation: adminslots.txt

* Added European Portuguese translation: adminvote.txt

* Added European Portuguese translation: antiflood.txt

* Added European Portuguese translation: cmdmenu.txt

* Added European Portuguese translation: common.txt

* Added European Portuguese translation: imessage.txt

* Added European Portuguese translation: languages.txt

* Added European Portuguese translation: mapchooser.txt

* Added European Portuguese translation: mapsmenu.txt

* Added European Portuguese translation: menufront.txt

* Added European Portuguese translation: miscstats.txt

* Added European Portuguese translation: multilingual.txt

* Added European Portuguese translation: nextmap.txt

* Added European Portuguese translation: pausecfg.txt

* Added European Portuguese translation: plmenu.txt

* Added European Portuguese translation: restmenu.txt

* Added European Portuguese translation: scrollmsg.txt

* Added European Portuguese translation: stats_dod.txt

* Added European Portuguese translation: statscfg.txt

* Added European Portuguese translation: statsx.txt

* Added European Portuguese translation: telemenu.txt

* Added European Portuguese translation: time.txt

* Added European Portuguese translation: timeleft.txt
2019-10-17 15:46:04 +02:00
8309a1e06b Send pre-formatted string in SayText and TextMSg as a parameter instead of as the format string (#763) 2019-10-17 15:42:46 +02:00
7a44e6ec66 Fix GeoIP2 database file extraction (#764) 2019-10-17 15:42:27 +02:00
0bd69445f9 CSPForward::execute: Fix uninitialized retVal (#747) 2019-08-02 09:47:38 +02:00
5a257a7a42 Merge pull request #664 from IgnacioFDM/add-sqdistance
Add square distance functions to xs.inc
2019-06-19 22:37:56 +02:00
136cc23463 Merge pull request #698 from CrXane/master
Albanian Language translation support
2019-06-19 22:36:06 +02:00
024003d6f0 Fix MPROP_SHOWPAGE option not working as expected (#726)
Typo from #473.
2019-06-19 22:26:03 +02:00
abba8f1a7c Fix typo on engine.inc documentation (#730)
`register_think` first parameter is `Classname[]`, but, it's written `Touched` on its description.
2019-06-19 22:25:41 +02:00
16c5e4b34b Merge pull request #15 from lspublic/patch-46
Update miscstats.txt
2019-06-11 15:04:04 +02:00
132277bfdc Merge pull request #16 from lspublic/patch-47
Update multilingual.txt
2019-06-11 15:03:56 +02:00
f1332bb4af Merge pull request #17 from lspublic/patch-48
Update nextmap.txt
2019-06-11 15:03:46 +02:00
d659761195 Merge pull request #18 from lspublic/patch-49
Update pausecfg.txt
2019-06-11 15:03:37 +02:00
8a57a94480 Merge pull request #19 from lspublic/patch-50
Update plmenu.txt
2019-06-11 15:03:27 +02:00
0409910e1f Merge pull request #20 from lspublic/patch-51
Update restmenu.txt
2019-06-11 15:03:18 +02:00
c392d358a7 Merge pull request #21 from lspublic/patch-52
Update scrollmsg.txt
2019-06-11 15:03:10 +02:00
a901a127eb Merge pull request #22 from lspublic/patch-53
Update stats_dod.txt
2019-06-11 15:02:46 +02:00
2f90940c3f Merge pull request #23 from lspublic/patch-54
Update statscfg.txt
2019-06-11 15:02:38 +02:00
e66b466745 Merge pull request #24 from lspublic/patch-55
Update statsx.txt
2019-06-11 15:02:29 +02:00
9068f3c95a Merge pull request #25 from lspublic/patch-56
Update telemenu.txt
2019-06-11 15:02:18 +02:00
d2e71dd1f2 Merge pull request #26 from lspublic/patch-57
Update time.txt
2019-06-11 15:02:06 +02:00
58e552ceff Merge pull request #27 from lspublic/patch-58
Update timeleft.txt
2019-06-11 15:01:55 +02:00
8a19774edd Merge pull request #14 from lspublic/patch-45
Update menufront.txt
2019-06-11 15:01:30 +02:00
66876f89cd Merge pull request #13 from lspublic/patch-44
Update mapsmenu.txt
2019-06-11 15:01:17 +02:00
d18cc72510 Merge pull request #12 from lspublic/patch-43
Update mapchooser.txt
2019-06-11 15:00:45 +02:00
179b802c7b Merge pull request #11 from lspublic/patch-42
Update languages.txt
2019-06-11 15:00:15 +02:00
aba5897818 Merge pull request #10 from lspublic/patch-41
Update imessage.txt
2019-06-11 14:59:46 +02:00
ee2d846e0d Merge pull request #9 from lspublic/patch-40
Update common.txt
2019-06-11 14:59:20 +02:00
a6897ec39b Update common.txt 2019-06-11 14:58:19 +02:00
8aabf09067 Merge pull request #8 from lspublic/patch-39
Update cmdmenu.txt
2019-06-11 14:57:23 +02:00
b5fb4611cd Merge pull request #7 from lspublic/patch-38
Update antiflood.txt
2019-06-11 14:57:03 +02:00
f41aeef8b0 Merge pull request #4 from lspublic/patch-35
Update adminhelp.txt
2019-06-11 14:56:25 +02:00
7561426bd4 Merge pull request #5 from lspublic/patch-36
Update adminslots.txt
2019-06-11 14:56:06 +02:00
1bac8319c4 Merge pull request #6 from lspublic/patch-37
Update adminvote.txt
2019-06-11 14:55:36 +02:00
c6eb8a11d8 Merge pull request #3 from lspublic/patch-34
Update admincmd.txt
2019-06-11 14:54:31 +02:00
6aa012f062 Merge pull request #2 from lspublic/patch-33
Update adminchat.txt
2019-06-11 14:52:26 +02:00
887dd5b6d1 Update admincmd.txt 2019-06-11 14:47:44 +02:00
703a6872bc Update admincmd.txt 2019-06-11 14:44:41 +02:00
71eb9fe0d8 Update adminchat.txt 2019-06-11 14:42:04 +02:00
096dae9095 Fix MPROP_SHOWPAGE option not working as expected
Typo from #473.
2019-05-29 11:47:57 +02:00
1eb8a7f8c2 Update timeleft.txt
Some file change
2019-05-23 19:30:14 +02:00
8cbbf71f0c Update time.txt
Some file change
2019-05-23 19:29:24 +02:00
6923c1b209 Update telemenu.txt
Some file change
2019-05-23 19:28:37 +02:00
de93fa0824 Update statsx.txt
Some file change
2019-05-23 19:27:52 +02:00
118f33a83e Update statscfg.txt
Some file change
2019-05-23 19:27:02 +02:00
bc0d83bc92 Update stats_dod.txt
Some file change
2019-05-23 19:26:03 +02:00
bc36bb23df Update scrollmsg.txt
Some file change
2019-05-23 19:24:53 +02:00
00967632d5 Update restmenu.txt
Some file change
2019-05-23 19:24:35 +02:00
74171687f7 Update plmenu.txt
Some file change
2019-05-23 19:22:57 +02:00
88d9145524 Update pausecfg.txt
Some file change
2019-05-23 19:22:06 +02:00
50971fd9d0 Update nextmap.txt
Some file change
2019-05-23 19:21:06 +02:00
45c2e90a3f Update multilingual.txt
Update some file change
2019-05-23 19:20:19 +02:00
a6ccf82419 Update miscstats.txt
Some file change
2019-05-23 19:19:04 +02:00
3c3ac7a36c Update menufront.txt
Some file changes
2019-05-23 19:18:00 +02:00
41abeb3322 Update mapsmenu.txt
Some file changes
2019-05-23 19:17:13 +02:00
1e89e4c685 Update mapchooser.txt
Some file changes
2019-05-23 19:16:17 +02:00
653c5edcf4 Update languages.txt
Some files change in text
2019-05-23 19:15:28 +02:00
302d127f6f Update imessage.txt
Some file changes in text
2019-05-23 19:14:34 +02:00
0eeda72922 Update common.txt
Some file changes in text
2019-05-23 19:12:51 +02:00
cb1941c99a Update cmdmenu.txt
Some file changes in text
2019-05-23 19:11:47 +02:00
51adc75e96 Update antiflood.txt
Some changes in text
2019-05-23 19:10:37 +02:00
8882bd5ca0 Update adminvote.txt
Some changes in text
2019-05-23 19:09:13 +02:00
0928d7a6fe Update adminslots.txt
Some changes in file
2019-05-23 19:07:45 +02:00
e502c61f2c Update adminhelp.txt
Some changes in text
2019-05-23 19:06:18 +02:00
38848ff636 Update admincmd.txt
Some changes in text
2019-05-23 19:05:07 +02:00
59ce7064c7 Update adminchat.txt
Some changes in text
2019-05-23 19:01:09 +02:00
8cee128e50 Added Albanian translation: timeleft.txt 2019-05-16 22:26:59 +04:00
7ddc462135 Added Albanian translation: time.txt 2019-05-16 22:26:05 +04:00
cd76998995 Added Albanian translation: time.txt 2019-05-16 22:25:46 +04:00
48c0ae1711 Added Albanian translation: statsx.txt 2019-05-16 22:24:36 +04:00
85124d3417 Added Albanian translation: statscfg.txt 2019-05-16 22:20:46 +04:00
8b1a83f085 Added Albanian translation: stats_dod.txt 2019-05-16 22:11:15 +04:00
3fb981f6be Added Albanian translation: miscstats.txt 2019-05-16 22:03:59 +04:00
388a68e694 Added Albanian translation: scrollmsg.txt 2019-05-16 21:55:16 +04:00
60e2109b4f Added Albanian translation: restmenu.txt 2019-05-16 21:53:48 +04:00
ca7e289273 Added Albanian translation: plmenu.txt 2019-05-16 21:36:18 +04:00
437ad0f8ec Added Albanian translation: pausecfg.txt 2019-05-16 21:33:25 +04:00
32ff785d85 Added Albanian translation: nextmap.txt 2019-05-16 21:17:47 +04:00
2d607b6d68 Added Albanian translation: multilingual.txt 2019-05-16 21:16:02 +04:00
9c21bcd18b Added Albanian translation: miscstats.txt 2019-05-16 21:13:14 +04:00
dcdd5a1442 Added Albanian translation: menufront.txt 2019-05-16 21:00:55 +04:00
072095445e Added Albanian translation: mapsmenu.txt 2019-05-16 20:56:34 +04:00
486da2f44b Hungarian language update (#719)
Thanks for the help to Norbee. @ ebateam
2019-05-16 15:11:10 +02:00
681acffee9 Bump ReHLDS API version to 3.6 (#721) 2019-05-16 14:55:41 +02:00
dfd835eba5 String changes for missing path exception messages (#718)
Resolves #652
2019-05-14 00:37:49 +02:00
ecbff2e8f1 Added Albanian translation: mapchooser.txt 2019-05-12 14:55:46 +04:00
55f01c9488 Added Albanian translation: imessage.txt 2019-05-12 14:50:43 +04:00
49c219e6a2 Added Albanian translation: common.txt 2019-05-12 14:48:39 +04:00
cccb8c84af Added Albanian translation: cmdmenu.txt 2019-05-12 14:43:46 +04:00
3dc5ec0331 Added Albanian translation: antiflood.txt 2019-05-12 14:42:24 +04:00
12664d9427 Added Albanian translation: adminvote.txt 2019-05-12 14:41:25 +04:00
365a0559b3 Added Albanian translation: adminhelp.txt 2019-05-12 14:33:37 +04:00
62052ee590 Added Albanian language: adminslots.txt 2019-05-12 14:29:29 +04:00
0aa97dee3f Added Albanian language: adminhelp.txt 2019-05-12 14:27:33 +04:00
4c55da4de9 Added Albanian translation: admincmd.txt 2019-05-12 14:19:20 +04:00
0f667692b1 Added Albanian translation: adminchat.txt 2019-05-12 13:22:40 +04:00
6addd9c074 Added Albanian translation: admin.txt 2019-05-12 13:20:57 +04:00
295d09df8b Fix string incorrectly formatted in CS Misc Stats plugin (#704)
Recently, I got those below errors on logs:
```
String formatted incorrectly - parameter 12 (total 12)
L 04/29/2019 - 23:24:40: [AMXX] Displaying debug trace (plugin "miscstats.amxx", version "1.8.3-dev+5154")
L 04/29/2019 - 23:24:40: [AMXX] Run time error 25: parameter error 
L 04/29/2019 - 23:24:40: [AMXX]    [0] miscstats.sma::checkKills (line 922)
```

It just looks like `"RAMPAGE!!! %s^n%L %d %L (%d hs)"` misses last format rule, which should be `"%L"` pointing to `HS` lang key.
2019-04-30 09:59:15 +02:00
1cc7786a4c Add new public var with mapname and new constant (#687)
* Add new public var with current map name

* Add a constant to define max map's name length

* Reducing the maximum buffer size to store a map's name

* The PLATFORM_MAX_PATH constant replaced to MAX_MAPNAME_LENGTH
2019-04-27 01:01:54 +02:00
f301fbaf08 Accidentally deleted 2019-04-14 12:02:24 +02:00
05cd0af3a5 Delete restmenu.txt 2019-04-14 11:52:49 +02:00
97fc80dd03 Merge branch 'master' into master 2019-04-14 10:12:59 +02:00
d3ca82411a Added Albanian translation 2019-04-14 10:04:22 +02:00
3e91def7f0 Added Albanian translation 2019-04-14 10:03:46 +02:00
96a74ec654 Added Albanian translation 2019-04-14 10:03:09 +02:00
4f3b9e7a60 Added Albanian translation 2019-04-14 10:02:37 +02:00
df819beab5 Added Albanian translation 2019-04-14 10:01:56 +02:00
7ecc62aaef Added Albanian translation 2019-04-14 10:01:19 +02:00
ef570a987a Added Albanian translation 2019-04-14 10:00:20 +02:00
09548bfd2c Added Albanian translation 2019-04-14 09:59:16 +02:00
2e0c240573 Added Albanian translation 2019-04-14 09:47:12 +02:00
dc59d826a3 Added Albanian translation 2019-04-14 09:46:38 +02:00
35788efa07 Added Albanian translation 2019-04-14 09:46:05 +02:00
ac6364bfdc Added Albanian translation 2019-04-14 09:45:39 +02:00
6655fe7c28 Added Albanian translation 2019-04-14 09:45:06 +02:00
bb31835dea Added Albanian translation 2019-04-14 09:44:34 +02:00
bd67978c3a Added Albanian translation 2019-04-14 09:44:05 +02:00
ede7b69b25 Added Albanian translation 2019-04-14 09:43:10 +02:00
7b2ef405a3 Added Albanian translation 2019-04-14 09:42:35 +02:00
8264328235 Added Albanian translation 2019-04-14 09:42:02 +02:00
113c50b1fa Added Albanian translation 2019-04-14 09:41:30 +02:00
340e2b9df2 Added Albanian translation 2019-04-14 09:40:46 +02:00
3486a7d7fc Added Albanian translation 2019-04-14 09:40:18 +02:00
e1d1004cd6 Added Albanian translation 2019-04-14 09:39:46 +02:00
8940de5956 Added Albanian translation 2019-04-14 09:38:58 +02:00
304af5055e Added Albanian translation 2019-04-14 09:38:06 +02:00
7c07ae6099 Added Albanian translation 2019-04-14 09:32:25 +02:00
1c39c85929 Added Albanian translation 2019-04-14 09:29:46 +02:00
5b07b25d62 Added Albanian translation 2019-04-14 09:28:49 +02:00
6bed09db57 Fix TE_DLIGHT documentation (#685)
There's no "brightness" parameter in TE_DLIGHT. Probably will cause server crash if it be passed.
2019-04-07 17:08:47 +02:00
ca69c36c1e Updated Portuguese Brazilian translation in miscstats.txt with latest additions (#674)
Updated Portuguese Brazilian translation in miscstats.txt with latest additions
2019-04-07 17:08:21 +02:00
f623126fe1 Improve documentation in engine_const.inc (#665) 2019-02-11 12:15:45 +01:00
f392c90729 Fix documentation (#678)
* Lack register_event() on event_enable/disable

Lack register_event() on enable_event and disable_event descriptions

* It shoud be m_iJoiningState not m_iJointState

It shoud be m_iJoiningState not m_iJointState
2019-02-11 12:13:19 +01:00
fd64327313 Revert RETURN_META(MRES_HANDLED); (#662)
#554 (Revert "Fun: Make TraceLine a post forward") did not fully revert back TraceLine. RETURN_META(MRES_HANDLED); was added by #421 (Update Fun module) but still remains there.
2019-01-30 16:04:11 +01:00
38cd5ab1cd Fix back/next/exit buttons not translated in plugin's cvar/command menus (#667)
* Menu buttons stayed english in Plugin's cvar/command menus

That worked, but if there is any better solution to get it working feel free to edit :D

* Changed language parsing to %L
2019-01-30 15:57:54 +01:00
5947926a09 Add player validation for menu_display (#671)
Invalid player triggered crash because get/set_pdata is unsafe
2019-01-30 15:19:30 +01:00
ea7ffafd88 Add square distance functions to xs.inc 2019-01-26 09:41:45 -03:00
ba083deb1e Removed garbage generated by VS (#658) 2019-01-24 21:13:48 +01:00
f365c943b7 Updated Hungarian translation in miscstats.txt with latest additions (#661) 2019-01-24 21:12:32 +01:00
9417ec188d Fix typo in json_parse documentation (#663)
Just a small fix on json_parse return description. I'm sure it was supposed to be `Invalid_JSON` instead of `Invalid_JSONValue`.
Thank you, guys, that's one of my favorites features.
2019-01-24 21:09:15 +01:00
af56d964c1 Bump ReHLDS version to 3.5 (#647) 2018-12-18 10:16:33 +01:00
7c7ad3d3c0 Fix again a menu regression (behavior change) due to typos in #471 (#636) 2018-11-02 14:16:57 +01:00
bb84a43a7b Fix a navigation bug in Plugin Cvars menu (#637) 2018-11-02 14:16:36 +01:00
20d917a307 Port bugfix for incorrect heap deallocation on conditional operator (#627)
* Revert 4f8917ec (experimental bugfix for heap in conditional)

* Port bugfix for incorrect heap deallocation on conditional operator (ported from compuphase upstream)

* Fix the upstream bugfix

Fixed the wrong order of heaplist nodes and the incorrect calculation of the max. heap usage.

* Add an additional pass for functions that return array if they are used before definition (inside definition (recursion) is a "before definition" situation too)
2018-11-02 14:15:31 +01:00
77eb33d5f2 Compiler: Fix undefined symbol: pow10 (#615)
* Compiler: Fix undefined symbol: pow10

* Add version check

* Remove deprecated pow10
2018-10-14 17:44:59 +02:00
75cf5f55f9 Make UTF-8 safe others strings natives (#610) 2018-10-14 17:44:15 +02:00
fb615aaef1 Compiler: Increase the maximum number of array dimension (#584)
* Compiler: Increase the maximum number of array dimension to 4

* Compiler: Fix array initialization
2018-10-13 15:05:04 +02:00
7f7d01fb8d Major Update to german translation (#620)
* Update miscstats.txt

#618

* Update statsx.txt

#618

* Update and rename mapchooser.txt to admincmd

* Rename admincmd to mapchooser.txt

* Update admincmd.txt

* Update common.txt

* Update multilingual.txt

* Update multilingual.txt

* Update scrollmsg.txt

* Update statscfg.txt

* Update adminchat.txt

* Update adminhelp.txt

* Update adminvote.txt

* Update cmdmenu.txt

* Update common.txt

* Update mapchooser.txt

* Update mapsmenu.txt

* Update menufront.txt

* Update miscstats.txt

* Update multilingual.txt

* Update nextmap.txt

* Update pausecfg.txt

* Update plmenu.txt

plmenu.txt adresses only the behaviour in the "Menü", not the text in the chat!

* Update restmenu.txt

* Update scrollmsg.txt

* Update stats_dod.txt

* Update statscfg.txt

* Update statsx.txt

* Update telemenu.txt

* Update timeleft.txt

* Update admincmd.txt

* Update plmenu.txt

* Update adminchat.txt

* Update admincmd.txt

* Update mapsmenu.txt

* Update miscstats.txt

added changes due to PR #611 !

* Update miscstats.txt

* Update pausecfg.txt

* Update admincmd.txt

* Update statscfg.txt
2018-10-12 21:04:14 +02:00
87b6f274a0 CS Miscstats: Fix enemy remaining option displaying the message to the wrong team (#611) 2018-10-11 11:12:06 +02:00
0b5584a334 Fix missing files in PackageScript from previous commit 2018-09-28 18:31:48 +02:00
f82455dd84 Move hamdata.ini to gamedata (#597)
* Replace atoi by strtol in the config parser

* Move hamdata.ini data to gamedata files

* Reference the new files in master file

* Remove all the parsing code and use config manager to get the offsets

* Remove any hamdata.ini references
2018-09-28 16:51:54 +02:00
8717ffe07c Implement menu_create "ml" param to allow menu title/item to be looked up as multilingual key (#593)
* Clean up menu_create() internal code

No code changes. Just modernizing code a little and tidying up things.

* Implement menu_create() "ml" param

* Include newmenu.inc to VS project files

* Adjust documentation

* Put back the quote in the log error message.
2018-09-28 16:46:52 +02:00
b4768a3d1d Add a bunch of constants to define max lengths (#566)
* Add constants for max IP and SteamID length

* Change max authid length to 64

* Fix port typo

* Add more defines

* Remove max query length
2018-09-28 16:43:41 +02:00
f1f95425b6 Fix a crash with set_tr/2 when -1 is passed in TR_pHit + allow worldspawn (0) in set_tr/2 (#601)
* Fix a crash with set_ptr2 when -1 is passed in TR_pHit

* Allow wordspawn in set_tr|2(TR_pHit, ...)
2018-09-28 16:39:03 +02:00
49430082f5 Fixed a typo in get_user_flags description (#605)
* Fixed a typo in get_user_flags description

* Remove
2018-09-28 16:36:19 +02:00
22fd09efea Add constants for get_user_origin() (#604) 2018-09-28 16:22:21 +02:00
e8c8111178 Put back <time.h> from previous commit 2018-09-23 23:14:33 +02:00
08213d8ead GeoIP: Add "reload" command (#588)
* Add reload option

* Adjust logic

* Modernize the code a little
2018-09-23 23:01:49 +02:00
c3225afda1 Additions to hlsdk_const and cstrike_const (#573)
* Additions to hlsdk_const

Added values to hlsdk_const using regamedll_cs and reapi as reference.

* Update cstrike_const.inc

* Prefix constants with CS_ to avoid name collision and for consistency
2018-09-23 22:59:18 +02:00
dfbeec069c Fix invalid handle passed in the SMC/INI parser callbacks (#592) 2018-09-20 23:32:41 +02:00
a54b9f05a7 Compiler: Fix broken UTF8 support (#329) 2018-09-20 20:27:15 +02:00
1f0dc33875 Fix typo in json_object_get_value_at documentation (#587) 2018-09-16 20:03:39 +02:00
8d1f924248 Upload amxmodx-latest-<package>-<os> text file when packaging. (#585) 2018-09-14 20:21:47 +02:00
5694acf482 Compiler: Fix an issue related to passing arrays based on an enumeration to a function (#582) 2018-09-14 15:47:11 +02:00
8f88dc5ac8 Fix admin chat displaying the wrong language (#559)
* Fix admin chat displaying the wrong language

* Switch %L to %l

* Improve loop

* %L to %l again

* Change git add . to != 0
2018-09-11 20:19:28 +02:00
b1b053c205 Bump version 2018-09-11 00:48:15 +02:00
c9e9ef905e Promote git revision number to 4th version string component 2018-09-11 00:46:07 +02:00
8a720a7d6a Another stab at Windows build fix. 2018-09-09 07:40:58 -04:00
d2d121619f Another attempt to fix windows compilation (#556) 2018-09-08 21:12:57 +02:00
9a2c586720 Attempt to fix windows compilation (#555)
* Attempt to fix windows compilation

* Testing mysql-c-connector
2018-09-08 20:21:53 +02:00
579a83c2a4 Fix vault.inc documentation (#550)
* Fix vault.inc documentation

* Add missing *

* Fix typos
2018-09-08 09:42:17 +02:00
b4927bfb1f Revert 1e3832a942ade577d39463979441651b13a5eee4 (#554) 2018-09-08 09:41:29 +02:00
9a95fd9886 Add cs_get_weaponbox_item native (#548)
* Add cs_get_wpnbox_weapon native

* Rename native + fix strcmp check
2018-09-07 09:01:47 +02:00
99ebd62653 Update Hamsandwich for Sven Coop 5.17 (#452)
* Remove dropped functions

* Update existing offsets

* Add some logic to prevent the use of removed functions.

* Add Ham_SC_AddPoints and Ham_SC_AddPointsToTeam

* Add Ham_SC_GiveAmmo

* Add Ham_SC_FVisibleFromPos

* Fix an old typos with CanPlaySentence for all mods

* Add Ham_SC_CanPlaySequence

* Add Ham_SC_PlayScriptSentence

* Add Ham_SC_StartPlayerFollowing

* Fix CanPlaySequence hamdata.ini (SC)

* Add Ham_SC_StopPlayerFollowing

* Fix handlers from previous commits

* Add Ham_SC_PreSpawn

* Add Ham_SC_PostSpawn

* Add Ham_SC_OnKeyValueUpdate

* Add Ham_SC_SetClassification

* Add Ham_SC_MyCustomPointer and Ham_SC_MyItemPointer

* Add Ham_SC_IsSneaking

* Add Ham_SC_IsAlive

* Add Ham_SC_IsBSPModel

* Add Ham_SC_ReflectGauss

* Add Ham_SC_HasTarget

* Add Ham_SC_IsInWorld

* Add Ham_SC_IsPlayer

* Add Ham_SC_IsNetClient

* Add Ham_SC_IsBreakable

* Fix Ham_SC_IsMonster, Ham_SC_IsPointEntity, Ham_SC_IsMachine and Ham_SC_CriticakRemove handlers

* Add Ham_SC_OnControls

* Fix Ham_SC_TakeHealth and Ham_SC_TakeArmor handlers

* Add Ham_SC_IsTriggered

* Add Ham_SC_RemovePlayerItem

* Fix typo

* Fix Ham_SC_IsMoving handler

* Add Ham_SC_SUB_UseTargets

* Ham_SC_IsLockedByMaster

* Add Ham_SC_FBecomeProne

* Fix Ham_SC_FVisible handler

* Add Ham_SC_FVecVisible

* Fix Ham_SC_FVisibleFromPos handler

* Fix Ham_SC_IsFacing handler

* Add Ham_SC_SetPlayerAlly

* Add Ham_SC_OnSetOriginByMap

* Add Ham_SC_IsRevivable

* Add Ham_SC_BeginRevive and Ham_SC_EndRevive

* Update offsets based on SvenCoop v5.17

* Add Ham_SC_Item_CanCollect and Ham_SC_Item_Collect

* Add Ham_SC_Item_AddToPlayer

* Add Ham_SC_Item_AddDuplicate

* Add Ham_SC_Item_AddAmmoFromItem

* Add Ham_SC_Item_GetItemInfo

* Add Ham_SC_Item_CanDeploy, Ham_SC_Item_Deploy and Ham_SC_Item_CanHolster

* Add Ham_SC_Item_UpdateClientData

* Add Ham_SC_Item_GetRespawnTime

* Add Ham_SC_Item_CanHaveDuplicates

* Add Ham_SC_Weapon_ExtractAmmoFromItem

* Add Ham_SC_Weapon_GetAmmo1Drop and Ham_SC_Weapon_GetAmmo2Drop

* Add Ham_SC_Weapon_FinishReload and Ham_SC_Weapon_ShouldReload

* Fix Ham_SC_IsMultiplayer, Ham_SC_FRunfuncs and Ham_SC_FCanRun handlers

* Add Ham_SC_Weapon_AddWeapon, _PlayEmptySound, _IsUsable, _ShouldWeaponIdle and _UseDecrement

* Add Ham_SC_Item_GetPickupSound

* Add Ham_SC_Item_InactiveItemPreFrame and Ham_SC_Item_InactiveItemPostFrame

* Add Ham_SC_Item_DetachFromPlayer

* Fix Ham_SC_Player_IsConnected handler

* Add Ham_SC_Player_EnteredObserver, Ham_SC_Player_LeftObserver and Ham_SC_Player_IsObserver

* Fix sc_postpawn typo (should be sc_postspawn)

* Add few more assert
2018-09-06 17:09:10 +02:00
0894027cb5 Updated readme (#539)
* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Fixes after review

* New snapshots link

* Le perfectionnisme
2018-09-04 19:31:23 +02:00
582df637ce Compiler: Add __FILE__, remove __BINARY_PATH__ and rename __BINARY_NAME__ to __BINARY__ (#546)
* Compiler: Add __FILE__ and remove __BINARY_PATH__ constants

* Compiler: Rename __BINARY_NAME__ to __BINARY__
2018-09-03 21:28:28 +02:00
c16bd47b30 Remove GetModelCollisionBox, SetModelCollisionBox and SetModelBoundingBox natives (#536) 2018-09-03 18:49:49 +02:00
c6c4e79b96 Don't reset m_iMenu if player is not fully joined (#537) 2018-09-03 18:39:08 +02:00
76e92ae3a1 Add CONTRIBUTING and ISSUE_TEMPLATE (#534) 2018-09-02 20:35:42 +02:00
80cf45d234 Adjust version for manual build and update VS projects (#543) 2018-09-02 20:34:40 +02:00
736efdb370 Adjust version 2018-09-02 13:12:59 +02:00
8c0f97d6bb Fix typo in fun include (#541) 2018-09-01 18:51:14 +02:00
e0ca2c967c Fix a windows compilation warning in socket module (#538) 2018-09-01 12:30:12 +02:00
879b061bc8 Make the "body" param in get_user_aiming() optional (#532)
* Make the body param optional

* Add HIT_ constant note
2018-08-30 20:26:39 +02:00
1a2dd9e7ea Update Fun module (#421)
* Fun: Replace ENTINDEX with TypeConversion for consistency

* Fun: Add a class wrapping player's data

* Fun: Make TraceLine a post forward

Reason: as it is it breaks plugins hooking TraceLine because of the original game call is being superceded and other modules can't catch it. It looks like it's this way from the very start fun module has been introduced 13 years ago before. Fakemeta module comes a little later.

* Fun: Clean up code

* Fun: Toggle PlayerPreThink forward on demand

* Fun: Toggle TraceLine forward on demand

* Fun: Add HITZONE* constants for use with set/get_user_hitzone()

* Fun: Refactor a litte the player class

* Fun: Clean up a little more

* Fun: Fix typo in set_user_hitzones from previous commit
2018-08-30 19:16:19 +02:00
6e9947b64f Sanitize load_amxscript() and add load_amxscript_ex/MF_LoadAmxScriptEx() requiring error max length (#530)
* Add a saner version of load_amxscript and use SafeStrcpy/Sprintf

* Reflect the change in core

* Add LoadAmxScriptEx API function

* Reflect the change in CSX

* Reflect the change in DodX

* Reflect the change in TFCX

* Reflect the change in TSX

* Add few comments
2018-08-30 18:49:42 +02:00
76378fd5d0 Add get_playersnum_ex (#517)
* Allow get_players to get the players num only

* used empty brackets instead of zero

* Add get_playersnum_ex stock to amxmisc.inc

* Added missing empty brackets

* Remove brackets from get_players

* Fixed a typo in function description

* Change letters to flags in get_playersnum_ex description
2018-08-30 18:43:05 +02:00
189f16fcc4 Add stat constants in plugins (#522)
* Add stat constants in plugins

* Add missing include in dodstats.sma

* Fix misplaced HIT_RIGHTLEG constant
2018-08-30 18:41:49 +02:00
56e8dcf3d5 Update Zlib to v1.2.11 (#527)
* Update Zlib to v1.2.10

* Adjust config for linux/mac
2018-08-27 21:35:24 +02:00
8762b578ff Update SQLite library to v3.24.0. (#525) 2018-08-27 18:21:57 +02:00
9e2c76abdc Update libmaxminddb to v1.3.2 (#526)
* Update libmaxminddb to v1.3.2

* Move PACKAGE_VERSION declaration
2018-08-27 15:42:35 +02:00
c820db4dc7 Add GeoIP data update to the automatic build system (#524)
* Add GeoIP data update to the automatic build system

* Apply few fixes
2018-08-27 15:06:59 +02:00
1ddf199e71 Fix AppVeyor (#528) 2018-08-27 14:36:38 +02:00
46d1ef68bd Build assembly files with AMBuild. (#481)
* Remove prebuilt nasm-generated object files from the tree, and use AMBuild to compile them.

* Add commands in VS project to build the object files

* Rename elf to elf32 for consistency
2018-08-26 20:28:25 +02:00
9bcabfeb1f Add or adjust a bunch of safety checks (#433) 2018-08-26 17:18:39 +02:00
8aeefc3fca Add constants for stats functions (#509)
* Add constants for stats functions

* Changed STATS_ to STATSX_ and added 2 more defines

* Added constants for all games

* Add csstats_const.inc and add _MAX_ constats to enum

* Change bodyhits
2018-08-25 20:52:48 +02:00
197db8c82b Update AMTL from upstream (#521) 2018-08-25 11:29:54 +02:00
f822cc610f Update ReSDK API to latest version (#520) 2018-08-25 09:20:06 +02:00
ce14df0c77 CStrike: Fix a missing RemoveEntityHashValue function address check (#519) 2018-08-25 09:18:51 +02:00
605d1a5b1e Fix callback from amx_clientcmd not working properly (#518) 2018-08-25 09:18:39 +02:00
ac57ed5b44 Add get_user_rendering (#514)
* Add get_user_rendering

* Added & in arguments

* Changed zeroes to kRender constants

* Changed zeros to kRender constants
2018-08-25 09:18:25 +02:00
6528677dcc Add @note in get_user_msgid() (#506)
* Update lang.inc

* Update lang.inc

* Update amxmodx.inc

* Improve @note phrasing
2018-08-20 19:50:43 +02:00
0765dc8a0d Improve messages.inc and message_stocks.inc documentation (#510)
* Improve messages.inc and message_stocks.inc documentation

* Fix typos

* Fixed typos, added a bunch of @notes and better register_message callback function explanation

* Removed extra argument in set_msg_arg_string

* Creates => Sends
2018-08-20 19:49:47 +02:00
eff74fe862 Execute amxx.cfg before plugin_init to keep compatibility (#512) 2018-08-20 19:46:26 +02:00
05b74111d3 Allow arrayset to accept any type (#516) 2018-08-20 19:46:00 +02:00
0bfc65c635 Add default values for menu_item_getinfo (#511) 2018-08-09 15:38:58 +02:00
a784a34561 Fix documentation (#513) 2018-08-09 15:37:24 +02:00
faf7da4c2c Fix a buffer issue in EngFunc_LightStyle (#508) 2018-07-28 21:35:34 +02:00
9700caefae Fix client_print_color where the color is ignored if string starts with an unicode character (#504) 2018-07-24 15:45:50 +02:00
4ae31f6f26 nvault.inc documentation fix (#501)
* Update lang.inc

* Update lang.inc

* Update nvault.inc

* Update nvault.inc
2018-07-24 15:36:31 +02:00
57abc4a1c5 Fix a compilation regression in LookupLangKey (introduced with #222) (#499) 2018-07-24 10:37:56 +02:00
7062d210a7 fix hlsdk_const.inc identation (#502)
a copy past from reapi hlsdk_const.inc file
2018-07-24 10:37:19 +02:00
a9ce39dee0 Fix a buffer issue in server_changelevel forward caused by engine_changelevel native (#503) 2018-07-24 10:37:05 +02:00
98ab26671c Add MPROP_SHOWPAGE (#473) 2018-07-18 17:10:37 +02:00
fba3d706fc Normalize EOL of few files changed in #489 2018-07-18 14:39:53 +02:00
5f5d6f1d5d Fix a buffer issue in RegisterHam (#495)
* Fix a buffer issue in RegisterHam

* AString classname as well
2018-07-13 16:23:03 +02:00
975d877800 Fix typos in few localinfo identifiers for the AMXX config directory retrieval (#496) 2018-07-13 12:18:16 +02:00
afbb3b88d7 Further Hungarian translation update (#494)
* Hungarian language update

The important parts have been updated* and the missing parts added according to my best knowledge.

*admincmd.txr was UTF8 instead of UTF8 without BOM, I'm not sure it was a mistake or not.

* Further Hungarian translation update

Further grammar and typo fixes in Hungarian translation.

SERVER_PROC - Unused in admincmd.sma and .txt too.
2018-07-12 14:40:48 +02:00
92ebb6ef05 Add link to API reference in README (#493)
* Add link to API reference

* Update README.md

* Update README.md
2018-07-12 10:17:49 +02:00
a87eb50441 Fix missing register_event() reference on event_enable/disable descriptions (#491)
Lack register_event() on enable_event and disable_event descriptions
2018-07-12 00:09:23 +02:00
cec42bdcae API documentation fix for some .inc files (#489)
* Fixed param information

* Removed whitespace that prevented the API to generate client_disconnected information

* Fixed documentation.

* Update lang.inc

* Documentation fix

(g/s)et_user_hitzones() functions weren't generating properly in the API due to a whitespace in front of the comment blocks. @return for give item() was missing.

* Whitespace prevented API documentation from generating

* Update lang.inc
2018-07-10 14:42:45 +02:00
651745b1d4 Updated compiler exitcodes (#486) 2018-07-10 12:27:27 +02:00
fc337d12a4 Hungarian language update (#474)
The important parts have been updated* and the missing parts added according to my best knowledge.

*admincmd.txr was UTF8 instead of UTF8 without BOM, I'm not sure it was a mistake or not.
2018-07-10 12:10:25 +02:00
387dc6a188 Fix a menu recursion issue (#471)
* Factorize menu close logic in show_menu()

* Use CS-specific player's m_iMenu offset instead of menuselect command
2018-07-10 12:09:20 +02:00
528fec1a29 Macedonian & Bulgarian translation fix (#477)
* Macedonian & Bulgarian translations fix

* Macedonian & Bulgarian translations fix
2018-07-10 12:02:47 +02:00
339a27579d Improved mprop description (#478) 2018-07-10 11:59:53 +02:00
66e3fa6db2 Fix typo (#488) 2018-07-10 11:57:37 +02:00
42b351127d Fix for precache_event (#490) 2018-07-10 11:50:31 +02:00
2559fcf00a Fix: fakemeta hook not being unregistered (#483) 2018-03-09 19:39:14 +01:00
7c4688f557 Comment MODULE_RELOAD_ON_MAP_CHANGE on modules that use USE_METAMOD (#484)
Currently amxmodx doesn't reload modules that use metamod, so MODULE_RELOAD_ON_MAP_CHANGE being defined or not doesn't make any difference.
Even though this commit currently doesn't change any behavior, amxmodx might in the future support reloading modules that use metamod, and all these modules in their current state either fail completely because of erroneous cleanup, or are untested (and most likely leak stuff).
Furthermore, these changes make it clear that these modules are in fact not being reloaded.
2018-03-09 19:37:46 +01:00
65df386d66 Fix OnPluginsUnloaded not being called for reloadable modules. (#485)
Modules are loaded before plugins, and can hook OnPluginsLoaded. Therefore, they should be unloaded AFTER plugins, and be able to hook OnPluginsUnloaded. This was not the case for reloadable modules.
This affects nvault module, whose OnPluginsUnloaded function wasn't being called.
2018-03-09 19:32:30 +01:00
7b3646a012 Update include files documentation (#360)
* Update include files documentation

* Fix inconcistencies with spaces/tabs, some changes

* Update fun, nvault, vector

* Update sqlx.inc
2017-12-09 00:22:43 +01:00
5632420827 Add wrappers for natives with string flags (#389)
* Add wrappers for natives with string flags

* Add default/none constants, update docs
2017-12-08 00:06:37 +01:00
d6e71c8f4f Little cleanup (#461)
* Remove FAKEMETA leftovers

* Move "require_module" native to where it belongs

* Remove broken AMX module support

* Remove useless natives

* Remove "alloc_amxmemory" and "free_amxmemory" functions

* Remove "strip_name" function

* Clean engine a bit

* Export "GiveFnptrsToDll" (Windows) (Core)

* memcpy -> ke::SafeStrcpy

* Export GiveFnptrsToDll in modules

* Update msvc project files
2017-12-07 18:45:16 +01:00
d2e736b10a Strip whitespace when reading product.version (#470) 2017-12-06 15:29:06 +01:00
a69a015189 Fix open_dir not working properly when called recursively (#467) 2017-11-27 12:08:51 +01:00
ac3e2f48d1 Fix mac build 2017-11-26 20:43:20 +01:00
6d8975f9fc Add -ltr flag to mysql in order to lower glibc requirement (#468) 2017-11-26 20:34:40 +01:00
175d49293c Bump MySQL version to 5.5 (#466)
* Bump MySQL version to 5.5

* Let's see how Travis-CI goes

* Let's see how AppVeyor goes

* Adjust windows library path
2017-10-31 23:06:30 +01:00
7fe7cd746f Fix unreachable code (#465) 2017-10-28 16:27:39 +02:00
5a2d940631 Fix utf8rewind compilation with GCC 2017-10-14 14:25:21 +02:00
0689c664d7 Fixed passing a temporary string to LIGHT_STYLE (#464) 2017-10-08 21:57:12 +02:00
779a4d9e59 Fix #395 backward compatibility issue by adding SetParamEntity2 native (#463) 2017-10-05 11:46:05 +02:00
97df408d51 Fix a crash on the same newmenu overlapping (#462) 2017-10-03 20:43:30 +02:00
361a6cc9e0 Introduce a JSON module (#379)
* Add JSON module

* Merge upstream changes

Fix memory leaks

* Add json include to PackageScript

* Merge upstream changes

Fix memory leaks and increase max nesting

* Fix documentation

* Use AutoPtr in managing JSON handles

* Merge upstream changes

Order of items in an array is preserved after removing an item.

* Merge upstream

* Fix crash

* Add VS projects files and fix mixed tab/spaces

* Remove erroring on "json_free"

* Add comments to "json.inc" file

* Remove overloaded operators

* Use of "override" keyword where needed

* Fix parameter's name
2017-09-30 20:23:12 +02:00
f96cb9a3b6 Use smart pointers in NativeHandle class (#457)
* Use AutoPtr in natives handles

* Use size_t type instead of int in natives handles

* Use pre decrement operator in destroy method
2017-09-25 16:52:12 +02:00
604ecbd31e Fix build clang 3.9+ (#458)
* clang 4.0: fix ordered comparison between pointer and zero

* clang 4.0: fix taking address of packed member

Maybe someday someone will properly fix it

* clang 3.9: passing an object that undergoes default argument promotion to 'va_start' has undefined behavior

Someday proper fix?
2017-09-25 15:22:53 +02:00
feba821306 Fix a typo in equali, strcmp and strncmp natives (#459) 2017-09-12 21:00:26 +02:00
4fc58e6afd Minor fixes in configs files. (#455)
* Missing amx_help_display_msg_time var in amxx.cfg

* Missing vars in CS DOD TFC and TS core.ini

* Standardization to others file location comments in clcmds.ini

* Missing account flag comments + typo errors in NS users.ini
2017-09-01 15:23:49 +02:00
38008a8e03 Fix amx_plugins throwing errors (#456) 2017-09-01 15:18:23 +02:00
ba58cb045f Adjust 'amxx cvars' command output (#453) 2017-08-07 23:42:41 +02:00
8e7eb94e50 Overhaul Restrict Weapons plugin - part 1 (#347)
* Restmenu: Use CS_OnBuyAttempt forward to detect any buy attempt - part 1

- Removed any useless code which won't be needed anymore with forward. A lot!

* Restmenu: Use CS_OnBuyAttempt forward to detect any buy attempt - part 2

- Added the actual forward
- Because of forward passing a CSI_* constant, it's needed to refactor how is saved a blocked item. Not fully implemented everywhere because menu is going to be refactored later as well.

* Restmenu: Replace findAliasId() by cs_get_item_id()

* Restmenu: Use cvar pointers

* Restmenu: Refactor menu - part 1

Purpose:
  - Convert old menus to new menus.
  - Instead of having one menu with several pages, having one main menu (item types) and sub-menus (items list). More readable, more easy to naviguate and no pagination.
  - Move hardcoded strings to ML

* Restmenu: Refactor menu - part 2

Purpose:
  - Convert old menus to new menus.
  - Instead of having one menu with several pages, having one main menu (item types) and sub-menus (items list). More readable, more easy to naviguate and no pagination.
  - Move hardcoded strings to ML
  - Minor visual improvements

* Restmenu: Refactor podbot stuff

- Factorized code
- Used a more direct way to set restrictions

* Restmenu: Refactor load/save config file

- Used new file natives
- Moved harcoded message header to ML
- QoL: saved restricted items will be grouped per type
- Cleaned up few things

* Restmenu: Refactor amx_restrict command

- Minor improvements on how are retrieved/handled arguments from command.
- Same as menu, it displays first classes list, then it lists associated items. No more pagination.
- Minor visual changes.

* Restmenu: Remove unused stuffs

* Restmenu: Move more harcoded messages to ML

* Restmenu: Move MAPSETTINGS define to cvar

- Don't forget me in changelog
- There is room for improvements but for now keep the same behavior

* Restmenu: Add some consistency, no code change

- Renamed some variables
- Changed functions order
- Removed extra spaces
- Fixed leading tabs

* Restmenu: Use inline formatting at various places

* Restmenu: Make command descriptions multilingual for player

* Restmenu: Refresh opened menus if the command is used to save/load/set.

Also, I've removed the renaming of "exit" item because it was misleading as it returns MENU_EXIT when it's named with "back" and handling the action wiht that doesn't make much sense.

* Restmenu: Adjust minor things (consistency, readability, safety)

* Restmenu: Show the current category when items are listed through the command

* Restmenu: Display admin activity on loading/saving

+ load: reset blocked items only if file has been loaded
+ load: ignored if no arguments
+ save: added a silly fix because of the cvars
2017-08-05 10:45:29 +02:00
ab854ec035 Improve UTF-8 support in some natives (bug 6475) (#407)
* Compile as static library, update AMBuildScript and link to core

* Update VS project files to include the library

* Add UTF-8 Rewind library (v1.5.1) to third_party directory

* Update ACKNOWLEDGEMENTS.txt

* Move AMXX buffer in its own function

* Move constants from string.inc to string_const.inc and update project files

* Move stocks from string.inc to string_stocks.inc and update project files

* Improve UTF-8 support in containi() and update documentation

* Improve UTF-8 support in strcmp() and update documentation

* Improve UTF-8 support in strfind() and update documentation

Worth to be noted that this native with ignorecase set was not working properly. So broken that no one reported the issue.
This adds also a safety check for "pos" parameter to not go < 0.

* Improve UTF-8 support in strncmp() and update documentation

* Improve UTF-8 support in equali() and update documentation

* Add an option to some UTF-8 Rewind functions for avoiding invalid data to be replaced

By default it replaces any invalid byte or sequence of bytes by 0xFFFD (3 bytes). It can be problematic when the input buffer is not changed (from a plugin) and that some natives need to calculate a position from the converted string. With such replacement, the position is displaced due the final string length being larger.

This compiles the library as C++, because I added some silly param with a default default value which is not supported by C.

* Improve UTF-8 support in replace_string/ex() and update documentation

* Add is_string_category() and update documentation

* Update a little testsuite plugin (and fix linux compilation)

* Add mb_strotolower/upper() and update documentation

* Add mb_ucfirst() and update documentation

* Add mb_strtotile() and update documentation

* Improve UTF-8 support in get_players() and find_player() with name/case insenstive flags set

* Fix KliPPy's complain
2017-08-05 10:32:16 +02:00
07c3d49cfa Add amx_searchcmd command in adminhelp plugin and do some clean up (#415)
* AdminHelp: Use semicolon everywhere

* AdminHelp: Translate amx_help description

* AdminHelp: Use the available ADMIN_ALL define in register_concmd

* AdminHelp: Bind the cvars

* AdminHelp: Replace %L by %l

* AdminHelp: Remove task only when necessary

* AdminHelp: Reorder some lines to prepare next commit

* AdminHelp: Use read_arg_int() on the first argument and clamp the value

* AdminHelp: Use read_arg_int() on the second argument and clamp the value

* AdminHelp: Rename few variables and callback

* AdminHelp: Use constants for buffers max length

* AdminHelp: Add amx_searchcmd command, and update the multilingual file

* AdminHelp: Adjust spacing a little for readability

* AdminHelp: Add amx_help_display_msg_time cvar

* AdminHelp: Add the new command in the help message (and fix missing return)

* AdminHelp: Add a check if provided entry no. goes above the total found entries

* AdminHelp: Don't show the help message for begin if all commands are already displayed

* AdminHelp: Make sure the server command use amx_help_amount_per_page value
2017-08-01 22:56:21 +02:00
24e56d0476 Add elog_message native (#451)
* elog_message

Like "log_message". Logs a message to the current server log file, however the messages sent are also sent to all plugins and can be hooked using "register_logevent".

* Update amxmodx.cpp

* Update Editor.sci

* Update UnitfrmMain.dfm
2017-08-01 15:14:53 +02:00
1dc1f1b9c4 Introduce Trie Iterators (#413)
* TrieIter: Add possibility to obtain a new'd HashTable iterator

* TrieIter: Add CellTrieIter and storage

* TrieIter: Implement TrieIterCreate

* TrieIter: Implement TrieIterEnded

* TrieIter: Implement TrieIterMore

* TrieIter: Implement TrieIterGetKey

* TrieIter: Implement TrieIterGetSize

* TrieIter: Implement TrieIterGetCell

* TrieIter: Implement TrieIterGetString

* TrieIter: Implement TrieIterGetArray

* TrieIter: Implement TrieIterDestroy

* TrieIter: Invalidate any mutating change that is key addition or key removal

* TrieIter: Clean up the handles at map change

* TrieITer; Add iter tests to trietest.sma

* TrieIter: Fix linux compilation

* TrieIter: Rename TrieIterMore to TrieIterNext

* TrieIter: Adjust documentation

* TrieITer; Adjust trietest.sma

* TrieIter: Create a custom StringHashMap class instead

+ used a copy of |iterator| instead of dynamic allocation
+ initialized vars directly in constructor
+ added a nested iteration test
2017-08-01 15:05:27 +02:00
304e992942 Fix broken cs_set_user_model update_index parameter for the default engine (#450) 2017-07-29 17:01:34 +02:00
4fcfc913d3 Fix Ham_Item_GetItemInfo incorrect associated handler (#449) 2017-07-26 20:36:17 +02:00
c6eb62ccbc Make module loading more safe 2017-07-22 14:36:13 +03:00
6bd2f1feec Fix a engclient_cmd and amxclient_cmd buffer issue (#438) 2017-07-21 23:44:05 +02:00
aa9ec3f872 Fix client_disconnected isn't called on mapchange when ReHLDS API enabled (#446) 2017-07-03 21:52:38 +02:00
f7f86fb040 Rename suki to key_index (#445) 2017-06-28 18:31:59 +02:00
5ad72374cd Cstrike: Get offset for m_bMapHasBombTarget (#443)
* Cstrike: Get offset for m_bMapHasBombTarget

* Add mising entities to common.games/master.games.txt
2017-06-21 10:07:26 +02:00
b7cb555cee Fix a comment typo in core.ini 2017-05-28 22:48:56 +02:00
66cc8dcdaf Minor flagman cleanups (#442)
* Document disableflagman

* Add disabled check, random cleanups
2017-05-28 22:39:44 +02:00
c0011891e6 Fix temporary ban flags, add lang keys (#440) 2017-05-27 21:47:24 +02:00
ac7de68ac7 Fix amx_addban and amx_unban, make them safe (#441) 2017-05-27 16:28:15 +02:00
df4e4949c8 Fix #427, AMTL Code porting (#436)
* Fix crash in CTaskMngr::startFrame()

* Fix crash in EventsMngr::executeEvents()

* Fix loops

* Fix loop iterators signess
2017-05-11 09:35:38 +02:00
7794f27dc2 Fixed bug in cmd_access with usage printing (#434) 2017-05-02 12:54:07 +02:00
1a56577f7a Fix inc/dec operators not returning an iEXPRESSION (#429)
* Fix inc/dec operators not returning an iEXPRESSION

* Fix inc/dec operators in return statement
2017-04-29 23:33:09 +02:00
be3ae83c44 Update get_func_id description (#430)
Return id 0 on success too
2017-04-29 21:13:29 +02:00
398983fc49 Update amxmodx.inc (#432) 2017-04-29 20:56:20 +02:00
e9f501c250 Allow value be empty in lang files (#431)
* Allow value be empty in lang files

* Refactor solution.
2017-04-29 20:55:34 +02:00
123246cc84 Port code to AMTL (#427)
* Remove CQueue

* Remove duplicated files

* Move sh_tinyhash to public/

* Remove sm_queue

Make NVault use of ke::Deque

* Remove sh_string (unused)

* Remove CList dependency from CTask

* Remove CList dependency from CEvent

* Remove CList dependency from modules' functions

* Remove CList dependency ForceObject

* Remove CList dependency Player Auth

* Remove left CList dependencies

* Fix msvc project files

* Update AMTL

* Use InlineList for CScript

* Use InlineList for CModule

* Use Vector for Player Auth
2017-04-14 19:36:59 +02:00
2d049b7ff3 Fix signed/unsigned mismatch warning (#428)
* Fix signed/unsigned mismatch warning

* Fix GCC type warnings
2017-04-04 10:32:04 +02:00
2863455185 Add menu pagination callback (#420)
* Add menu pagination callback

* Update test plugin
2017-04-04 10:29:18 +02:00
ff488dd81f Add new xs stocks (#426)
xs_vec_len_2d returns the length of a 2D vector

xs_vec_distance returns the distance between two vectors
xs_vec_distance_2d returns the distance between two 2D vectors

xs_vec_add_scaled and xs_vec_sub_scaled do two operations
in one for convenience and performance. They add/subtract a vector
scaled by a scalar to another vector. Very useful when working with
unit vectors.
2017-04-03 18:41:46 +02:00
da80667fb0 Ignore ReHLDS initialization on listenserver (#425)
* Remove duplicated files

* Ignore ReHLDS initialization if not a dedicated server
2017-03-19 14:12:07 +01:00
9551c70c59 Rework build pathname functions (#422)
* Rework build_pathname* functions

* Replace old platform defines with the new ones

* Correct usage of build_pathname_r()

* Fix inconsistencies (white spaces)

* Remove useless defines
2017-03-11 19:26:25 +01:00
fa3d28872e Replace s/get_pdata* with s/get_ent_data* in plmenu.sma (#424) 2017-03-11 14:58:10 +01:00
d23d9b1ba8 Fix missing ReGameDLL check in GetItemPrice() (#423) 2017-03-11 10:49:37 +01:00
55c9143b2b Fix a cs_set_user_model issue with model not being persistent set on a 32th player
Related to some PR fixing cs_set_user_model() crash.
2017-03-10 18:33:19 +01:00
115916d753 Add basic ReHLDS and ReGameDLL support (#417)
* Add ReHLDS API files and its dependencies

Note: This has been stolen from ReAPI AMXX module and modified/adjusted to match AMXX existing includes and to provide as less dependencies as possible as well

* Add the necessary files to get ReHLDS interface

* Split SV_DropClient into pre/post code

* Init ReHLDS API and add SV_DropClient hook

* Add Cvar_DirectSet hook and adjust code with helpers

Note: we don't need to split code here. This is pretty much the naive and straight way, but fairly enough for our case. If it happens we got a lot more hooks, we may consider to use some class to manage better the things.

* Move platform and interface stuff in their own files in public directory

* Make sure to init cvar stuff after ReHLDS

* Add ReGameDLL API files and its dependencies in cstrike module

* Init ReHLDS in cstrike module and adjust code

Note: About cs_uset_set_model(). ReHLDS API doesn't offer a way to know directly the precached models, so instead of looping through all the ressources, the models list is saved one time at map change into a hashmap.

* Init ReGameDLL and adjust code

* Fix linux compilation

* Init ReGameDLL in fakemeta module and adjust code

* Rename /reapi directory to /resdk to avoid confusion

* Retrieve gamerules pointer through InstallGameRules in fakemeta module

* Retrieve gamerules pointer through InstallGameRules in cstrike module

Note: actually gamerules is not used if regamedll is enabled, but it could be used in future natives.

* Fix a typo when ReGameDLL is not enabled

* Fix missing interface check for ReHLDS.

I'm pretty sure I was checking at the very first since I worked first on vanilla version of engine, looks like change has been lost.
2017-03-09 19:59:38 +01:00
1c3e8de57a Introduce a datapack position tag (#419) 2017-03-06 21:08:16 +01:00
b7773ba11f Fix sockets crash (#418) 2017-03-04 14:14:08 +01:00
6a553122b1 Update sockets module (#301)
* Module rewrite

- WinSock version changed from 1.1 to 2.2.
- Properly check for WinSock initialization on OnAmxxAttach/Detach.
- Now natives will not be added if we can't start up WinSock.
- socket_open() is now IP version agnostic (both IPv4 and IPv6 are
supported).
- Error reporting has been changed on socket_open(), a new parameter
called _libc_errors has been added, and, if enabled, libc errors will be
returned instead of the previous made-up errors.
- socket_close() now returns a value on success/failure.
- Added non-blocking sockets at socket_open_nb().
- Added socket_is_writable() to check if a socket is ready for write.
- Added socket_is_readable() as an alias to socket_change().
- Code rewritten to be more readable, it should be self-explaining now.

* Update docs and fix AMBuild

Updated documentation following the guidelines

* Fixs for the module

- Fixed the backwards compatibility with the return codes
- Merged socket_connect and socket_connect_nb
- Added a 5th parameter to socket_open that takes bit flags to enable
the new features (libc errors & nonblocking sockets)
- Fixed an error on socket_send2 that caused the buffet not to start
from the beginning if multiple calls were made
- Updated docs
- [docs] Prefixed error codes with SOCK_
- [docs] Added the new flags SOCK_NON_BLOCKING and SOCK_LIBC_ERRORS
- [docs] Added a new stock called SOCK_ERROR_EINPROGRESS(error) to be
used when checking if a newly created nonblocking socket is connecting

* Fixes for the docs

Fix some typos, shorten lines, document SOCK_ERROR_EINPROGRESS

* Document magic numbers

No more magic

* Revert "Document magic numbers"

This reverts commit 0f233292063400ea7fdbcd5e5d5cd6e54f8cd71c.

* More docs fixes

* Fix broken socket_send2()

* Add error checking in send2()

* Remove stock

It should not be needed because nb sockets should always be checked or
writability

* Fix some identations

* Fix return codes doc

* Fix socket_recv() regression

strncopy will stop on a null byte, that makes the function unusable to
receive binary data

* More docs typo fixes
2017-03-03 19:56:22 +01:00
7a7d0442aa Fix VS project file (#416) 2017-02-26 21:15:53 +01:00
3568fb8747 Add client_remove() forward and fix a bug with client not internally disconnected (#414)
* Rename client_disconnected to client_disconnecting

* Add client_disconnected as post forward

* Fix client not properly disconnected internally

Introduced in #264.
Edict is reset once SV_DropClient is called, so that second check would be always false.

* Reflect changes on the concerned plugins

* Revert renaming, let's add only client_remove as post forward
2017-02-25 11:50:52 +01:00
b973d24081 Add missing buffer size check to SQLite QuoteString implementation (#411) 2017-02-23 13:56:58 +01:00
074af44ead Fix a potential crash in ArrayClone for too large arrays (#408) 2017-02-23 13:27:16 +01:00
828e74e6c3 Add RequestFrame() native (#412)
* Add RequestFrame() native

* Change underlying container from CQueue to ke::Deque

* CFrameAction: Fix PackageScript and MSVC project, wrap CFrameAction in AutoPtr
2017-02-23 12:55:53 +01:00
3a73e12550 Update to the latest AMTL (#410) 2017-02-19 15:01:58 +01:00
c27bfcd7fe Fix client_death forward called on kill command if sent by a spectator (#404) 2017-02-18 19:53:58 +01:00
38b8dc338d Fix missing backward compatibility check in TrieGetString() and TrieGetArray() (#406) 2017-02-05 11:52:04 +01:00
7bb1849968 Sanitize servercfgfile and lservercfgfile values with amx_cvar (bug 6578). 2017-01-22 08:01:08 -05:00
ed672847f3 Remove support for %name% replacement in plmenu (bug 6578). 2017-01-21 22:58:03 -05:00
56210f3e96 Quote custom vote winning value (bug 6578). 2017-01-21 22:57:37 -05:00
5519dd0a14 Do case-insensitive compare when filtering password vars in votes (bug 6578). 2017-01-21 22:38:38 -05:00
7589c6c578 Quote args in amx_addban, amx_unban, & amx_exec (bug 6578). 2017-01-21 22:36:57 -05:00
a7c3e34fbe Fix Warning from MSVC: 'Double to Float precision loss' (#402) 2017-01-21 20:58:33 +01:00
f5e734f636 Fixed is_visible native (#392) 2017-01-17 15:52:49 +01:00
a30172f8a6 Fix UTF-8 character parsing due to improper casting (#401)
Upcasting of -ve signed characters (char) to signed integers (cell) results in -ve signed integers which don't represent valid printable characters.
eg. UTF-8 Character '中' (0xE4 0xB8 0xAD) when casted results in 0xFFFFFFE4 0xFFFFFFB8 0xFFFFFFAD which are not valid printable characters.
2017-01-17 15:50:00 +01:00
9b3839de70 Fix missing CS_NORESET constant (#400) 2017-01-10 18:51:41 +01:00
faa9f6ea9f Fix returning strings from variadic functions (lost changes) (#399) 2017-01-09 20:40:28 +01:00
3e660011b2 Fix typo in TE_STREAK_SPLASH description (#398) 2017-01-06 21:05:36 +01:00
e19f80cd3f Fix the modules/mysqlx/AMBuilder not building on Visual Studio 2015 (#397)
* Fix the modules/mysqlx/AMBuilder not building on Visual Studio 2015

Applied the same fix as in:

Fix building of MySQL DBI extension on VS 2015+ by psychonic:
94383d995d

* Removed the msvc15hack.c from the sources when not necessary.
2017-01-06 21:03:22 +01:00
6473118b24 Fixed entity param changing in hamsandwich (#395) 2017-01-02 09:38:43 +01:00
615ecdf7f3 Fixed grammar for Start Voting mapsmenu.txt lang (#393)
This is bad, what it currently means `Votacao Iniciada` (Votação Iniciada) in english is `The voting has been started`, instead of `Start voting`.

The translator translate it back as `Voting Started`.
Translator link: https://translate.google.com.br/#pt/en/Vota%C3%A7%C3%A3o%20Iniciada
2017-01-01 11:28:11 +01:00
79d9fc530d Update AMTL (#390) 2016-12-31 23:49:46 +01:00
e3ae451c09 Add missing format param (#391) 2016-11-25 11:26:58 +01:00
4c8ef63383 Fix: leak memory from unregister_forward (#388) 2016-10-12 23:26:21 +02:00
e95099817b Allow execute forwards without need to create variable for returned value (#382)
We don't need to create variable to store value returned by forward when we ignore it.
2016-09-01 10:37:14 +02:00
732a05dde0 Back out changes in #366 and introduce read_argv_int/float()
* Revert "Extend "read_argv" native"

This reverts commit aaa2934595.

This broke binary compatibility with either older, already compiled
plugins, or newly compiled plugins if you forgot to update .inc headers.

This happened because read_argv used to receive maxlen by value, and
after
this commit it receives it by reference. This causes read_argv either
to fail, or worse, to buffer overflow, resulting in a security vulnerability.

Newly introduced functionality for read_argv should be added with a new,
separate native.

* Add "read_argv_int" & "read_argv_float" natives
2016-08-31 20:34:02 +02:00
a9557fe53d Use exponentiation by squaring instead of n-times multiplications in power() (#385) 2016-08-27 10:12:02 +02:00
ea43a61094 Update hashing library (#384) 2016-08-22 11:21:46 +02:00
e24b9548d4 Update to the latest AMTL (#381)
* Update to latest AMTL.

* Update .gitignore for VS2015
2016-08-12 15:30:06 +02:00
b9997eb628 Fix a floatround bug (#376)
* Fix floatround overflow

floatround would overflow for floats greater than 2^30 because internally
it would double the number (therefore anything greater than 2^30 results
in something greater than 2^31 which would cause overflow of course)

floatround behaviour is left exactly identical otherwise (although I find
it very weird and wrong to deliberately avoid banker's rounding, it would
be a bad idea to change this behaviour due to compatibility)

Remember to reassemble amxexecn and amxjitsn

* Update the compiled object files
2016-06-27 12:23:08 +02:00
a53e7905db Extend amxx list command (#377) 2016-06-26 14:04:33 +02:00
861011fa24 Merge pull request #375 from voed/patch-1
Fixed some natives descriptions
2016-06-14 08:52:36 +02:00
575d215c77 Fixed some natives descriptions 2016-06-14 04:49:46 +03:00
294066ca61 Merge pull request #374 from Arkshine/fix/util_replaceall
Fix UTIL_ReplaceAll not properly tracking length.
2016-06-10 15:29:33 +02:00
2099a88ddf Fix UTIL_ReplaceAll not properly tracking length. 2016-06-06 12:09:42 +02:00
1662b47f7e Merge pull request #372 from Ni3znajomy/gcc6-fix-compilation
Fix compilation error for GCC 6
2016-06-05 19:51:27 +02:00
f3c58b7cd6 Merge pull request #369 from Ni3znajomy/forwards/value-by-reference
Values by reference in forwards
2016-06-05 19:50:40 +02:00
ce59a62f72 Update mapsmenu.txt 2016-05-11 16:27:50 +03:00
8658f722dd Update mapsmenu.sma
Essentially:

- Old Menus were replaced with New Menus.
- Most of old natives like 'format' were replaced with more specific natives like 'formatex'/'add'.
- Added 'Search' feature for both menus but it will reduce the number of items per page to 6 (mapmenu) or 5 (votemapmenu).
- Added 'Unselect' feature for votemapmenu, item will be now colored in red, not disabled like before (that was needed, it was very annoying when you would select a map, but you selected another because you could not unselect and you were forced to reopen the menu)


Hope you like it, this plugin is a core amxx plugin and because of inexistent feature of 'unselect' for votemapmenus is needing a rework.
Plugin was tested, in my opinion is fully functionally.
Just test it and enjoy the new features.
2016-05-11 16:20:32 +03:00
446a1a5108 Fix compilation error for GCC 6.1
Fix compilation error due -Wmisleading-indentation
2016-05-04 15:01:29 +02:00
2628ce8664 Merge pull request #349 from Arkshine/feature/command-ml
Add a param to register_*cmd() and get_*cmd() to indiquate info is a multilingual key + modify plugin
2016-04-16 13:12:21 +02:00
9054643fe8 Add a param to register_*cmd() and get_*cmd() to indiquate info is a multilingual key + modify plugin 2016-04-16 11:56:49 +02:00
09e49439bc Merge pull request #370 from Arkshine/fix/cs_set_user_model
Fix a crash after cs_set_user_model is used with model_index parameter set.
2016-04-16 11:45:37 +02:00
af0afabfa0 Merge pull request #366 from Ni3znajomy/read_argv2
Extend "read_argv" native
2016-04-15 20:29:44 +02:00
ffa4e05708 Merge pull request #356 from Arkshine/fix/some-cstrike-natives
Fix issues with some cstrike natives
2016-04-11 11:53:35 +02:00
ccf8026761 Merge pull request #367 from Arkshine/fix/engine-typos
Fix typos in entity_intersects() and get_global_edict2() natives
2016-04-11 11:28:19 +02:00
253dec94d1 Fix a crash after cs_set_user_model is used with model_index set. 2016-04-07 20:27:27 +02:00
53f9144fc3 Values by reference in forwards 2016-04-05 18:51:18 +02:00
d91144a10d Fix typos in entity_intersects() and get_global_edict2() natives 2016-03-31 19:37:12 +02:00
aaa2934595 Extend "read_argv" native 2016-03-28 20:05:56 +02:00
21c4886f90 Merge pull request #365 from Ni3znajomy/fix-docs
Fix description of "set_user_info" native
2016-03-23 17:43:56 +01:00
5ad1efd698 Fix description of "set_user_info" native 2016-03-23 17:27:15 +01:00
0bb5d86c20 Merge pull request #363 from Arkshine/update/clang-travis
Update TravisCI build to use Clang 3.7
2016-03-20 23:08:22 +01:00
94599e9b4e Update TravisCI build to use Clang 3.7 2016-03-20 23:02:15 +01:00
fdebeab612 Merge pull request #361 from alliedmodders/compile-fixups
Compile fixups for Clang 3.8
2016-03-20 22:36:56 +01:00
e6a2bc545c Merge pull request #362 from Ni3znajomy/update-message-stocks
message_stocks.inc: Cache messages id
2016-03-20 13:13:58 +01:00
5a3f4be04e message_stocks.inc: Cache messages id 2016-03-20 13:04:48 +01:00
79a6dc9501 Fix shift-negative-value warning on newer compiler versions.
error: shifting a negative signed value is undefined
2016-03-17 15:12:26 -04:00
19dd940b22 Fix pointer-bool-conversion warning on newer compiler versions.
error: address of array 'lval->sym->name' will always evaluate to 'true'
2016-03-17 15:10:55 -04:00
7522403da8 Merge pull request #344 from Arkshine/fix/iniparser-inline-comment
Remove inline comment support in multilingual INI parser (bug 6476)
2016-03-16 23:57:28 +01:00
aa2caacf4c Replace INDEXENT and ENTINDEX by TypeConversion for consistency 2016-03-16 21:40:43 +01:00
ae4368a3ca Remove inline comment support in multilingual INI parser 2016-03-16 19:50:46 +01:00
4c7375555a Fix typo in cs_get_translated_item_alias() 2016-03-16 16:29:56 +01:00
28a0b0626b Fix incomplete sanity check in cs_get_weapon_info() 2016-03-16 16:29:56 +01:00
da2abb9c3b Fix a bcompat issue with cs_s/get_user_backpackammo() by not relying on m_rgpPlayerItems to get ammo index 2016-03-16 16:29:55 +01:00
62a7fe0be5 Merge pull request #342 from Arkshine/feature/cs_get_item_alias
Add cs_get_item_alias(), improve cs_get_item_id() & cleanup alias datas
2016-03-16 15:15:00 +01:00
c3a52b366e Add cs_get_item_alias() native & cleanup alias datas 2016-03-16 12:29:33 +01:00
d4691bb799 Merge pull request #358 from Arkshine/fix/allow-null-invoker-playbackevent
Allow null invoker to be passed in EngFunc_PlayBackEvent (bug 6467)
2016-03-16 09:57:48 +01:00
494444a433 Allow null invoker to be passed in EngFunc_PlayBackEvent 2016-03-02 14:55:23 +01:00
f981aa34dc Merge pull request #355 from Arkshine/fix/typo-find_ent_in_sphere
Fix typo in find_ent_in_sphere()
2016-02-24 23:58:16 +01:00
c6024b93ce Fix typo in find_ent_in_sphere 2016-02-24 23:47:17 +01:00
8d89104241 Merge pull request #350 from Arkshine/feature/inline_fmt
Add fmt() native to format and return a string inline
2016-02-23 20:09:41 +01:00
be06e2448b Add fmt() native to format and return inline a string 2016-02-23 19:56:02 +01:00
f2272ab4cb Merge pull request #351 from Arkshine/fix/native-array-compilation
Fix issue where native functions returning an array would not compile
2016-02-23 19:41:43 +01:00
2c73268668 Fix issue where native functions returning an array would not compile 2016-02-22 23:37:09 +01:00
f8dd3c0efd Merge pull request #354 from Arkshine/update/tfc-vtable-linux
Fix TFC virtual functions offsets under linux
2016-02-19 18:30:50 +01:00
141f5effa3 Fix TFC virtual functions indexes under linux 2016-02-19 17:29:21 +01:00
721cc0ec5e Merge pull request #353 from Ni3znajomy/cstrike/cs_get_user_weapon
Add extra parameters to cs_get_user_weapon native
2016-02-17 21:21:34 +01:00
cb87fa12e1 Add extra parameters to cs_get_user_weapon native
Add clip & ammo as optional as get_user_weapon native has
2016-02-17 20:46:42 +01:00
c11d8f033e Merge pull request #348 from Arkshine/update/ambuildscript
Refactor and cleanup the AMBuildScript a bit
2016-02-12 02:10:53 +01:00
23080b7455 Refactor and cleanup the AMBuildScript a bit 2016-02-12 02:05:17 +01:00
1d5fb4b9d1 Merge pull request #346 from Arkshine/featire/entindex-cleanup
Engine: Replace ENTINDEX with TypeConversion
2016-02-11 22:20:08 +01:00
1234528521 Engine: Replace ENTINDEX with TypeConversion 2016-02-11 22:07:01 +01:00
9fb72a896d Merge pull request #334 from Arkshine/move-dropclient-detour
Enable detours in ServerActivate to avoid sig conflict with third-party AMXX modules
2016-02-10 19:06:19 +01:00
9d68a5f4cc Merge pull request #332 from Arkshine/feature/cs_set_ent_class
Add cs_set_ent_class native
2016-02-09 11:34:40 +01:00
2a90fc0fe8 Merge pull request #336 from Arkshine/update/gameconfigs
Update GameConfig
2016-02-09 11:27:10 +01:00
2928c622f9 Add cs_set_ent_class native 2016-02-09 11:27:02 +01:00
696d842b07 Add info message when loading custom gamedata 2016-02-09 11:19:35 +01:00
b00ca9bb7a Merge pull request #345 from Arkshine/fix/engine-bcomp
Engine: Fix more bcompat for CHECK_ENTITY
2016-02-09 10:48:39 +01:00
6b5d26c9ce Merge pull request #352 from Ni3znajomy/fix-gamedata
Fix linux/mac GiveNamedItem and GiveDefaultItems symbols
2016-02-08 13:39:19 +01:00
f3ebe71dd1 Fix gamedata 2016-02-08 13:24:51 +01:00
07f87990ef Remove use of Vendor.behavior in AMBuild scripts 2016-02-03 22:53:40 +01:00
86d34e9bc5 Engine: Fix more bcompat for CHECK_ENTITY 2016-02-03 13:34:03 +01:00
664c25bdac Merge pull request #343 from Arkshine/fix/typo-lookuplangkey
Fix LookupLangKey retrieving invalid index
2016-02-01 21:32:23 +01:00
78619d3710 Fix LookupLangKey retrieving invalid index 2016-02-01 14:48:32 +01:00
cba4c74f94 Merge pull request #341 from WPMGPRoSToTeMa/master
Fakemeta: fixed bug with recursive pre hooks (one returned supercede …
2016-01-26 17:32:11 +01:00
3c74e72242 Fakemeta: fixed bug with recursive pre hooks (one returned supercede can supercede several hooks) 2016-01-26 01:34:45 +03:00
0462ca02c8 Merge pull request #340 from Arkshine/fix/cstrike-lower-command
Fix CS_OnBuy* not triggered from alias containing uppercase letters
2016-01-25 01:03:41 +01:00
209ff4d527 Merge pull request #339 from IgnacioFDM/fix-whitespace
Normalize line endings and whitespace
2016-01-23 22:56:46 +01:00
fa7391e814 Merge pull request #330 from WPMGPRoSToTeMa/csgetuserweapon
Add cs_get_user_weapon_entity() and cs_get_user_weapon() natives
2016-01-23 17:53:54 +01:00
fafa1f11f0 Fix CS_OnBuy* not triggered from alias containing uppercase letters 2016-01-23 00:09:04 +01:00
06290483da Merge pull request #337 from Ni3znajomy/cvar_directset
Move Cvar_DirectSet to gamedata
2016-01-22 01:25:21 +01:00
0e8d876c5d Move Cvar_DirectSet to gamedata 2016-01-21 23:50:07 +01:00
e502e12e07 Normalize line endings and whitespace 2016-01-16 21:15:52 -03:00
60ebc444ab Merge pull request #338 from Arkshine/fix/client_print_color
Improve client_print_color by inserting default color code at the start of string
2016-01-16 14:13:22 +01:00
307dab47c8 Merge pull request #326 from Arkshine/feature/enable-disable-logevent
Add enable/disable_logevent() natives
2016-01-16 12:18:59 +01:00
a64dbe0268 Merge pull request #331 from Arkshine/fix/buffer-oob
Fix an out of bound buffer index
2016-01-16 12:17:29 +01:00
89dda4879b Merge pull request #335 from Arkshine/fix/closing-newmenus
Fix recursion issue with show_menu and newmenus
2016-01-16 12:17:02 +01:00
240c81e626 Improve client_print_color by inserting default color code at the start of string 2016-01-16 12:09:13 +01:00
33768740fa Fix LoadGameConfigFile returning valid handle on invalid path 2016-01-15 17:35:21 +01:00
f1a2a00d38 Allow gameconfig without master for convenience 2016-01-15 17:33:42 +01:00
e634e512c8 Fix recursion issue with show_menu and newmenus 2016-01-15 12:56:16 +01:00
98fb03dd30 Enable detours in ServerActivate to avoid sig conflict with third-party AMXX modules 2016-01-11 23:25:02 +01:00
af0042b71d Merge pull request #333 from Arkshine/update-gitignore
Ignore .opendb extension introduced with VS 2015 Update 1
2016-01-11 20:00:36 +01:00
9df5bd708e Ignore .opendb extension introduced with VS 2015 Update 1 2016-01-11 19:58:35 +01:00
5b54a24b4e Merge pull request #325 from flaviommedeiros/master
Avoiding directives that split up parts of statements.
2016-01-11 19:38:13 +01:00
4662109980 Fix an out of bound buffer index 2016-01-07 19:42:47 +01:00
b85b37192e New natives: cs_get_user_weapon_entity and cs_get_user_weapon 2016-01-06 23:10:31 +03:00
0af2c0e4c1 Merge pull request #328 from WPMGPRoSToTeMa/selinuxcompatibility
SELinux compatibility: memalign -> mmap
2016-01-04 17:27:09 +01:00
48d7a04c73 SELinux compatibility: memalign -> mmap 2016-01-03 21:38:31 +03:00
866339eff6 Merge pull request #327 from Arkshine/fix/replace_stringex
Fix typo in replace_stringex native
2015-12-24 23:13:04 +01:00
b0e5e8d331 Fix typo in replace_stringex native 2015-12-24 19:12:55 +01:00
17a31b75d7 Add enable/disable_logevent() natives 2015-12-24 19:08:00 +01:00
f796df783c Avoiding directives that split up parts of statements. 2015-12-24 12:42:34 -03:00
ac37f8053b Merge pull request #320 from Arkshine/fix/l-translation-specifier
Fix incorrect translation language for %l format identifier
2015-12-24 15:54:28 +01:00
01d703cdbb Merge pull request #323 from luxxxoor/patch-1
Adding flag parameter to user_silentkill.
2015-12-24 14:45:45 +01:00
20959d1444 Merge pull request #322 from Ni3znajomy/feature/client-connecting
New client_connectex forward & extend client_authorized
2015-12-24 14:41:06 +01:00
62a5c54a18 Add client_connectex & extend client_authorized forward 2015-12-22 16:36:51 +01:00
892f0519ad Adding flag parameter to user_silentkill.
The api says that the user_silentkill() "Kills a user without a message.",  that means it is just user_kill() without sending deathmsg.
But user_silentkill() automatically kills player without affecting the client's score (and that is not mentioned in api), so i'll add a second parameter to user_silnetkill() to let user to decide if he want to kill a player without or not affecting the table.
New parameter has the default value 1, so it won't break the compatibility.
2015-12-20 01:02:39 +02:00
6a18f8007d Fix incorrect translation language for %l format identifier 2015-12-13 20:02:13 +01:00
8bb8aaa0db Merge pull request #318 from Arkshine/fix-cvar-bounds-and-hook
Enable hook detour on cvar with bounds regardless current value
2015-12-11 14:45:59 +01:00
cc9f679a85 Enable hook detour on cvar with bounds regardless current value 2015-12-11 10:33:54 +01:00
7cdc72f936 Merge pull request #317 from WPMGPRoSToTeMa/hamposthookretval
Hamsandwich: fix HAM_OVERRIDE in post hooks (bug 6443)
2015-12-10 19:25:14 +01:00
5c8c925e8a Hamsandwich: fix HAM_OVERRIDE in post hooks (bug 6443) 2015-12-09 21:38:08 +03:00
8ec6136a7c Merge pull request #315 from Arkshine/cstrike-sanity-check
Make sure client is alive before checking buying commands
2015-12-08 01:06:16 +01:00
5b0191f691 Make sure client is alive before checking buying commands 2015-12-07 19:20:48 +01:00
0df3715894 Merge pull request #316 from Arkshine/fix/missing-master.games.txt
Fix missing master.games.txt reference in PackageScript
2015-12-05 18:49:58 +01:00
6190582f16 Fix missing master.games.txt reference in PackageScript 2015-12-05 18:43:33 +01:00
4cea082303 Merge pull request #314 from Th3-822/fix-strncmp-case-sensitivity
Fix strncmp case sensitivity
2015-12-03 00:55:20 +01:00
578a2f9852 Fix strncmp case sensitivity
strncmp was using case insensitive call when ignorecase == false
2015-12-02 19:08:10 -04:30
47f66a3d13 Merge pull request #310 from Arkshine/update-latest-amtl-refptr
Update to the latest AMTL - Rename Ref to RefPtr.
2015-11-23 20:17:27 +01:00
02ac6fa2d7 Update to the latest AMTL - Rename Ref to RefPtr. 2015-11-23 14:45:07 +01:00
2971bb65fd Merge pull request #309 from Arkshine/refactor-gamerules-retrieval
Refactor gamerules address retrieval
2015-11-23 00:58:37 +01:00
91f02b145b Merge pull request #308 from Arkshine/fix/cstrike-meta-return
Fix missing meta return in ServerActivate
2015-11-23 00:47:21 +01:00
42a09f8593 Fix missing meta return in ServerActivate 2015-11-23 00:35:44 +01:00
87b1833f73 Refactor gamerules address retrieval 2015-11-23 00:29:43 +01:00
664c85106f Merge pull request #278 from Arkshine/feature/cstrike-update-2
Update cstrike module - 2
2015-11-21 00:19:01 +01:00
a445e806ea Cstrike: Refactor - Simplify forwards logic, fix and improve few things
- The logic around CS_OnBuy forward has been simplified. Since there is no way to have a consistent way to hook/block for all items, the new logic is to have as less as possible code, especially in blocking mode where we want to avoid to do extra stuffs (e.g blocking sound, event, etc).

  * All guns + shield -> CanBuyThis()
  * Nvgs and Fefuser only -> CanPlayerBuy()
  * The others items -> GiveNamedItem() + AddAccount()
  * Ammos -> -> BuyGunAmmo() + GiveNamedItem() + AddAccount()

- Fixed missing buyzone check when alias from console are used (CS_OnBUy* were incorrectly fired).
- Fixed an infinite loop when buying of ammos are blocked. Sorted by hooking BuyGunAmmo().
- Fixed blocking mode for some items. Some game behaviors were not blocked (e.g. weapon drop).
- Fixed forwards being triggered even though errors were found. Detours are now a destroyed and associated variables resetted when necessary. Toggling forwards state is now based on detours state.
- Moved things in its own functions (game functions to execute, class members retrieval)
- Renamed CommandAliases -> ItemInfos (more generic)
2015-11-21 00:13:06 +01:00
1ad01f4989 Merge pull request #307 from Arkshine/fix/comma-compiler
Fix shifted warning messages from pawn compiler due to missing comma in array
2015-11-12 21:05:37 +01:00
6d9fe60608 Fix shifted warning messages from compiler due to missing comma in array 2015-11-12 20:13:54 +01:00
4abeac1231 Merge pull request #306 from IgnacioFDM/patch-1
Allow wordspawn in edict/entvars->index type conversion  (bug 6429)
2015-11-06 12:52:42 +01:00
72d3f21816 Allow wordspawn in edict/entvars->index type conversion and EHANDLE edict get/set 2015-11-06 07:44:14 -03:00
d08e1357dd Cstrike: Fix defuser/nvgs not being called with CS_OnBuy and fix wrong shield CSI constants 2015-11-03 10:45:51 +01:00
eb0222455a Cstrike: Fix spaces/tabulations/typo 2015-11-03 10:45:51 +01:00
b6910667a8 Cstrike: Remove parsing error and update native error message 2015-11-03 10:45:50 +01:00
e87976bc09 Cstrike: Remove CS_OnGetItemPrice forward (reverted from commit 33a7d74b6da2ca4dcb621e9b306c386ba040571e)
This is actually not possible to have a proper system to allow this.
This is two majors problems:
  - The item price text can't be changed, whatever old and VGUI menu (it's either harcoded in config file or in client binary)
  - Once you open VGUI menu, to know if user has enough money to select an item, client relies on the current HUD money value, this means, since we can't directly changed price, before opening the menu, money needs to be somehow faked and restored once closed. It's awful.

Overall it can't work properly, and at the end current forward doesn't make sense.

If an author wanted to have its own prices, the only only way would to force players to use old menu, then overwriting the whole buy menu, so you would be able to display what you want exactly.
2015-11-03 10:45:50 +01:00
ffe8b7761e Cstrike: Move CSW_* constants from amxconst.inc to cstrike_const.inc 2015-11-03 10:45:49 +01:00
2c5cc4289e Cstrike: Add cs_is_valid_itemid() stock 2015-11-03 10:45:49 +01:00
75853dae60 Cstrike: Add cs_find_ent_by_owner() native 2015-11-03 10:45:48 +01:00
23b0450938 Cstrike: Add cs_get_weapon_class() stock (weapon id -> class id)
Note: this has been modified a bit later in cs_is_valid_itemid() commit.
2015-11-03 10:45:47 +01:00
600a15a57b Cstrike: Add cs_get_weapon_info() native 2015-11-03 10:45:47 +01:00
60cdbeb219 Cstrike: Add CS_OnGetItemPrice forward to get/alter an item price on purchase 2015-11-03 10:45:46 +01:00
cf2f753660 Cstrike: Fix CS_OnBuy called only on the first buying of primary/secondary ammos and not when game loops to give until max amount
When game gives ammos, it loops until the max amount is reached, but it sill calls GiveNamedItem and AddAcount, so forward should be called for each of these ones.

Code logic is simplified and more understandable.
2015-11-03 10:45:46 +01:00
e6a2434887 Cstrike: Add cs_get_item_id() and cs_get_translated_item_alias() natives 2015-11-03 10:45:45 +01:00
c6628f22ee Cstrike: Add more known constants from game 2015-11-03 10:45:44 +01:00
d3e5957215 Cstrike: Add cstrike_const.inc and move existing constants there 2015-11-03 10:45:44 +01:00
eb9405bd97 Merge pull request #298 from Arkshine/feature/gamerules-natives
Introduce get/set_gamerules_*() natives to read/write on the gamerules object
2015-11-03 10:42:35 +01:00
49184c86a3 Refactor 5 - Rename original file/var for gamerules 2015-11-02 20:10:40 +01:00
4333255571 Refactor 4 - Move entities natives to its own file and reflect changes 2015-11-02 20:10:39 +01:00
1032fbdbd0 Refactor 3 - Simplify macros and move them to shared file as well 2015-11-02 20:10:39 +01:00
dc6f171f20 Refactor 2 - Duplicate get_member_* for each set of natives for consistency 2015-11-02 20:10:38 +01:00
c07b269c94 Refactor 1 - Move shared code to its own file and reflect changes 2015-11-02 20:10:38 +01:00
02c1b20ed7 Rename get_ent_data_size/info/basetype to be more generic 2015-11-02 20:10:37 +01:00
68f99bc2d5 Add get/Set_gamerules_* natives 2015-11-02 20:10:37 +01:00
df507a675b Reflect changes on get/set_data* natives 2015-11-02 20:10:36 +01:00
d9c7e72d4b Update macros to support gamerules configs 2015-11-02 20:10:36 +01:00
234b537ad9 Factorize gamerules data code 2015-11-02 20:10:35 +01:00
483ef98af3 Load gamerules address and offsets 2015-11-02 20:10:34 +01:00
f31e0e405f Add gamerules offsets for supported mods 2015-11-02 20:10:34 +01:00
7db6e9355d Merge pull request #305 from IgnacioFDM/master
Remove extra semicolon
2015-10-20 10:47:50 +02:00
b78c239395 Remove extra semicolon 2015-10-20 05:34:18 -03:00
b7be35618d Merge pull request #304 from Arkshine/fix/crash-invalid-address
Fix a potential crash if SV_DropClient address could not be found
2015-10-15 13:03:48 +02:00
42fb860077 Fix a potential crash if SV_DropClient address could not be found 2015-10-15 12:50:58 +02:00
e2e57d8347 Merge pull request #302 from Arkshine/fix/compilation-gcc
Fix linux compilation with gcc-4.8 and higher.
2015-10-13 20:39:09 +02:00
85f03c4a06 Fix linux compilation with gcc-4.8 and higher. 2015-10-13 20:25:09 +02:00
915da57d32 Merge pull request #300 from Arkshine/fix/cstrike-sv
Fix retrieval of sv address not working under linux
2015-10-11 13:46:10 +02:00
b3e5e10473 Fix retrieval of sv address not working under linux 2015-10-11 13:25:31 +02:00
2eeeb2997d Merge pull request #299 from Arkshine/fix/typos-in-fakemeta
Fix (get/set)_pdata_(int/float) using the wrong offset value (typo from #297)
2015-10-09 20:36:36 +02:00
9997c31703 Fix (get/set)_pdata_(int/float) using the wrong offset value (typo from #297) 2015-10-09 20:30:45 +02:00
cae7281def Merge pull request #297 from Arkshine/fix/invalid-edict-on-last-player
Fix some natives relying on a known engine bug related to last player's edict being invalid
2015-10-08 19:52:27 +02:00
9bee1f7edf Consistency: Replace GETEDICT with HLTypeConversion in core 2015-10-08 19:36:42 +02:00
b65a0600ee Consistency: Replace GETEDICT and variants with HLTypeConversion in cstrike module 2015-10-08 19:25:00 +02:00
6f301b5cea Consistency: Replace GETEDICT, INDEXENT2 and others things with HLTypeConversion in hamsandwich module 2015-10-08 19:24:49 +02:00
bf5fdc2b5c Consistency: Replace GetPlayerEdict with HLTypeConversion in fun module 2015-10-07 23:27:58 +02:00
e52fc14114 Consistency: Replace INDEXENT2 with HLTypeConversion in engine module 2015-10-07 23:27:57 +02:00
429a4596c1 Consistency: Replace INDEXENT2 and others things with HLTypeConversion in fakemeta module 2015-10-07 23:27:56 +02:00
9980b7ac62 Fix some natives relying on a known engine bug related to last player's edict being invalid 2015-10-06 17:19:01 +02:00
fd0f6cc429 Merge pull request #296 from Arkshine/feature/update-to-latest-amtl
Update to latest AMTL
2015-10-05 19:49:10 +02:00
c29eabec50 Fix max length inconsistencies + typo 2015-10-05 19:12:30 +02:00
138b9e1510 Remove UTIL_Format() and UTIL_VarArgs() 2015-10-05 19:12:08 +02:00
f22dc769f4 Replace some LibraySys usage with AMTL primitives 2015-10-02 23:22:22 +02:00
f976861e21 Fix AMBuild and VS projects files 2015-10-02 23:22:22 +02:00
2d910838a2 Fix AMTL internal paths 2015-10-02 23:22:21 +02:00
f811bab608 Update AMTL to latest revision 2015-10-02 23:22:20 +02:00
9a4731dd14 Merge pull request #284 from Arkshine/feature/new-pdata-natives
Introduce new natives to read/write on entity's private data based off class/member name using gamedata files
2015-09-19 20:56:31 +02:00
16f65663dc Add new natives to read/write on entity's private data based off class/member name available from gamedata files 2015-09-19 20:07:48 +02:00
ac2bcb2d19 Merge pull request #282 from Arkshine/gamedata-type-desc
Modify game config parser to support more offset data and reflect changes
2015-09-07 09:10:28 +02:00
eaa330d745 Merge pull request #291 from alliedmodders/fix/native-overflow
Fix crash when dynamic native is executed with the max number of params
2015-09-05 18:24:51 +02:00
b63e63cfcd Fix crash when dynamic native is executed with the max number of params
This fixes a buffer overflow with `g_Params`, which has a size of 16 but params index starts to 1. As consequence when 16 params are passed, `g_Params[16]` is indexed and likely overwrites something important which leads to a crash at some point.

It doesn't happen in 1.8.2. Possible reasons why it happens in dev version is this uses newer compiler and compiling optimization are better , resulting crash is triggered now. 

Reported here https://forums.alliedmods.net/showthread.php?t=271103.
2015-09-05 17:49:37 +02:00
5b3a5a0153 Merge pull request #289 from alliedmodders/fix/typo-autoexeconfig
Fix typo in AutoExecConfig native
2015-09-05 08:49:04 +02:00
57a5004f4e Fix typo
Related to #266. Looks like I've changed the prefix afterward at some point for some reason, but engine is retarded and with `plugin.something.cfg` it will understand extension is `something` instead  of `cfg` ; and will fail to execute as it's an invalid extension (only `cfg` and `rc` are allowed).
2015-09-05 08:42:31 +02:00
190304f601 Merge pull request #288 from Arkshine/sync-amtl
Update AMTL submodule from upstream and reflect changes
2015-08-26 11:19:19 +02:00
0005d1a6b5 Update AMTL submodule from upstream and reflect changes 2015-08-26 11:15:07 +02:00
224239f5a1 Merge pull request #266 from Arkshine/feature/autoexeccfg
Introduce automatic config file for plugins and two forwards
2015-08-26 10:42:59 +02:00
5b8bbddbc1 AutoExecConfig: Adjust few things 2015-08-26 10:38:31 +02:00
c5d4eb49d4 Merge pull request #287 from Sylvert0/Fix-cs_set_user_team
Add a CS_NORESET constant for use with cs_set_user_team for skipping the model reset
2015-08-23 19:44:47 +02:00
e4b635f5be Update CstrikeNatives.cpp 2015-08-22 17:54:00 -03:00
f95f2032fc Update cstrike.inc 2015-08-22 17:51:48 -03:00
78b1154b8d AutoExecConfig: Do not traumatize Travis and Nextra 2015-08-14 16:38:29 +02:00
1f3ba35140 AutoExecConfig: Remove config code in admin.sma 2015-08-14 16:38:28 +02:00
1f3c7cf272 AutoExecConfig: Update documentation 2015-08-14 16:38:28 +02:00
9a1dc5d179 AutoExecConfig: Add AutoExecConfig native 2015-08-14 16:38:27 +02:00
f22185d646 AutoExecConfig: Enable the configs 2015-08-14 16:38:27 +02:00
517a08e134 AutoExecConfig: Add CoreConfig class + OnAutoConfigsBuffered / OnConfigsExecuted forwards 2015-08-14 16:37:48 +02:00
a9b183612b Merge pull request #264 from Arkshine/fix/dropclient
Fix player not being internally disconnected in some situation and add client_disconnected forward
2015-08-14 00:22:57 +02:00
ed4faf7c11 Fix player not being internally disconnected in some situation + add client_disconnected forward 2015-08-14 00:08:50 +02:00
a9015d1d84 Merge pull request #283 from alliedmodders/fix/newmenu-propnocolor
Fix MPROP_NOCOLORS menu property not working
2015-08-13 12:19:12 +02:00
83a72a6e3a Fix MPROP_NOCOLORS menu property not working 2015-08-13 12:04:31 +02:00
5f0b92f7c3 Fix typos 2015-08-12 10:43:59 +02:00
c270243b56 Replace "time" type name by a more generic one "float" 2015-08-10 18:06:06 +02:00
a6e587f0f0 Update Opfor offsets 2015-08-10 18:06:04 +02:00
a50b1e17d8 Update TFC offsets 2015-08-10 18:06:03 +02:00
9a83db66f5 Update HLDM offsets 2015-08-10 18:06:02 +02:00
2fa53badd9 Update DoD offsets 2015-08-10 18:06:01 +02:00
db14b0eae8 Update CS offsets 2015-08-10 18:06:00 +02:00
f4f4d966f3 Reflect changes where game config functions are used 2015-08-10 18:05:59 +02:00
7423ac6824 Modify game config parser to support more offset datas (type, size, etc.) 2015-08-10 18:05:59 +02:00
20201290e3 Merge pull request #271 from Arkshine/fix/ns_remove_upgrade
Fix ns_remove_upgrade() native (bug 3394)
2015-08-10 15:28:44 +02:00
4563f56e77 Merge pull request #277 from Arkshine/fix/potential-issues
Fix some potential issues
2015-08-10 15:28:32 +02:00
c46e666907 Merge pull request #279 from Arkshine/fix/sortadtarray-string
Fix an SortADTArray() issue where strings are not properly sorted
2015-08-10 15:28:23 +02:00
10eb6b370a Merge pull request #280 from Arkshine/improve-offsets-list
Cleanup/Fix CS gamedata of entities offsets and add support for HLDM, DoD, TFC and OpFor
2015-08-09 19:26:05 +02:00
8f90f30b07 Gamedata: keep "class" comment for unknown type 2015-08-09 16:33:21 +02:00
222b1c651b Gamedata: Add HLDM entities classes 2015-08-09 16:25:18 +02:00
e0d80639b3 Gamedata: Remove any static members 2015-08-07 20:41:38 +02:00
0baa7d47b6 Gamedata: Add Opfor entites offsets 2015-08-07 20:36:55 +02:00
c80d6e5284 Gamedata: Add TFC entites offsets 2015-08-07 20:20:55 +02:00
ad63658f9e Gamedata: Add DoD entities offsets 2015-08-07 20:13:54 +02:00
ffb9bc92d6 Gamedata: Fix Master and PackageScript to reflect changes 2015-08-07 20:01:11 +02:00
672c519378 Gamedata: Move more CS classes not linked an entity to /others.games 2015-08-07 18:06:32 +02:00
cfd8526961 Gamedata: Move CS hostage-related classes not linked to an entity to /hostages.games 2015-08-07 18:02:54 +02:00
00de99b839 Gamedata: Add missing CS classes associated to an entity 2015-08-07 17:38:18 +02:00
fb1189fd31 Gamedata: Add CS class hierarchy as comment for convenience 2015-08-07 17:35:29 +02:00
7dff2749ec Gamedata: Remove CS classes with no members 2015-08-07 17:30:49 +02:00
4d3e31cf6c Fix an SortADTArray() issue where strings are not properly sorted 2015-08-04 17:08:40 +02:00
5987f389c6 Fix some potiental issues 2015-07-31 15:46:16 +02:00
6d7daf787d Merge pull request #276 from Arkshine/fix/ham-command
Fix "ham hooks" command not displaying all current hooks of a plugin
2015-07-31 15:43:29 +02:00
73e84e9963 Fix "ham hooks" command not displaying all current hooks of a plugin 2015-07-31 14:25:19 +02:00
8c0534a055 Fix typo 2015-07-30 19:54:40 +02:00
5c17b1c767 Merge pull request #275 from xPaw/patch-2
Return an error on Err_OldFile instead of falling through to default case
2015-07-30 16:47:23 +02:00
79bb453bb6 Return an error on Err_OldFile instead of falling through to default case 2015-07-30 15:59:01 +03:00
6b1650ae4f Merge pull request #274 from xPaw/patch-1
Fix resource leak when reading hamdata.ini
2015-07-30 13:23:03 +02:00
378d89af2f Fix resource leak when reading hamdata.ini 2015-07-30 14:02:46 +03:00
8c16331b69 Merge pull request #272 from Arkshine/feature/textparser-data-param
Add a data argument in INI/SMC_ParseFile() to pass through to callbacks (bug 6228)
2015-07-30 10:43:44 +02:00
fc4455d837 Merge pull request #273 from Arkshine/fix/newmenu-typo
Fix typo in newmenus (bug 6394)
2015-07-30 10:43:36 +02:00
5f83f77b2e Fix typo in newmenus 2015-07-30 00:28:18 +02:00
6d6a1c1ab0 Add a data argument in INI/SMC_ParseFile() to pass through to callbacks (bug 6228) 2015-07-29 22:23:13 +02:00
aa5c340029 NS: Fix ns_remove_upgrade() native 2015-07-29 20:49:14 +02:00
a35af02494 NS: Refactor some bits 2015-07-29 20:21:09 +02:00
decde43371 Merge pull request #270 from Arkshine/fix/ml-parser-with-empty_value
Fix a ML parser crash on key with an associated empty value
2015-07-29 09:45:14 +02:00
2d583aa83a Fix a ML parser crash on key with an associated empty value 2015-07-28 15:41:16 +02:00
57037740fd Merge pull request #269 from Arkshine/update-libmaxminddb
Update libmaxminddb to v1.1.0
2015-07-22 12:57:46 +02:00
8efa1ba067 Update libmaxminddb to v1.1.0 2015-07-22 00:21:44 +02:00
2162059352 Merge pull request #268 from Arkshine/fix/handle-name-conflict
Rename Handle class to avoid name collision in mac
2015-07-21 00:23:13 +02:00
6b3b351c9a Rename Handle class to avoid name collision in mac 2015-07-21 00:18:54 +02:00
c6a3290c4f Merge pull request #267 from Arkshine/feature/unregister_event
Add enable/disable_event() native (bug 6360)
2015-07-21 00:00:28 +02:00
df5d935194 Add enable/disable_event() native 2015-07-20 23:06:32 +02:00
075ed7b7b4 Merge pull request #265 from Arkshine/fix/set-log-type
Retrieve log type in MetaAttach to allow log to be written earlier
2015-07-18 10:21:09 +02:00
109b3481a7 Retrieve log type in MetaAttach to allow log to be written earlier 2015-07-18 09:55:13 +02:00
83bc3f518b Fix wrong buffer length 2015-07-17 19:12:02 +02:00
717735311b Fix typo 2015-07-17 17:53:52 +02:00
e3489be0c0 Merge pull request #260 from Arkshine/feature/more-amtl-conversion
More AMTL conversion - 🔥 CString and CVector
2015-07-16 12:24:06 +02:00
9223989a01 Fix consistency 2015-07-16 08:11:19 +02:00
4ed80b88de Merge pull request #255 from Arkshine/feature/cstrike-gamedata
Update cstrike module - 1
2015-07-15 22:21:08 +02:00
662fa61fc7 Cstrike: Fix typos and improve things 2015-07-15 16:40:07 +02:00
dcc2d91b14 Cstrike: cs_get_user_driving - Add the associated constants from HLSDK 2015-07-14 19:44:10 +02:00
86e33d0cb1 Cstrike: cs_set_user_model - Add a param to choose whether modelindex should be updated 2015-07-14 19:44:10 +02:00
5d6f829624 Cstrike: Rename file for consistency 2015-07-14 19:44:09 +02:00
1ed354890b Cstrike: Add CSI_SHIELD for convenience and fix typos 2015-07-14 19:44:08 +02:00
939aad5cb9 Cstrike: cs_set_user_team - Add a param to choose whether TeamInfo message should be sent 2015-07-14 19:44:08 +02:00
8be119aa6a Cstrike: cs_set/reset_user_model/team - Stagger user's info updates across multiple frames (bug 3134) 2015-07-14 19:44:08 +02:00
aedde87f42 Cstrike: cs_set_user_zoom - Use a more event-based approach when mode is 0 2015-07-14 19:44:07 +02:00
63a0910f5b Cstrike: cs_get/set_armoury_type - Add a param to get/set the number of weapons inside an armoury 2015-07-14 19:44:06 +02:00
81f9a23d16 Cstrike: cs_get_user_armor - Make optional armortype param 2015-07-14 19:44:06 +02:00
7842d0160b Cstrike: cs_set_weapon_silen - Add a new value for draw_animation to follow game behavior
- Player's model sequence will be properly played
- Disallow firing while animation is playing
2015-07-14 19:44:06 +02:00
87d740b92a Cstrike: Add CZ support for some hostage natives 2015-07-14 19:44:05 +02:00
d9a9b7a74e Cstrike: Add support for monster_scientist entity (alias of hostage_entity) 2015-07-14 19:44:05 +02:00
27d6a0cc08 Cstrike: cs_get_hostage_id - Fix error check, an hostage can't be a player 2015-07-14 19:44:04 +02:00
b82588f081 Cstrike: cs_set_user_deaths - Add a param to choose whether scoreboard should be updated 2015-07-14 19:44:04 +02:00
71c6ac8c2e Cstrike: cs_set_no_knives - pfnCreateNamedEntity is now hooked only when needed 2015-07-14 19:44:03 +02:00
2de1f9a33b Cstrike: Do some more cleanup 2015-07-14 19:44:03 +02:00
f13461caee Cstrike: Cache GET_USER_MSG_ID calls 2015-07-14 19:44:02 +02:00
84c320d539 Cstrike: Do some cleanup for the sake of consistency and readability 2015-07-14 19:44:02 +02:00
864e0b88eb Cstrike: Move all hardcoded datas to its own gamedata files 2015-07-14 19:44:01 +02:00
6555ecf6b8 Merge pull request #263 from Sylvert0/master
Fix CS_OnBuyAttempt
2015-07-14 15:55:07 +02:00
f3df286985 Fix CS_OnBuyAttempt
If i dont have CS_OnBuy on my plugin, CS_OnBuyAttempt doen't work
2015-07-14 10:40:16 -03:00
b8dd9d19dd Merge pull request #261 from Arkshine/feature/datapack-memory
Improve DataPack memory allocation
2015-07-14 00:40:15 +02:00
fab9dbf294 Merge pull request #262 from Arkshine/remove-makefile
Remove MakeFile
2015-07-14 00:40:02 +02:00
c0b9b91a06 Remove MakeFile 2015-07-14 00:13:24 +02:00
f7c4ed050f Improve DataPack memory allocation 2015-07-13 23:49:51 +02:00
c775cfca73 More AMTL conversion - 🔥 CString and CVector 2015-07-13 23:37:20 +02:00
b145b4c651 Merge pull request #259 from Nextra/engine-fix
Engine: Fix bcompat and consistency for CHECK_ENTITY
2015-07-13 15:45:10 +02:00
a68df8de7f Engine: Fix bcompat and consistency for CHECK_ENTITY 2015-07-13 15:38:37 +02:00
de71cf469c Merge pull request #258 from Ni3znajomy/fix-mistake-gconfigparser
Fix mistake
2015-07-11 20:40:09 +02:00
cc12f0a0a4 Fix mistake 2015-07-11 20:18:43 +02:00
3132e20fad Merge pull request #257 from Arkshine/feature/remove-duplicated-handle-code
Remove duplicated code of native handles
2015-07-11 19:58:02 +02:00
dbc9c7e0da Remove duplicated code of native handles 2015-07-11 18:14:16 +02:00
883c852897 Synchronize AMTL submodule 2015-07-11 14:57:06 +02:00
989034bd41 Attempt to fix mac build 2015-07-11 13:33:30 +02:00
139a2a082c Merge pull request #254 from Arkshine/feature/gameconfig
Implement a game config parser and expose functionnalities to the module/plugin API
2015-07-11 13:19:09 +02:00
f38c726faf Gameconfig: Add game configs natives 2015-07-11 13:16:45 +02:00
b8cc1ac79d Merge pull request #256 from DmitriyS/master
Plugins: Close Array/Trie handles on map end
2015-07-11 00:12:51 +02:00
e98ab37806 fix memory leaks 2015-07-11 00:39:34 +03:00
846238fe99 Merge pull request #250 from Nextra/enginew
Engine Update
2015-07-02 18:43:35 +02:00
14513e6f70 Gameconfig: Export game config manager to AMXX API 2015-06-29 13:38:34 +02:00
4b2ba10300 Gameconfig: Add game configs parser 2015-06-29 13:38:34 +02:00
f46fc6c4e8 Merge pull request #253 from Arkshine/fix/set_amxstring_utf8-inconsistency
Fix set_amxstring_utf8 insconsistency
2015-06-29 13:23:02 +02:00
8633337bbd Fix set_amxstring_utf8 insconsistency 2015-06-29 12:42:57 +02:00
f68a53e46a Fix mac compilation 2015-06-27 16:26:39 +02:00
30a97db735 Merge pull request #249 from Arkshine/fix/override-error-clang56
Fix a clang-3.6 compilation issue
2015-06-27 15:46:46 +02:00
28448c0fe1 Merge pull request #251 from WPMGPRoSToTeMa/authconsoleprintfixes
Replace console_print by engclient_print to support connecting players (bug 6372)
2015-06-15 20:03:23 +02:00
391991bfce https://bugs.alliedmods.net/show_bug.cgi?id=6372 bugfix 2015-06-15 18:54:29 +03:00
7059f5b3b9 Engine: Detour LightStyle to catch all calls, restores set_lights() functionality 2015-06-11 20:49:00 +02:00
3792e7dc20 Merge pull request #248 from Arkshine/fix/update-compiler3
Update compiler - 3
2015-06-01 21:45:04 +02:00
934e0208bf Fix a clang-3.6 compilation issue 2015-06-01 20:19:10 +02:00
26d0f3f2de Merge pull request #247 from ShootingKing-AM/master
Correcting years in MSVS project solutions.
2015-05-19 17:31:58 +02:00
4a58365b2c Correcting SolutionFileFormat version as well 2015-05-19 18:31:19 +05:30
41dfdc7f59 Compiler: Prevent declaring arrays that the compiler is too buggy to handle
AM Bug 7977: https://bugs.alliedmods.net/show_bug.cgi?id=4977
2015-05-19 00:01:29 +02:00
f710188c86 Compiler: Ability to directly reference another address in a default argument (for arrays only)
SM patch: d8d13f1920
2015-05-19 00:01:29 +02:00
ad23638913 Correcting years in MSVS project solutions. 2015-05-18 21:54:06 +05:30
b364506cbc Merge pull request #241 from luxxxoor/patch-2
Update cmdmenu.sma
2015-05-17 20:10:22 +02:00
b77c8e253b Update cmdmenu.sma
Changed format with formatex where needed, removed many hardcoded contents in plugin and added semicolons.
2015-05-17 19:50:42 +03:00
ffa12bfe54 Merge pull request #244 from Arkshine/fix/fakemeta-changelevel
Fix EngFunc_ChangeLevel
2015-05-15 21:29:25 +02:00
e305009e9a Fix EngFunc_ChangeLevel 2015-05-15 19:14:34 +02:00
af7a6e3c87 Merge pull request #243 from Arkshine/fix/namehashset-add-return
Correct NameHashSet::add() return type
2015-05-15 13:27:54 +02:00
6620aa97a8 Correct NameHashSet::add() return type 2015-05-15 10:45:08 +02:00
8b6d85eb78 Engine: Add a bunch of missing CHECK_ENTITY() and CHECK_ENTITY_SIMPLE() 2015-05-11 16:15:44 +02:00
dc73473394 Engine: Fix CHECK_ENTITY() logic error (0 is not a player) 2015-05-11 16:15:44 +02:00
7bf47f90d9 Engine: Use UTF-8 functions where KeyValueData is touched 2015-05-11 16:15:43 +02:00
c24fbda302 Engine: Add error path to DispatchKeyValue() based on g_inKeyValue
This was unsafe as g_pkvd is pointed to a stack variable that is only valid while inside of pfn_keyvalue()
2015-05-11 16:15:43 +02:00
702f784e44 Engine: Fix get_info_keybuffer() not being able to retrieve local keybuffer 2015-05-11 16:15:43 +02:00
679714c8be Engine: Add error path for remove_entity() and unsafe entity ids 2015-05-11 16:15:43 +02:00
ff0ca9ba67 Engine: Remove inconsistent error path from entity_get_int() 2015-05-11 16:15:42 +02:00
ee0bcc39f1 Engine: Clarify difference between the engine module trace handle and the "real" global trace 2015-05-11 16:15:42 +02:00
ebdd015aae Restore traceresult() functionality by writing to g_tr in trace functions 2015-05-11 16:15:42 +02:00
3c1022af99 Engine: Add a destination parameter to trace_hull() to make it more useful 2015-05-11 16:15:42 +02:00
add4867d21 Engine: Add safe get_global_edict2() and entity_get_edict2() 2015-05-10 23:56:06 +02:00
d69fddf8b4 Engine/Core: Move precache_event() to core 2015-05-10 23:45:01 +02:00
218fb9c794 Engine: Add unregister_[touch|think|impulse]() 2015-05-10 23:40:22 +02:00
c531ad756d Engine: Dynamically hook StartFrame for set_lights() 2015-05-10 23:21:12 +02:00
c5f6e26802 Merge pull request #239 from Nextra/inc-doc3
Update include documentation #3 (mostly engine.inc)
2015-05-10 17:12:50 +02:00
fbcbbd8421 hlsdk_const: Add MoveToOrigin move type constants 2015-05-10 14:37:40 +02:00
00f9b62ffb cstrike: Add create_entity() note from engine, rewording 2015-05-10 14:37:39 +02:00
59d8d2807f engine_const: Add sections and comments 2015-05-10 14:37:36 +02:00
d9f792b712 engine: Add documentation, group similar natives 2015-05-10 14:37:16 +02:00
42d80a666a Merge pull request #242 from Nextra/nullvec
Add NULL_VECTOR and expose null functions to AMXX API
2015-05-06 14:34:01 +02:00
abf7f1a41b Expose get_amxstring_null and get_amxvector_null to modules 2015-05-06 12:01:15 +02:00
fdb180e062 Add NULL_VECTOR 2015-05-06 11:28:54 +02:00
39cc240a4e Merge pull request #240 from Nextra/kvd
Improve handling of KeyValueData
2015-05-05 12:01:29 +02:00
79189c86ab Add basic kvd doc to fakemeta.inc and fix ham_const.inc lies 2015-05-05 11:16:26 +02:00
9fd0f1c231 Sync AMTL submodule 2015-04-22 00:55:23 +02:00
8172519389 Improve handling of KeyValueData in FM and make it compatible with Ham
- KVD_Wrapper compatibility with Ham by making |&kvdw == &kvdw.kvd|
- Replaces g_kvd_hook with a generic g_kvd_ext to support raw KVD from Ham
- Adds create_kvd() and free_kvd() so plugins have something to feed Ham with
2015-04-21 00:18:21 +02:00
cc11191e57 Merge pull request #236 from Arkshine/fix/missing-sqlite-charset
Fix missing SQL_SetCharset native in SQLite
2015-04-20 22:47:16 +02:00
81e091e005 Merge pull request #237 from Arkshine/fix/ke-string-null
Fix potential crash using ke::AString and a valid given null string (bug 6351)
2015-04-19 21:05:50 +02:00
08d684a90f Merge pull request #238 from Arkshine/feature/container-build
Use the new Travis-CI Container environment
2015-04-19 21:05:42 +02:00
54223e9a99 Use the new Travis-CI Container environment 2015-04-19 20:10:04 +02:00
871e14178b Fix a tag typo in datapack.inc 2015-04-19 19:58:57 +02:00
1c1b949648 Fix potential crash using ke::AString and given null string 2015-04-19 19:52:53 +02:00
b88841c6ef Fix missing SQL_SetCharset native in SQLite 2015-04-12 21:08:03 +02:00
0bfc04bb14 Merge pull request #235 from Arkshine/fix/file-fgets
Fix fgets native not setting always the plugin buffer
2015-04-12 20:52:51 +02:00
10c0204b16 Fix fgets native not setting the plugin buffer on null result 2015-04-12 20:20:21 +02:00
a35bc43cab datapack.inc: Fix copy-pasted error description 2015-04-06 13:33:55 +02:00
044e6b22b2 Merge pull request #233 from Ni3znajomy/update-copyright-year
Update copyright year
2015-03-30 13:44:55 +02:00
0b2c33bcd2 Merge pull request #231 from Nextra/datapack-update
Datapack update
2015-03-30 13:43:50 +02:00
081b683e03 Update datapack test plugin 2015-03-30 04:14:55 +02:00
2166c32047 Make datapack natives error consistently, stop using IsPackReadable 2015-03-30 04:14:55 +02:00
1d57677426 Add CanRead[Cell|Float|String|Memory] to CDataPack 2015-03-30 04:14:54 +02:00
9abe6cd8f6 Add IsPackEnded native (IsPackReadable replacement) 2015-03-30 04:14:54 +02:00
9d4c02f7ca Nuke IsPackReadable
This native exposes/requires knowledge about implementation details of the
internal DataPack structure. Plugins can not properly deal with this, and
abusing this functionality results in a chance of future breakage.
2015-03-30 03:48:52 +02:00
92c2c84617 Update copyright year 2015-03-29 20:01:25 +02:00
d4bfebec22 Merge pull request #232 from Arkshine/fix/tfc-crash-medic
Fix crash in TFCX module when Infection weapon is used (bug 6333)
2015-03-28 17:29:47 +01:00
db9421d0be Fix crash in TFCX module when Infection weapon is used 2015-03-28 16:47:07 +01:00
a59b72f96a Merge pull request #229 from Arkshine/feature/trans-format-and-native
Add %l format specifier and SetTranslationTarget() native (bug 6331)
2015-03-26 22:54:11 +01:00
8831166705 Add %l format specifier and SetTranslationTarget() native 2015-03-26 22:42:55 +01:00
bebe9f8e2e Merge pull request #230 from Ni3znajomy/fix-checking-cvar-bounds
Fix checking cvar's bounds
2015-03-26 21:49:33 +01:00
69d41b65d4 Merge pull request #227 from Freeman-AM/plmenu-update
Plmenu: improve readability, more compliance to amxmodx style, small improvements
2015-03-26 21:32:39 +01:00
4d3c49f93b Fix checking cvar's bounds 2015-03-26 21:31:16 +01:00
f44ec00133 Plmenu: rollback macros 2015-03-26 21:17:46 +01:00
b4b86113e4 Merge pull request #217 from Arkshine/feature/valve-fs-support
Add support for Valve FS to natives that use file handles
2015-03-26 11:45:33 +01:00
52c73126e1 VFS: Fix various things
- The "ALL" fake pathID is replaced by what does SM, having a public var NULL_STRING which will acts as NULL when needed.
  To make compiler accepting public array, this patch was needed: https://hg.alliedmods.net/sourcemod-central/rev/b12f329def09
- The offset thing in read_dir: considering that's something very specific to this native and that implementation in CDirectory doesn't make sense because of the offset compatibility for windows, all code is now in the native.
2015-03-25 13:50:07 +01:00
4d97a24dd8 Merge pull request #228 from Arkshine/fix/crash-ham
Fix crash under linux in Hamsandwich module (bug 6323)
2015-03-24 02:40:27 +01:00
b6febae2fa Fix crash under linux in Hamsandwich module
Fix crash under linux in Hamsandwich module
2015-03-24 02:18:11 +01:00
8f6b8588c1 VFS: Do not traumatize Nextra 2015-03-23 18:30:22 +01:00
ba11085ddc VFS: Add constant in pawn include to define max path 2015-03-22 11:14:13 +01:00
71ab8d560e VFS: Add more sane FileRead/Write* natives to read/write a single value 2015-03-22 11:14:12 +01:00
a580c8c5e5 VFS: Add SetFilePermissions native 2015-03-22 11:13:36 +01:00
0eeb5942a1 VFS: Reflect changes in natives and documentation 2015-03-22 11:12:21 +01:00
6434c4db77 VFS: Update AMbuild and VS project files 2015-03-22 11:08:22 +01:00
4f4e322ad4 VFS: Add helpers to wrap default and valve system file 2015-03-22 11:00:33 +01:00
553963295f VFS: Add Valve file system interface 2015-03-22 11:00:33 +01:00
d69ddc7234 VFS: Add LibrarySys class helper 2015-03-22 11:00:32 +01:00
c156c220c4 Replace some arrays by bitfield macros 2015-03-21 16:14:14 +01:00
a182ca62c8 Merge pull request #226 from Arkshine/fix/compiler
Fix compiler output
2015-03-21 15:38:25 +01:00
d397619939 Fix compiler output 2015-03-21 15:29:55 +01:00
5413c59bc7 plmenu: improve readability, more compliance to amxmodx style 2015-03-21 13:54:39 +01:00
4fbf4ee03d Merge datapack updates from SoureMod 2015-03-15 22:38:49 +01:00
32e1908859 Add submodule support in checkout-deps.sh 2015-03-14 13:23:47 +01:00
dd6ef4811c Update compiler VS projects to reflect changes from #221 2015-03-14 12:53:43 +01:00
3d5a0c5a29 Normalize more line endings 2015-03-14 12:45:33 +01:00
dbe79790dc Merge pull request #225 from xPaw/modules-folder
Move dlls/ to modules/
2015-03-13 14:38:42 +01:00
fddebce313 Update modules paths 2015-03-13 15:23:05 +02:00
e09f434ed8 Move dlls/ to modules/ 2015-03-13 15:18:47 +02:00
54c978addb Merge pull request #224 from Arkshine/feature/third-party-libs-part2
Move SQLite and GeoIP2 libs to /third_party
2015-03-13 11:27:32 +01:00
2204a83ec0 Update AMBuilder, VS and MakeFile files 2015-03-13 11:13:42 +01:00
aa629a76e7 Move SQLite and GeoIP2 libs to /third_party 2015-03-13 11:12:53 +01:00
f83e7f0071 Merge pull request #223 from 9iky6/patch-14
Add missing SVC Messages
2015-03-12 19:57:52 +01:00
463de74865 Update message_const.inc 2015-03-12 22:50:49 +05:00
c2a21bcaee Add_SVC_Messages
add svc messages id to use hardcode (dont relize, only for alliedmodders dev team view)
2015-03-12 20:54:03 +05:00
24480a3782 Merge pull request #222 from xPaw/spcomp2-compat
Make include files a little more spcomp2 compatible
2015-03-11 14:48:59 +01:00
0ccb99137a Make spcomp2 cry less 2015-03-11 15:19:27 +02:00
a25090de4b Merge pull request #221 from xPaw/burn-scpack
Remove scpack
2015-03-10 19:52:29 +01:00
8b06e5bdcd Remove strexpand 2015-03-10 20:37:57 +02:00
a134a75572 Remove scpack 2015-03-10 20:03:57 +02:00
446029e7cf Merge pull request #220 from Arkshine/feature/third-party-libs
Move third party libraries in own directory and fix/cleanup VS projects files
2015-03-10 18:25:40 +01:00
48d6a3354a Normalize all the line endings 2015-03-10 16:51:45 +01:00
afc3cac54d Merge pull request #219 from xPaw/gitattributes
Add gitattributes
2015-03-10 16:50:10 +01:00
acf910b64b Fix and clean up VS projects files
+ removed unused variable :P
2015-03-10 16:20:21 +01:00
aaafe0f3f2 Compile Hashing lib as static and link to AMXX 2015-03-10 12:15:46 +01:00
c03bb3693e Move Zlib and Hashing libs to third_party directory 2015-03-10 12:08:26 +01:00
910c921d5d Add gitattributes 2015-03-10 11:11:49 +02:00
014120e73e Merge pull request #215 from xPaw/no-version-check
Remove version checks from all include files
2015-03-10 01:02:05 +01:00
73cf46ff45 Merge pull request #216 from luxxxoor/patch-1
Some missing charsmax and more readability.
2015-03-10 00:27:35 +01:00
f49c9c87d4 Merge pull request #195 from Arkshine/feature/zlib-static-lib
Unifiy zlib linkage by compiling it as static library and linking it to concerned projects
2015-03-10 00:25:47 +01:00
9542fce9c5 Zlib: Update AMBuilder 2015-03-10 00:12:56 +01:00
5f6756cb4d Zlib: Remove unrelated changes 2015-03-10 00:06:30 +01:00
e60a2e9fcc Zlib: Fix compilation (implicit-function-declaration error) 2015-03-10 00:06:30 +01:00
a565e4a7b1 Zlib: Update library to 1.2.8 2015-03-10 00:06:29 +01:00
265e15116b Zlib: Adjust VS project files 2015-03-10 00:06:29 +01:00
85b7c26bb0 Zlib: Use the generated static library with MySQL module 2015-03-09 23:59:57 +01:00
9bbeb1f578 Zlib: Use the generated static library with AMXXPC 2015-03-09 23:59:12 +01:00
47cd091879 Zlib: Use the generated static library with AMXX 2015-03-09 23:59:11 +01:00
6ac5211062 Zlib: Compile as static library 2015-03-09 23:59:11 +01:00
25b1fa6fe0 Zlib: Add latest library version in /public directory 2015-03-09 23:59:10 +01:00
dcae6a8a20 Merge pull request #218 from Arkshine/feature/amtl-upstream
Use upstream AMTL as a submodule
2015-03-09 23:25:15 +01:00
1ebd9044ca Fix AppVeyor 2015-03-09 23:12:27 +01:00
181cbae74c Use upstream AMTL as a submodule 2015-03-09 22:53:58 +01:00
205a0eb2da admincmd.sma: Missing charsmax and more readability.
Fix charsmax and more readability
2015-03-09 23:35:04 +02:00
22c3d62dec Merge pull request #208 from Nextra/inc-doc2
Update include documentation #2
2015-03-09 19:45:47 +01:00
a82f521633 amxmodx.inc: missing commas, typo errors... 2015-03-09 19:41:21 +01:00
bc9710e8f2 inc-doc2 nits/finishing touches 2015-03-09 19:41:21 +01:00
902cecb0c3 amxconst: Minor improvements on client_print natives 2015-03-09 19:41:20 +01:00
950f3f97c1 datapack: Tabs->spaces, consistency, nuke IsPackReadable 2015-03-09 19:41:19 +01:00
828d9971a4 cvars: Style touchups, add missing stuff, update notes about named access 2015-03-09 19:41:18 +01:00
50fea6be75 cstrike/csx/csstats: Added documentation, consistency updates, typo fixes 2015-03-09 19:41:18 +01:00
a1c5c20d7e amxmodx: Consistency updates, typo fixes, missing return/error added 2015-03-09 19:41:17 +01:00
ae86152282 cellarray/celltrie/cellstack: Documentation fixes and consistency updates 2015-03-09 19:41:16 +01:00
9eb0eaf6a6 core: Add documentation 2015-03-09 19:41:15 +01:00
5f278eee7b amxmisc: Documentation updates and additions 2015-03-09 19:41:15 +01:00
362a7e61f9 Merge pull request #214 from 9iky6/patch-13
Update menufront.sma
2015-03-09 14:47:08 +01:00
379d9121b4 Remove version checks from all include files 2015-02-25 00:56:17 +02:00
09ed8eb2b1 Update menufront.sma 2015-02-23 02:21:20 +05:00
45b63c4394 Update menufront.sma
Just a minor update the plugin and change work in lang-key: you can now add the file through the menu items with the lang-key.
2015-02-20 23:46:26 +05:00
c4497ff17d Merge pull request #211 from Arkshine/fix/cvar-mapchange
Fix issue where at mapchange a cvar current value is overwritten by defined bounds where it should not
2015-02-20 15:50:49 +01:00
62413f6277 Merge pull request #213 from ClaudiuHKS/CLang_mTime
Replace CLang file hashing with .st_mtime
2015-02-19 21:11:10 +01:00
530d0bf570 Replace CLang file hashing with .st_mtime
Replace CLang file hashing with .st_mtime for performance.
Also, fix a problem in CLangMngr::MergeDefinitionFile.
2015-02-19 21:28:45 +02:00
80b01d3505 Fix issue where at mapchange a cvar current value is overwritten by defined bounds where it should not 2015-02-19 16:05:49 +01:00
2b9e9c79b9 Merge pull request #207 from ClaudiuHKS/MySQLThreadingFix
Fix SQL Modules Threading
2015-02-18 19:34:18 +01:00
3fc438ffd1 Fix SQL modules threading system. 2015-02-18 10:32:45 +02:00
3b16c6be92 Merge pull request #210 from Nextra/destroy-invalid
Fix ArrayDestroy/DestroyStack erroring on invalid handle
2015-02-18 00:44:26 +01:00
78f577686a Fix ArrayDestroy/DestroyStack erroring on null handle 2015-02-17 23:24:17 +01:00
af6c6850ec Merge pull request #206 from ClaudiuHKS/master
Add new hashers and new natives
2015-02-17 14:34:38 +01:00
38db4d3ae0 Updating hahsers INC files and Acknowledgements
INC files have been updated changing the information, adding new
details.
Acknowledgements file includes now Hashing Librarying license.
Spacing consistency has been fixed in CPP Hashing files.
Testsuite plug-in has been rewritten, now using Server Commands.
2015-02-16 16:30:45 +02:00
c071f53f2c Add new hashers and new natives
Replace the only hasher called MD5 with the ones listed below.

(+) CRC32, MD5, SHA1, SHA256, SHA3 224 BIT, SHA3 256 BIT, SHA3 384 BIT,
SHA3 512 BIT, Keccak 224 BIT, Keccak 256 BIT, Keccak 384 BIT and Keccak
512 BIT.

Add the natives listed below.

(+) hash_string(const string[], hashType:type, output[], const
outputSize)
(+) hash_file(const fileName, hashType:type, output[], const outputSize)
(+) is_arkshine_a_doctor() :  Hidden native, but a sign of recompense
for him being very active since 1.8.3 version of AMX Mod X
(+) get_system_endianness() :  Checks if the system is currently Big
Endian or Little Endian.

Add the following Enum.

(+) hashType {}
(+) sysEndianness {}

Deprecate the following natives.

(-) amx_md5()
(-) amx_md5_file()

It has been tested on Windows and Linux. The sanity checks seems to be
properly working, so no worries about them.

These are useful if people are using Sockets, cURLs or MySQLs in order
to compare hashes of different files On-line for further investigation.
You are not able to check if the files are older or newer, but you can
see if the content is different (Hash Checksum mismatch).

I'm glad I did this. Thanks to
2015-02-16 14:39:45 +02:00
5a7752a22e Merge pull request #205 from ClaudiuHKS/patch-1
Fix missing "queuetime" FP_ param in SQL_ThreadQuery (sqlite) callback
2015-02-13 10:38:41 +01:00
ddb1af89e9 Added new FP_CELL to SQLite Forward
Added new FP_CELL to SQLite Forward.
2015-02-13 09:08:27 +02:00
7452317c10 Merge pull request #203 from Arkshine/fix/crash-on-shutdown
Fix crash by freeing memory the right way
2015-02-12 14:46:53 +01:00
120e5b94f9 Fix crash by freeing memory the right way 2015-02-12 14:37:46 +01:00
4ec11496e6 Fix missing new lines in "amxx version" command 2015-02-12 10:46:20 +01:00
c556bf9f68 Merge pull request #202 from Arkshine/fix/crash-null-detour
Fix crash when cvar hook detour is not created
2015-02-11 00:19:08 +01:00
fb28b2d416 Fix missing parenthesis. 2015-02-11 00:18:22 +01:00
e99a1c8b09 Fix crash when cvar hook detour is not created 2015-02-10 23:19:03 +01:00
0b80c4367d Merge pull request #201 from Arkshine/cleanup-geoip-code
Cleanup some code from previous commits
2015-02-08 11:24:37 +01:00
e95d5ed43c Cleanup some code from previous commits 2015-02-08 11:23:54 +01:00
553663c952 Merge pull request #200 from ClaudiuHKS/master
Set length to 0 on failed lookup in lookupString()
2015-02-08 11:01:43 +01:00
780ce669d0 >> RENAMED maxminddb.cpp (FILTERS)
RENAMED maxminddb.cpp TO maxminddb.c (FILTERS)
2015-02-07 18:42:01 -08:00
47b5ff9a93 >> FIXED lookupString() LENGTH ISSUE
In (const char *) lookupString() :
For (const char *) NULL result :

Length must be ZERO, if defined.
2015-02-07 18:40:52 -08:00
2bc6ced671 >> RENAMED maxminddb.cpp (MAKEFILE)
RENAMED maxminddb.cpp TO maxminddb.c (MAKEFILE)
2015-02-07 18:39:21 -08:00
f4738600b4 Merge pull request #1 from ClaudiuHKS/ClaudiuHKS-patch-1
>> RENAMED maxminddb.cpp (VCXPROJ)
2015-02-07 18:37:00 -08:00
83c0789246 >> RENAMED maxminddb.cpp (VCXPROJ)
>> RENAMED maxminddb.cpp TO maxminddb.c (VCXPROJ)
2015-02-07 18:34:46 -08:00
0424aa7c19 Merge pull request #148 from Arkshine/update-sqllite
Update sqlite
2015-02-07 18:23:03 +01:00
3e6d806ce2 Merge pull request #198 from Arkshine/fix/geoip_country-return-on-fail-lookup
Fix various compatibility issue with geoip module
2015-02-07 17:51:49 +01:00
77762b9c2c Fix typo in documentation 2015-02-07 17:51:30 +01:00
34de3964e6 More cleanup 2015-02-07 16:33:48 +01:00
5241fdf673 Add geoip_country_ex, mark geoip_country as deprecated, and do some cleanup 2015-02-07 16:26:40 +01:00
51adb7385c Fix a compatibility issue with geoip_country native 2015-02-06 23:25:26 +01:00
21edabf07f Merge pull request #197 from Arkshine/fix/osx-compilation-free
Fix OSX compilation
2015-02-06 22:10:43 +01:00
7d6705345d Fix OSX compilation 2015-02-06 22:08:32 +01:00
2dc1982e11 Merge pull request #196 from Arkshine/fix/floorf-dependency-linux
Fix missing libm linkage under linux (math functions like floor, etc.)
2015-02-06 21:51:42 +01:00
041113dbc4 Merge pull request #194 from Freeman-AM/amxmisc-smallupdate
amxmisc.inc: Missing charsmax, more readability, more compliance to amxmodx style.
2015-02-06 21:51:26 +01:00
c93995a827 Fix missing libm linkage (math functions like floor, etc.) 2015-02-06 21:37:14 +01:00
35eeb6036d missing alignment 2015-02-06 01:36:32 +01:00
9e5810e615 amxmisc.inc: Missing charsmax, more readability, more compliance to amxmodx style 2015-02-06 01:32:33 +01:00
a51904b13f Merge pull request #192 from Arkshine/fix/max_players
Change MAX_PLAYERS value to 32
2015-02-03 10:58:39 +01:00
c4ec65bd5a Merge pull request #193 from Arkshine/fix/cstrike-crash-on-start
Cstrike: Fix crash at server start
2015-02-02 12:50:56 +01:00
604f227751 Sqlite: Update broken VS project files 2015-02-02 11:22:45 +01:00
61063a54ef Sqlite: Update library to 3.8.8.2 2015-02-02 11:06:07 +01:00
162171618c Sqlite: Update library to 3.8.7.
Sqlite: Update project files.
2015-02-02 11:06:05 +01:00
14f06ca1bb MAX_PLAYERS: Fix moar 2015-02-01 21:45:16 +01:00
c47896232c CStrike: Fix crash 2015-02-01 20:43:06 +01:00
91c4b5d708 MAX_¨PLAYERS: Fix more. 2015-02-01 20:34:35 +01:00
e441908230 MAX_PLAYERS: Fix plugins 2015-02-01 19:25:36 +01:00
1b350b627b MAX_PLAYERS: Change value in includes 2015-02-01 18:40:20 +01:00
dd38ee103b Merge pull request #189 from Arkshine/feature/add-cs_create_entity
Add cs_create_entity and cs_find_ent_by_class natives
2015-01-31 16:39:43 +01:00
53829a1270 Merge pull request #191 from Arkshine/fix/compiler-tagof
Fix tagof operator used as a default value for function arguments
2015-01-31 16:39:33 +01:00
14b072dd47 Merge pull request #190 from Freeman-AM/small-plmenu-update
Plmenu: small update: formatex, semicolon, missing things, remove useless TABs
2015-01-31 16:39:18 +01:00
30ee4df0fa Fix typo 2015-01-31 15:38:35 +01:00
4ceb767022 Add error messages and fix documentation 2015-01-31 14:45:37 +01:00
b0543a111d Fix tagof operator used as a default value for function arguments 2015-01-30 23:34:04 +01:00
7a3ee17093 Remove #pragma semicolon 1
It could disturb non initiated people who want to modify base plugins.
2015-01-30 22:57:31 +01:00
e0426f10b2 Fix typo 2015-01-30 16:01:26 +01:00
6319331a33 Merge pull request #188 from Arkshine/feature/mysql-rw-and-default-timeout
Establish a default timeout for MySQL connectivity
2015-01-30 15:56:40 +01:00
c87d46ad5b Add cs_find_ent_by_class and fix documentation 2015-01-30 15:53:25 +01:00
7d084ee0bf Merge pull request #185 from Arkshine/feature/hooking-cvars
Introduce new features for cvars
2015-01-30 14:20:11 +01:00
cfc92ca3db Plmenu: small update: formatex, semicolon, missing things, remove useless TABs 2015-01-30 00:57:45 +01:00
1488b9747f Cvars: De-frenchify by Nextra 2015-01-29 21:44:53 +01:00
2446ff49f2 Add cs_create_entity native 2015-01-29 20:43:01 +01:00
98d4031b5c Add a new line at the end to not traumatize Nextra 2015-01-29 17:55:24 +01:00
7e1911b13b Merge pull request #187 from Arkshine/fix/nvault-formatting-issue
Fix potential formatting issue with nvault_[p]set
2015-01-29 17:26:49 +01:00
1f304d55c4 Merge pull request #186 from Freeman-AM/product-version
Wrong product version for amxmodx-installer.nsi
2015-01-29 17:20:51 +01:00
9f93ff5168 Fix potential formatting issue with nvault_[p]set 2015-01-29 16:52:47 +01:00
839bb086b1 Wrong product version for amxmodx-installer.nsi 2015-01-29 14:58:07 +01:00
a5b5c7e9cd Cvars: Fix code to avoid Nextra be confused 2015-01-29 14:01:58 +01:00
f8ec7f94a4 Mysql: Establish a default timeout 2015-01-29 13:50:13 +01:00
f8baef15ca Cvars: Adjust more things
- Moved some functions in CvarManager
- Fixed detour enabled all the time
- Fixed bounds not properly handled
- Refreshed data of regisetered cvars at map change
2015-01-28 23:51:43 +01:00
187b187ef2 Cvars: To not traumatize Nextra 2015-01-28 00:58:07 +01:00
ac50f3ff34 Cvars: Check lower/upper bounds in create_cvar as well 2015-01-28 00:47:01 +01:00
e4a7e67783 Cvars: Adjust few things
- Hook is not as post, because allowing blocking change is not really that useful and this makes a context more simpler.
- Setting a min bound > max bound and reversely throw an error
- set_pcvar_bounds set cvar value on new min/max bound.
- Remove error "A cvar can't be binded with several variables", it's okay to no error such situation.
2015-01-28 00:26:24 +01:00
1a5e1928ec Cvars: Fix field orders and linux compilation 2015-01-27 16:27:26 +01:00
d75b14d4af Cvars: Extend "amxx cvars" command output 2015-01-27 15:07:17 +01:00
0bed55701f Merge pull request #184 from Arkshine/fix/rename-change_level
Rename change_level to engine_changelevel
2015-01-27 00:21:50 +01:00
356a981164 Cvars: Add get/set_pcvar_bool natives 2015-01-26 14:26:48 +01:00
8a241ed0fd Cvars: Add new description param in get_plugins_cvar 2015-01-25 11:38:01 +01:00
cb0b9da51f Cvars: Add bind_pcvar_num/float/string 2015-01-24 21:31:00 +01:00
8ebb7be36d Cvars: Add get|set_pcvar_bounds natives 2015-01-24 15:04:49 +01:00
a05d0df50e Cvars: Add create_cvar native with more options (description, bounds) 2015-01-23 19:05:34 +01:00
15ad1d2247 Cvars: Moving cvars stuffs in its own files
cvars.cpp renamed to CvarManager.cpp
all cvars natives moved to a new cvars.cpp file
Pawn include is updated as wall.
2015-01-23 19:05:34 +01:00
768fa2c3bc Cvars: Add hook_cvar_change, [enable|disable]_cvar_hook natives 2015-01-23 19:05:33 +01:00
0db5963641 Cvars: Remove global forward 2015-01-23 19:05:33 +01:00
cdc7d550eb Cvars: Rearrange a bit some code
Changed class CCVar -> struct CvarInfo
Added CvarManager class and moved some code there
Code of registering a cvar is rewritten
Cvars datas are stored in a hashtable for fast lookup
For natives compatibility, an inline list is kept (though CList -> ke::InlineList)
Replace some CVAR_GET/SEt_ by FindVar
2015-01-23 19:05:32 +01:00
f973f5beb7 Cvars: Convert CString to ke::AString in CCVar class 2015-01-23 19:05:32 +01:00
6619176a76 Cvars: Move CCVar class to cvars.h 2015-01-23 19:05:31 +01:00
faeaf9259e Cvars: Add OnCvarChanged global forward
I really tried to use "cvar_changed" as name, but it bothered me so much to look that weird I could not keep it.
2015-01-23 19:05:31 +01:00
34d91789c4 Cvars: Hook Cvar_DirectSet from engine library 2015-01-23 19:05:30 +01:00
cdfd789f56 Rename change_level to engine_changelevel 2015-01-23 16:55:16 +01:00
5ca0e5617d Merge pull request #173 from Arkshine/feature/compiler-concatenation
Add string literal concatenation and stringizing operator
2015-01-22 20:00:32 +01:00
c197b58734 Merge pull request #183 from Arkshine/fix/cstrike-remove-stringtolower
Remove use of UTIL_StringToLowwer
2015-01-20 12:04:06 +01:00
8072f90536 Remove use of UTIL_StringToLowwer 2015-01-20 11:53:46 +01:00
252f1919c2 Merge pull request #182 from Arkshine/fix/mysql-crash-amtl
Fix a mysql crash after CString -> ke::AString conversion
2015-01-18 19:27:35 +01:00
2e64e9fd52 Merge pull request #181 from Arkshine/feature/add-new-fcvar
Add FCVAR_NOEXTRAWHITEPACE in amxconst.inc
2015-01-18 18:54:39 +01:00
c3e0753455 Fix a mysql crash after CString -> ke::AString conversion 2015-01-18 18:13:39 +01:00
03e426fc28 Add FCVAR_NOEXTRAWHITEPACE in amxconst.inc 2015-01-16 23:21:01 +01:00
7f9d677f89 Merge pull request #178 from Arkshine/feature/update-libmaxminddb-1.0.4
Geoip: Update libmaxminddb to 1.0.4
2015-01-14 12:48:44 +01:00
314f2ec568 Geoip: Fix linux compilation 2015-01-14 12:37:43 +01:00
f09f4a4c6c Geoip: Remove previous C99 compatibility changes with v100
Since we're compiling against v120_xp now, C99 is supported, which makes the previous compatibility changes pointless.
This reverts to the state of the original content.
For maintainability reason, it's welcomed.

For reference, the only change now is the moving of PACKAGE_VERSION define to be available for linux too (since we don't use configure.ac)
2015-01-14 12:35:04 +01:00
6703841c35 Merge pull request #179 from Arkshine/fix/update-vs-projects
Update VS projects
2015-01-14 10:50:08 +01:00
dd9975cd67 Rename msvc10 directories to msvc12 2015-01-14 10:31:33 +01:00
97369c5d6c Upgrade VS projetcs to use v120_xp toolset and fix missing include paths 2015-01-14 10:25:46 +01:00
328c3d7b8b Merge pull request #177 from Arkshine/fix/clang-3.5-compiler-warning
Compiler: Fix tautological warning with clang-3.5
2015-01-12 00:52:29 +01:00
16874378f1 Geoip: Update libmaxminddb to 1.0.4 2015-01-12 00:00:31 +01:00
a0cfa59e56 Compiler: Fix tautological warning with clang-3.5 2015-01-11 23:09:53 +01:00
b4399f42da Geoip: Move C99 headers in its own directory 2015-01-11 16:08:52 +01:00
dfbc74dc5f Merge pull request #176 from Arkshine/fix/keep-geop_country-bcompat
Keep geoip_country backward compatible after #99
2015-01-10 14:55:49 +01:00
539823f565 Keep geoip_country backward compatible after #99 2015-01-10 14:07:51 +01:00
4a3fcdb937 Merge pull request #171 from Arkshine/fix/geoip-invalid-memory
Geoip: Fix possible crash
2015-01-08 10:37:36 +01:00
0bc20edb5b Merge pull request #174 from Arkshine/fix/mac-compilation
Attempt to fix OSX compilation
2015-01-07 19:22:23 +01:00
bab760897b Attempt to fix OSX compilation 2015-01-07 19:23:23 +01:00
7f71cfaee7 Merge pull request #165 from Arkshine/feature/add-version-lib-and-missing-rc
Update versioning system and add missing module RC file (bug 6222)
2015-01-07 18:59:51 +01:00
2ffd4cb9fa Fix with parsing literal strings ending with character '\\'
From Pawn rev32: https://code.google.com/p/pawnscript/source/detail?r=32
E.g.: #define EGG "Gaben^^" (control character + something)

This fixes also compilation under linux.
2015-01-07 00:35:20 +01:00
de2796508f Add string literal concatenation and stringizing operator 2015-01-06 23:39:46 +01:00
aa8170ecfd Merge pull request #172 from Arkshine/fix/osx-compilation
Fix OSX compilation
2015-01-06 23:26:22 +01:00
4fc2b4ed64 Fix OSX compilation 2015-01-06 23:27:51 +01:00
604200e905 Merge pull request #162 from Arkshine/feature/update-amtl-c++11
Add C++11 support
2015-01-06 22:38:19 +01:00
a543db5dc6 Geoip: Fix possible crash 2015-01-06 22:36:14 +01:00
9552049524 Merge pull request #170 from Freeman-AM/cstrike-initvalue
meta_api.cpp: modify csstats_rank value to match amxx.cfg default value
2015-01-05 18:03:00 +01:00
0c85f03f05 meta_api.cpp modify csstats_rank value to match amxx.cfg default value 2015-01-05 17:43:14 +01:00
b883486308 Merge pull request #168 from Ni3znajomy/master
Updated dictionary plmenu.txt
2014-12-28 21:19:05 +01:00
e7e9994b73 Updated PL translations
Updated PL translations
2014-12-28 20:56:52 +01:00
47d6f849f2 Added missing dictionary's key to PL translation.
Added TRANSF_SILENT key to PL translation.
2014-12-28 20:55:54 +01:00
59b7379db4 Merge pull request #167 from Freeman-AM/typo-errors
Users.ini: fix 2 typo errors
2014-12-23 19:31:53 +01:00
e042550ba4 Users.ini: fix 2 typo errors 2014-12-23 19:00:33 +01:00
15528c9583 Merge pull request #166 from rsKliPPy/set_task
Set task
2014-12-17 14:33:28 +01:00
f3dfc6e4c6 Add any: tag to set_task parameter[] 2014-12-14 19:00:15 +01:00
1df58d6231 Merge pull request #164 from Arkshine/fix/regression-member-tag-of-enum
FIx regression with member tag of enum not being checked on assigment
2014-12-13 11:23:10 +01:00
c068eed19d Simplify code. 2014-12-13 11:15:06 +01:00
ab4294f3ca Fix linux compilation 2014-12-10 15:41:52 +01:00
f4a3d07b0e Fix missing binary suffix 2014-12-10 15:05:47 +01:00
4b11a54345 Make sure overriden tag is done with _: 2014-12-09 22:59:57 +01:00
78940b46a4 Untabify code 2014-12-09 22:29:43 +01:00
45bf43d76e FIx regression with member tag of an enum not being checked on assigment 2014-12-09 22:26:59 +01:00
6ba614d425 Merge pull request #163 from Arkshine/fix/sizeof-issue-with-trailing-comma-in-array
Fix trailing commas in array literals changing the result of sizeof()
2014-12-09 00:06:32 +01:00
5e622aa69f Remove static on 'disable' variable 2014-12-08 23:55:30 +01:00
a50f104fd3 Fix trailing commas in array literals changing the result of sizeof() 2014-12-08 20:45:33 +01:00
8443a836aa Add the actual version.rc file for all modules 2014-12-08 01:44:51 +01:00
f5e23903a2 Add version.rc in AMBuilder for all modules 2014-12-08 01:44:27 +01:00
291a33ce65 Update moduleconfig.h for all modules 2014-12-08 01:43:33 +01:00
7c96c30be8 Replace old SVN_* defines by the new ones 2014-12-08 01:42:42 +01:00
3594c11238 Update versioning 2014-12-08 01:39:10 +01:00
1977bf4d29 C++11: Update AMBuildScript 2014-12-06 14:33:22 +01:00
1146bcad2c C++11: Fix some code 2014-12-06 14:02:55 +01:00
1199863e47 C++11: Update StringHashMap 2014-12-06 14:01:17 +01:00
590e6b1258 C++11: Sync AMTL libraries from upstream 2014-12-06 14:00:15 +01:00
2bba5ce69a Merge pull request #161 from 9iky6/patch-12
Fix spectators not being killed if silent switch is on
2014-12-05 17:23:37 +01:00
015e4f2f33 fix_alive_spectator
Fix invisible living the spectators
2014-11-21 20:56:06 +06:00
8951f80748 Merge pull request #159 from Arkshine/fix-get_user_name
Fix typo in get_user_name() where hostname was returned as blank string
2014-11-13 21:20:40 +01:00
4ffd847b7a Fix typo in get_user_name() where hostname was returned as blank string 2014-11-13 19:01:26 +01:00
0dd638d0fd Merge pull request #158 from Arkshine/fix-sizeof-fix
Improve more sizeof return on array without specifiying the dimensions
2014-11-11 21:09:44 +01:00
1a97b2cbe1 Improve more sizeof return on array without specifiying the dimension 2014-11-11 12:34:16 +01:00
9b662bb0ca Merge pull request #157 from Chuvi-w/master
Revert "Done" text due to AMXX-Studio compatibility.
2014-11-10 19:33:14 +01:00
3775ac40ad Revert "Done" text due to AMXX-Studio compatibility. 2014-11-09 04:04:33 +03:00
666aaf013a Merge pull request #156 from 9iky6/patch-11
Fix stock regex_match_simple
2014-11-07 14:57:12 +01:00
63aff82dc8 Update regex.inc 2014-11-07 18:11:55 +05:00
21ae30b985 Fix stock regex_match_simple
Fix regex_match_simple.

Where regex_match_ex referred to in this file?
2014-11-07 18:09:10 +05:00
d5086f6a54 Merge pull request #154 from ClaudiuHKS/master
Add MySQL Reconnect Feature
2014-10-28 10:15:30 +01:00
005b50de92 Added MySQL Reconnect Feature
If the connection times out or gets lost, this will prevent "MySQL server has gone away" error.
2014-10-27 17:55:23 -07:00
6e60b596d7 Merge pull request #152 from Arkshine/improve-find_ent_by_owner
Allow find_ent_by_owner native to work in client_disconnect forward
2014-10-26 13:06:55 +01:00
929d6255fc Merge pull request #153 from Arkshine/fix-ham-specialbot
Fix specialbot not working with [Enable/Disable]HamForward natives
2014-10-26 13:06:38 +01:00
b451fbd1c8 Fix specialbot not working with [Enable/Disable]HamForward natives 2014-10-25 20:44:17 +02:00
419bdecc20 Merge pull request #149 from Arkshine/improve-get_map_objectives
Improve get_map_objectives native
2014-10-25 12:10:32 +02:00
5f824d64da Merge pull request #150 from Arkshine/add-reset_menu
Allow show_menu native to send empty text + add reset_menu stock (bug 6244)
2014-10-25 12:00:08 +02:00
79479e40c6 Merge pull request #151 from Arkshine/add-msg_init-support
Add MSG_INIT support in message_begin native (bug 6254)
2014-10-25 11:45:02 +02:00
cfcd6e9ac9 Allow find_ent_by_owner native to work in client_disconnect forward 2014-10-25 11:08:31 +02:00
1bd022305f Add MSG_INIT support in messsage_begin native (bug 6254) 2014-10-24 21:04:42 +02:00
d0ab27092c Allow show_menu native to send empty text and add reset_menu stock (bug 6244) 2014-10-24 20:36:38 +02:00
850ae540a9 Improve get_map_objectives native. 2014-10-24 12:58:24 +02:00
b2aa84ddbd Merge pull request #147 from Arkshine/fix-linux-warning
Fix linux warning in previous commit
2014-10-24 11:43:04 +02:00
9cf4564057 Fix linux warning in previous commit 2014-10-24 11:25:52 +02:00
d8fc093fd8 Merge pull request #143 from ClaudiuHKS/master
Colored Menus and GeoIP Bug Fix
2014-10-18 20:18:29 +02:00
3953db97cd Improving Code 2014-10-18 11:11:10 -07:00
d1c0b8fea6 Improving Code 2014-10-18 11:09:49 -07:00
7ced590cbc Improving Code 2014-10-18 11:04:10 -07:00
82cbc94f27 Improving Code 2014-10-18 10:58:26 -07:00
5d2b738ec1 Improving Code 2014-10-18 10:36:07 -07:00
59a1b018ed Improving Code 2014-10-18 10:34:03 -07:00
3615e717ca Adding New Game Modifications Due Colored Menus
Adding New Game Modifications Due Colored Menus.
2014-10-18 10:10:58 -07:00
e08e140c3c Fixed Switch Statement
Fixed Switch Statement.
2014-10-18 10:10:09 -07:00
aa963603ed Adding New Game Modifications Due Colored Menus
Adding New Game Modifications Due Colored Menus.
2014-10-18 10:09:11 -07:00
3894e53cf6 Merge pull request #141 from Freeman-AM/master
Removal of many hardcoded contents (part 1)
2014-10-13 10:18:32 +02:00
94a4be95fe Nextmap: replace len hardcoded content by charsmax and sizeof 2014-10-12 02:11:07 +02:00
2db8156326 Plmenu: replace len hardcoded content by charsmax 2014-10-12 01:41:58 +02:00
6bb9052261 Mapchooser: missing MAX_NAME_LENGTH 2014-10-12 00:59:08 +02:00
c440929700 Stats: Replace len hardcoded contents by charsmax and sizeof 2014-10-11 23:17:20 +02:00
c2ee729380 Stats_logging: Replace len hardcoded contents by charsmax 2014-10-11 22:41:18 +02:00
4e343f65bd Stats_logging: Replace len hardcoded contents by charsmax 2014-10-11 22:31:11 +02:00
15b160e51a Stats: Replace len hardcoded contents by charsmax and sizeof 2014-10-11 21:29:10 +02:00
2a5fae43b8 Plmenu: replace len hardcoded content by charsmax 2014-10-11 20:55:24 +02:00
59cb65f47a Timeleft: replace len hardcoded content by charsmax and sizeof 2014-10-11 19:51:57 +02:00
93d37a6366 Plmenu: replace len hardcoded content by charsmax 2014-10-11 19:07:24 +02:00
6e183f3e64 Plmenu: fix typos errors from previous commit 2014-10-11 19:05:25 +02:00
3776650a38 Nscommands: remove an hardcoded value 2014-10-11 18:13:08 +02:00
7e9e2b7b58 Stats: more use of sizeof 2014-10-11 17:55:42 +02:00
6e525ea8fe Statsx: more use of sizeof 2014-10-11 17:46:29 +02:00
8d4a1ca359 Restmenu: more use of sizeof 2014-10-11 17:04:12 +02:00
ea23bdb579 Nscommands: replace len hardcoded content by charsmax 2014-10-11 16:20:49 +02:00
cff3ab867a Nextmap: replace len hardcoded content by charsmax and sizeof 2014-10-11 16:00:11 +02:00
8071b895d2 Idlekicker: replace len hardcoded content by sizeof 2014-10-11 14:39:34 +02:00
8b9c107a03 Stats: Replace len hardcoded contents by sizeof + fix typo error in previous commit 2014-10-11 14:31:56 +02:00
ee6285c79d Statsx: Replace len hardcoded contents by sizeof 2014-10-11 14:10:36 +02:00
54ab06493a Restmenu: fix a typo error induced by previous commit 2014-10-11 14:07:38 +02:00
97aac34dc9 Miscstats: replace len hardcoded content by sizeof 2014-10-11 14:02:15 +02:00
2e1a7b56d8 Merge pull request #140 from Nextra/menu-recursion
Fix recursion issues with show_menu and newmenus
2014-10-11 10:58:00 +02:00
41d7554efd Fix recursion issues with show_menu and newmenus 2014-10-11 00:35:05 +02:00
d7911d8f3f Mapchooser: replace len hardcoded content by charsmax 2014-10-08 23:47:51 +02:00
7ba6f72825 Idlekicker: replace len hardcoded content by charsmax 2014-10-08 23:31:00 +02:00
9a9dd7a4ad Stats_logging: replace len hardcoded content by charsmax 2014-10-08 23:24:48 +02:00
2cc771371a Stats: Replace len hardcoded contents by charsmax
Note: TOPX is over 8 char len in some languages.
2014-10-08 22:52:57 +02:00
0a4cd13622 Plmenu: replace len hardcoded content by charsmax 2014-10-08 21:49:00 +02:00
91dfec4ef7 Statsx: Replace len hardcoded contents by charsmax 2014-10-08 15:03:51 +02:00
0237153ddd Stats_logging: Replace len hardcoded contents by charsmax 2014-10-08 14:32:03 +02:00
71f011c70d Restmenu: replace len hardcoded content by charsmax and sizeof 2014-10-08 14:21:53 +02:00
581f734099 Merge pull request #139 from 9iky6/patch-10
Update engine_stocks.inc
2014-10-05 15:42:21 +02:00
8ea62d22cb Update engine_stocks.inc
When compiling was varningov , and the function itself was crooked written
2014-10-05 16:19:47 +06:00
f8b2d26a00 Merge pull request #137 from Arkshine/update-compiler-2
Update compiler - 2
2014-09-29 20:42:17 +02:00
3b3e78d65b Compiler: Remove commented code in previous commit 2014-09-29 20:36:14 +02:00
a8efe40293 Merge pull request #138 from Arkshine/sync-amtl
Sync AMTL from upstream
2014-09-29 19:05:58 +02:00
35e661fdf9 Sync AMTL from upstream 2014-09-29 18:36:37 +02:00
e1206eb310 Merge pull request #136 from Freeman-AM/master
Missing stuff in cstrike and ns amxx.cfg
2014-09-29 17:39:18 +02:00
199b41af0a Compiler: Treat pawn warnings as errors when building 2014-09-29 15:55:16 +02:00
e7c7313f77 Compiler: Add a flag for warnings-as-errors 2014-09-29 15:54:39 +02:00
ae2699ca98 Compiler: Disable estimated memory usage 2014-09-29 15:12:56 +02:00
2bae36e8eb Replace hardcoded defines in adminhelp with cvars 2014-09-28 18:02:16 +02:00
12c08ddcdb Update core to use amx_language cvar instead of vault 2014-09-28 17:59:01 +02:00
f1f2d9f98a Replace hardcoded defines in adminhelp with cvars 2014-09-28 17:48:16 +02:00
47d2da259b Update core to use amx_language cvar instead of vault 2014-09-28 17:41:48 +02:00
e7452e00ce Merge pull request #135 from Freeman-AM/master
CS Statx and DOD stats: add missing utf-8 symbols support in motd
2014-09-21 13:01:43 +02:00
83873aa7f7 Stats: Add full UTF-8 symbols support 2014-09-21 02:39:09 +02:00
9a1b7b0a63 Statsx: Add full UTF-8 symbols support 2014-09-21 00:42:03 +02:00
a350be335b Merge pull request #134 from WildCard65/master
Fix typo in modules.cpp
2014-09-20 02:51:05 +02:00
a676d9ea52 Fix typo in modules.cpp
Ya...
2014-09-19 20:45:44 -04:00
598936be46 Merge pull request #133 from Arkshine/sync-amtl
Sync AMTL
2014-09-18 19:41:51 +02:00
d0623e5ef7 Merge pull request #132 from Arkshine/geoip-fix-typo
Fix typo in #99 (reported by Hattrick)
2014-09-18 19:41:40 +02:00
bc5924a780 Merge pull request #131 from Arkshine/fix-plugin-warning
Fix unreachable code warning (reported by kwpd)
2014-09-18 19:41:31 +02:00
c1dca680f2 Don't remove this return 2014-09-18 19:35:29 +02:00
d4b0444d7a Sync AMTL 2014-09-18 19:29:58 +02:00
d9efe61030 Fix typo in #99 (reported by Hattrick) 2014-09-18 19:24:37 +02:00
a93886fb65 Fix unreachable code warning (reported by kwpd) 2014-09-18 19:17:00 +02:00
87774ae21f Merge pull request #130 from Arkshine/fix-regression
Fix a crash regression in #112
2014-09-15 13:27:49 +02:00
19e06100b2 Fix a crash regression in #112 2014-09-15 09:57:38 +02:00
e8acb93b99 Merge pull request #75 from LittleKu/patch-1
Add chinese language
2014-09-04 23:25:11 +02:00
4d0d865700 Update stats_dod.txt 2014-09-04 13:57:10 +08:00
8bd81ee883 Update restmenu.txt 2014-09-04 12:33:53 +08:00
8b0a8737b8 Update plmenu.txt 2014-09-04 12:19:59 +08:00
c111f59825 Update pausecfg.txt 2014-09-04 12:14:27 +08:00
f2ba295668 Update nextmap.txt 2014-09-04 11:59:54 +08:00
01dbd4093b Update statscfg.txt 2014-09-04 11:58:05 +08:00
152c984176 Merge pull request #128 from Arkshine/Fix-missing-compiler-message
Fix compiler crash due to missing recursion message warning (bug 6251)
2014-08-31 14:59:08 +02:00
de85f2735e Fix compiler crash due to missing recursion message warning. 2014-08-31 14:52:24 +02:00
39cf32879d Merge pull request #127 from Ni3znajomy/master
Fix a typo in the documentation.
2014-08-29 22:04:14 +02:00
47413928c8 Fix a typo in documentation. 2014-08-29 16:48:30 +02:00
1463103cd7 Merge pull request #116 from Arkshine/update-compiler-safe-fix-feature
Update compiler
2014-08-26 09:07:45 +02:00
f30c7a63b1 Compiler: Fix linux compilation and close file handle on success in pc_opensrc. 2014-08-26 09:06:02 +02:00
e46785a434 Compiler: Improve/fix recursion detection.
Imported from Pawn 3.2.3664 and 3.3.3875.
2014-08-26 09:05:23 +02:00
a873066466 Compiler: Fix enum field size was not taken into account when implicitly passed to a function.
Imported from Pawn 3.3.3930.

Example:

---

enum tag
{
  member[32]
}

new var[tag];

foo(const string[], size = sizeof(string))
{
    // size returns 1 before fix, 32, after.
}

public plugin_init()
{
    foo(var[member]);
}

---
2014-08-26 09:05:22 +02:00
f60b00ee71 Compiler: Use hash table for global name lookups.
Imported from SM: https://bugs.alliedmods.net/show_bug.cgi?id=4496.
2014-08-26 09:05:20 +02:00
a876962405 Compiler: Use in-memory buffers for reading files, and handle newlines better.
Imported from https://github.com/alliedmodders/sourcemod/pull/63.
2014-08-26 09:05:18 +02:00
c2ca5d857d Compiler: Change __line to __LINE__. 2014-08-26 09:05:17 +02:00
27825963f6 Compiler: Fix indentation. 2014-08-26 09:05:15 +02:00
ca7b0ceadd Compiler: Revert "Add #warning directive."
Probably not that useful.
2014-08-26 09:05:13 +02:00
32b546df69 Compiler: Revert "Fix runtime error in variadic functions that return strings."
Better fix by dvander will be provided later.
2014-08-26 09:05:11 +02:00
cea2f598b2 Compiler: Fix a regression in handling multi-dimensional arrays (introduced in 744d67b)
Fix imported from Pawn 3.3.4058.
2014-08-26 09:05:10 +02:00
d44eb7bf8d Compiler: Update VERSION_INT.
Some people may want to check compiler version with __Pawn, and it would be a good idea to bump the version.
Since we have a special version, and to avoid to use digit which may be used by official version, I propose using letters, so: 0x30A.
This should be resonneable.
2014-08-26 09:05:08 +02:00
e1445316aa Compiler: Fix moar. 2014-08-26 09:05:07 +02:00
238e3707c8 Compiler: Fix linux compilation. 2014-08-26 09:05:05 +02:00
16e5f54507 Compiler: Improve the reported line number accuracy on warning 203/4 (symbol never used).
Imported from Pawn 3.1.3541+.
https://code.google.com/p/pawnscript/source/detail?r=25
2014-08-26 09:05:03 +02:00
65c29cafa0 Compiler: Fix #elseif handling not working as expected.
Improted from Pawn 3.1.3636.

-- Example

#define VAR 1

#if VAR == 1
  // code
#elseif VAR == 2
  // code
#endif

--
Returns error(38).
2014-08-26 09:05:01 +02:00
c4b233d094 Compiler: Improve sizeof return on array without specifiying the dimensions.
Imported from Pawn 3.1.3636.

"When making an array without specifiying the dimensions, but where the element
count at the lowest dimension is the same for all, the compiler now "counts"
this size, rather than setting the lowest dimension as "variable length".

An example for this situation is the declaration:
    new my_array[][] = { {1,0}, {2,1}, {3,1} }
No dimensions are given, but the new compiler determines that the minor
dimension is 2 (and the major dimension is 3). Previous compilers set the
minor dimension to 0 --meaning "variable"."
2014-08-26 09:05:00 +02:00
cd189320e5 Compiler: Fix the "@" character was not allowed in macro definitions (while the documentation stated that they were).
Imported from Pawn 3.1.3599.
2014-08-26 09:04:58 +02:00
17114347d1 Compiler: Fix runtime error in variadic functions that return strings.
Imported from SM-AM: 1d1244c2f0.

"This fixes a bug where returning a string from a variadic function caused
an invalid memory access error during runtime. It seems like they forgot
to update existing string return code for variadic functions."
2014-08-26 09:04:56 +02:00
1866afd80b Compiler: Add __line
Imported from SA-MP: 605ae7f4d3
This is a backport from Pawn 4.0. It sets to the current line number during compile time.
Documention for 3.x actually mention this.
2014-08-26 09:04:55 +02:00
fcdeea683b Compiler: Add #warning directive.
Basically same as error but as warning.
Imported from SA-MP: 1bd6be93e0

Example:

  #warning don't eat egg.

Result:

  warning.sma(1) : warning 234: user warning: don't eat egg.
2014-08-26 09:04:53 +02:00
92255bcdc3 Compiler: Fix crash when using tagof(tagname:)
Imported from SA-MP: 53ef10ffc7
2014-08-26 09:04:52 +02:00
b2442a2268 Compiler: Ignore #pragma tabsize with non-positive argument.
Imported from SA-MP: 7f30a03f94.
2014-08-26 09:04:50 +02:00
1b3b07d4d8 Compiler: Add __BINARY_PATH__ and __BINARY_FILE__.
Imported from SM: https://hg.alliedmods.net/sourcemod-central/rev/bd38ac67afe1 and https://hg.alliedmods.net/sourcemod-central/rev/eb4c45360aaf.
2014-08-26 09:04:48 +02:00
95f3b0d354 Compiler: Fix return omission with else-after-return.
Imported from SM: https://bugs.alliedmods.net/show_bug.cgi?id=4852.
2014-08-26 09:04:47 +02:00
9b5c6bfff0 Compiler: Fix asserting when returning a string literal.
Imported from SM: https://bugs.alliedmods.net/show_bug.cgi?id=3836.
2014-08-26 09:04:45 +02:00
57b172072a Compiler: Fix bogus assert about name lengths.
Imported from SM: https://bugs.alliedmods.net/show_bug.cgi?id=4486.
2014-08-26 09:04:44 +02:00
3b2618f63b Compiler: Fix improper handling of constant chained relational operators.
Imported from SM: https://bugs.alliedmods.net/show_bug.cgi?id=3838.
2014-08-26 09:04:42 +02:00
4f525b9150 Compiler: Fix memory corruption when parsing natives.
Imported from SM: https://bugs.alliedmods.net/show_bug.cgi?id=5840
2014-08-26 09:04:40 +02:00
325a746d90 Compiler: Fix issue with multidimensional array variable release.
Imported from SM: https://bugs.alliedmods.net/show_bug.cgi?id=6100.
2014-08-26 09:04:39 +02:00
6978e2dc4c Compiler: Fix in recursion detection.
Original fix imported from pawn 3.1.3522.
This fixes where for some plugins you would have:

   Stack/heap size:      16384 bytes; usage is unknown, due to recursion

Now, you get:

   Stack/heap size:      16384 bytes; estimated max. usage=782 cells (3128 bytes)
2014-08-26 09:04:37 +02:00
520493fab1 Compiler: Add #pragma deprecated.
This is based on SM, including patch to support macros/constants (https://hg.alliedmods.net/sourcemod-central/rev/ef8dd1cddc35).
Updated also some pawn includes to use this new pragma.
2014-08-26 09:04:36 +02:00
09303625fb Compiler: Generate .scp files as part of the build process.
Stolen from SM (https://github.com/alliedmodders/sourcemod/pull/112).
2014-08-26 09:02:38 +02:00
02b6d0a288 Compiler: Increase input line length.
1023 can be achieved really fastly, e.g. with some SQL definitions.
This is the same value as SM.
2014-08-26 09:02:36 +02:00
4d454b474c Attempt to fix build 2014-08-23 10:17:47 +02:00
204004b90e Merge pull request #112 from Arkshine/deduplicate-files
Deduplicate a number of files used by modules by moving them to the public directory
2014-08-23 10:00:13 +02:00
ccf919c58c Fix typo in previous commit (r=dvander) 2014-08-21 20:57:08 +02:00
567fbcd517 Fix build. 2014-08-19 21:38:44 -07:00
7f25e28d01 Merge pull request #121 from alliedmodders/fix-variadic
Fix returning strings from variadic functions.
2014-08-19 13:48:50 -07:00
9e0f946696 Merge pull request #124 from Arkshine/fix-sound-onbuy
Block weapon pickup sound if shield is disallowed in CS_OnBuy forward.
2014-08-19 19:27:36 +02:00
bd08cc5126 Merge pull request #126 from Arkshine/feature-find-player-engclient_print
Allow some natives to be used on connecting players (bug 6229).
2014-08-19 18:35:52 +02:00
bf23890a34 Reverse condition for clarity and to make Nextra happy! 2014-08-19 18:25:00 +02:00
9eedca0a98 Merge pull request #125 from Arkshine/fix-abort
Don't show blank line in abort() with AMX_ERR_NONE (bug 6233).
2014-08-19 18:15:24 +02:00
68aec7eec0 Use new flags in get_players/find_player instead to avoid breakage. 2014-08-19 15:39:06 +02:00
76811b7b84 Allow get_players() as well. 2014-08-19 10:08:25 +02:00
38d43e8fc9 Merge pull request #122 from xPaw/lastmanhp
Add an option to disable showing last man's health (bug 5847)
2014-08-19 09:56:07 +02:00
9cd90838e1 Remove safety checks as it's not really necessary. 2014-08-19 09:04:09 +02:00
e7d7de870a Block weapon pickup sound if shield is disallowed in CS_OnBuy forward. 2014-08-18 22:02:08 +02:00
bcbf454255 Merge pull request #123 from yamikaitou/master
Fix compile error
2014-08-18 14:36:49 +02:00
4dd53b333f moving comment 2014-08-18 06:34:18 -05:00
b1b47a6d4c fix compile error 2014-08-18 05:36:37 -05:00
518944c41e Add an option to disable showing last man's health (bug 5847) 2014-08-18 12:36:13 +03:00
481e1528d6 Don't show blank line in abort() with AMX_ERR_NONE (bug 6233). 2014-08-17 23:33:00 +02:00
33c0a676fd Allow find_player() and engclient_print() (in console) to be used on connecting players (bug 6229). 2014-08-17 23:31:46 +02:00
6bbc4c8dbd Fix returning strings from variadic functions. 2014-08-17 10:00:51 -07:00
19f1c1a9ec Merge pull request #119 from reuben/metamod-path
Look for Metamod in ../metamod-hl1 as well since that's the name of the new git repo
2014-08-17 15:45:00 +02:00
5d9428f014 Look for Metamod in ../metamod-hl1 as well since that's the name of the new git repo. 2014-08-16 18:16:03 -03:00
63774d75f3 Remove "Done." text from compiler. 2014-08-16 18:03:34 +01:00
f185eaa232 Update TRANS_SILENT Serbian translaton. 2014-08-16 17:41:27 +02:00
d49064b43e Merge pull request #113 from kiapwnz/silentswitch
Added Silent Transfer Option in Team Menu.
2014-08-16 15:13:18 +02:00
e6b8188480 Merge pull request #118 from Arkshine/zlib-update-vs-project
Update VS projects in #117.
2014-08-16 14:46:49 +02:00
ab81658471 Update VS projects in #117. 2014-08-16 14:19:09 +02:00
8883624b2e Merge pull request #117 from alliedmodders/compile-zlib
Remove pre-compiled zlib from the tree
2014-08-16 13:07:30 +01:00
62f6b25b63 Remove pre-compiled zlib from the tree. 2014-08-16 00:33:33 +01:00
e6c3d42eb8 Merge pull request #115 from alliedmodders/emscripten
Add support for Emscripten to the compiler.
2014-08-15 23:49:03 +01:00
3a43a41141 Added back estimated stack usage. 2014-08-15 23:46:16 +01:00
f886e69dfb Fixed linux build. 2014-08-15 23:23:11 +01:00
46123d359f Add support for Emscripten to the compiler. 2014-08-15 16:32:00 +00:00
8f2aeed9da Fix missing TE_BEAMENTPOINT define. 2014-08-15 14:20:51 +02:00
Kia
8890b2fd27 Added languages, languages available now :
[en]
[de]
[fr]
[sv]
[ru]
[pl]
[es]
[sk]
[sr]
[tr]
[da]
[nl]
[bp]
[cz]
[fi]
[bg]
[ro]
[hu]
2014-08-13 14:20:29 +02:00
Kia
5ee794f9f4 Fixed another Typo. 2014-08-11 16:41:35 +02:00
Kia
2ab4a8a44a Added Silent Transfer Option in Team Menu. 2014-08-11 16:38:16 +02:00
Kia
5ba0e3ec2a Added Silent Transfer Option in Team Menu.
Players will be transferred without getting killed if admin chooses to enable this function.
2014-08-11 14:46:30 +02:00
0fed80968b Fix OSX compilation #1. 2014-08-10 22:58:38 +02:00
41f6932b68 Remove some SourceMod namespace. 2014-08-10 22:25:14 +02:00
1ae40316a8 Fix nvault issues.
This includes an original one leading to a crash at mapchange if empty key or value are saved.
2014-08-10 22:11:40 +02:00
3dace577fe Remove svn_version.h reference from project files. 2014-08-10 19:08:50 +02:00
1395b42692 Update wincsx project files. 2014-08-10 19:06:21 +02:00
c0a132e039 Update tsx module project files. 2014-08-10 18:53:13 +02:00
9b6110edc6 Update tsfun module projects files. 2014-08-10 18:47:02 +02:00
2b64ee21b3 Update tfcx module project files. 2014-08-10 18:42:04 +02:00
a290f7d299 Update sockets module project files. 2014-08-10 18:38:24 +02:00
a8e6cfe5cf Update regex module project files. 2014-08-10 18:29:55 +02:00
9d53d48552 Update ns module project files and use AMTL. 2014-08-10 18:29:55 +02:00
3f6ad29f55 Update sqlite module project files and use AMTL. 2014-08-10 18:29:38 +02:00
ab16be08f5 Update nvault module project files and use AMTL. 2014-08-10 18:29:19 +02:00
3ba84fb283 Update mysql module project files and use AMTL. 2014-08-10 18:29:10 +02:00
4f3d335ab4 Update hamsandwich module project files and use AMTL. 2014-08-10 18:28:56 +02:00
4f776ee56b Update geoip module project files. 2014-08-09 20:59:21 +02:00
40313929eb Update fun module project files. 2014-08-09 20:54:20 +02:00
c76509fe41 Update fakemeta module project files and use AMTL. 2014-08-09 20:50:45 +02:00
889ad7c3eb Update engine module project files and use AMTL. 2014-08-09 20:32:10 +02:00
d59f4cf199 Update dodx module project files. 2014-08-09 19:56:34 +02:00
dc9c2897fd Update dodfunc module project files. 2014-08-09 19:53:37 +02:00
b17c624c81 Update csx module project files. 2014-08-09 19:47:31 +02:00
9dee60934f Update cstrike module project files. 2014-08-09 19:33:04 +02:00
bc856740f2 Update AMBuildScript and renamed the generic moduleconfig.h file to avoid conflict. 2014-08-09 18:27:55 +02:00
c497d478ce Move out base sdk folder into public directory. 2014-08-09 17:35:08 +02:00
17683249fd Merge pull request #111 from Arkshine/fix-array-bcomp
Fix missing backward compatibility for some Array natives.
2014-08-09 15:31:03 +02:00
2c146f564e Fix missing backward compatibility for some Array natives. 2014-08-09 15:22:18 +02:00
fc1732e758 Fix possible compatibility issue,
Unfortunately some plugin doesn't explicit max length, resulting a compilation error with AMXX 1.8.3 compiler.
2014-08-09 13:09:53 +02:00
486fa99602 Trigger a build. 2014-08-08 21:26:44 +02:00
570c9cfc6b Merge pull request #110 from Arkshine/replace-more-snprintf
Replace more snprintf by UTIL_Format.
2014-08-08 20:38:38 +02:00
02bed88835 Merge pull request #109 from Arkshine/update-project-files
Update project files.
2014-08-08 20:38:17 +02:00
62eac5d91c Replace _snprintf too. 2014-08-08 13:23:38 +02:00
b47aa6871d Replace more snprintf by UTIL_Format. 2014-08-08 12:47:15 +02:00
eeb4ecd109 Update project files. 2014-08-08 11:27:40 +02:00
c22bb12c1e Merge pull request #108 from Nextra/inc-doc
Update include documentation (mainly amxmodx.inc)
2014-08-08 01:25:56 +02:00
b096f94ca4 amxconst: Purge tabs 2014-08-07 23:13:03 +02:00
a63042d961 amxmodx/cellarray: Assorted consistency updates and typo fixes 2014-08-07 23:02:39 +02:00
8b42767b19 amxmodx: Precaching documentation is the bane of my existence 2014-08-07 22:01:21 +02:00
20a173d8a3 amxmodx: Improve precache comments 2014-08-07 21:49:56 +02:00
08315a4329 message_const: Move TE_USERTRACER example into the comment block 2014-08-07 21:42:18 +02:00
a7d94a4859 Merge pull request #107 from Arkshine/Fix-array-compatibility-issue
Fix a compatibility issue with the "reserved" parameter.
2014-08-07 21:38:51 +02:00
72b514cdde Make sure reserved parameter is a not a negative value. 2014-08-07 21:31:53 +02:00
4231c5a6ae amxmodx: Sixth and final batch of documentation updates 2014-08-07 21:26:37 +02:00
bbffcbf739 cellarray: Update lying ArrayCreate doc 2014-08-07 21:17:45 +02:00
aa4e60ae27 Fix a compatibility issue with the "reserved" parameter. 2014-08-07 20:40:07 +02:00
6a24935777 Merge pull request #106 from Arkshine/fix-fallback-language
Use server language as fallback if client's "lang" key is not defined.
2014-08-07 19:42:52 +02:00
c03271c856 Use server language as fallback if client's "lang" key is not defined. 2014-08-07 14:20:29 +02:00
8c591bf065 Merge pull request #105 from Arkshine/kill-snprintf
Replace all snprintf with UTIL_Format.
2014-08-07 08:38:21 +02:00
88b69ea8a1 amxmodx: Update change_level doc for consistency 2014-08-07 01:46:11 +02:00
1fb91dc02e Merge branch 'master' of ssh://github.com/alliedmodders/amxmodx into inc-doc
Conflicts:
	plugins/include/amxmodx.inc
	plugins/include/message_const.inc
	plugins/include/sockets.inc
2014-08-07 01:44:04 +02:00
69c46aff80 Replace all snprintf with UTIL_Format. 2014-08-07 01:42:58 +02:00
d3bc58d80b Merge pull request #101 from Arkshine/textparsers
Introduce TextParser API
2014-08-07 01:24:51 +02:00
c72d130fde Merge pull request #104 from Arkshine/add-change_level
Add change_level() native.
2014-08-07 01:24:36 +02:00
58b6f9f353 fix the documentation. How it's possible to not see a double comma! 2014-08-07 01:26:05 +02:00
e9eaae4dd1 Fix documentation. 2014-08-07 01:21:22 +02:00
29eb4e4647 Fix documentation. 2014-08-07 01:18:45 +02:00
6b5387f428 Fix documentation. 2014-08-07 01:16:44 +02:00
a0852adf18 Fix wrong log error message. 2014-08-07 00:53:15 +02:00
c1ed795196 sockets: Convert file to UTF-8 2014-08-07 00:51:17 +02:00
6da2078067 Replace snprintf by UTIL_Format. 2014-08-07 00:51:01 +02:00
9a0a52b7b2 amxmodx: Fix typos, touch up some descriptions, remove/merge lonely comments 2014-08-07 00:46:16 +02:00
8d2770f2f2 Put back original SM headers. 2014-08-07 00:43:29 +02:00
37e22dc22f amxmodx: Fifth batch of documentation updates 2014-08-07 00:19:24 +02:00
fb4d05fd60 Fix documentation. 2014-08-06 19:39:19 +02:00
3369f6d115 Update license in pawn includes and add them in project files. 2014-08-06 09:24:09 +02:00
4b652198f0 Fix compilation. 2014-08-06 09:17:54 +02:00
2d07189e38 Fix few issues. 2014-08-06 09:17:53 +02:00
b97093a778 Add more debug in plugin. 2014-08-06 09:17:51 +02:00
287cc1a0e8 Update MakeFile. 2014-08-06 09:17:50 +02:00
7317f1d233 Update PackageScript. 2014-08-06 09:17:48 +02:00
037af0aec2 Split INI/SMC API. 2014-08-06 09:17:47 +02:00
0cf5a2e12f Expose ParseFile_INI to API.
Some minor changes have been made in parser:

- Added ReadINI_ParseStart and ReadINI_ParseEnd call.
- Function returns SMCResult instead of bool. To avoid unecessary complexity and duplicating natives, this feels more appropriate to let these functions to share some SMCResult and SMCParse constants. Since properly documented, this should be ok.
- Made sure curtok is set to 0 when ptr_val is null, otherwise unexpected value would be passed into the forward.
2014-08-06 09:17:45 +02:00
9af7931a79 Introduce TextParser API. 2014-08-06 09:17:43 +02:00
5fbc5c074d Merge pull request #99 from Arkshine/geoip-update-bis
Update Geoip module.
2014-08-05 23:26:27 +02:00
023c1e3baf Geoip: Fix missing continent id and fix indentation. 2014-08-05 23:00:00 +02:00
3a232f1576 message_const: Add placeholder titles for TE_* messages missing a description 2014-08-05 20:18:16 +02:00
adde73123f Geoip: Update license headers.
Hope this won't break merging.
2014-08-05 20:14:22 +02:00
178608c5f8 Geoip: Make some natives UTF-8 safe. 2014-08-05 20:12:26 +02:00
6babcafbec Geoip: Add a fallback to default language (en) in case of unsuccessful lookup with user's language. 2014-08-05 20:12:24 +02:00
ec3ff1deb9 Geoip: Add command to get database metadata and to dump all data of an IP address for debugging purposes.
And for some reason some project files were not pushed.
2014-08-05 20:12:23 +02:00
67bfe6bb36 Geoip: Fix possible buffer overflow. 2014-08-05 20:12:21 +02:00
17e0ab99e6 Geoip: Update documentation. 2014-08-05 20:12:20 +02:00
674600bab2 Geoip: Reorganize and update project files. 2014-08-05 20:11:31 +02:00
9885c926e9 message_const: Fix up all headings and move notes into the new headings 2014-08-05 20:09:57 +02:00
52543481dd Geoip: Increase buffer and fix potential overflow crash. 2014-08-05 20:09:18 +02:00
d2ed9e70cd Geoip: Add an optional parameter in some natves to get a result in player's language.
This is new with Geoip2 database where some entries, like country, city, etc, are translated in several languages.
So far: de, en, es, fr, ru, pt-BR, zh-CN.
2014-08-05 20:09:16 +02:00
210cba53b9 Geoip: Fix stripPort typo. 2014-08-05 20:08:31 +02:00
abaee9f4a3 Geoip: Add geoip_continent_name() native. 2014-08-05 20:08:30 +02:00
fc19f53ea9 Geoip: Add geoip_continent_code() native. 2014-08-05 20:08:28 +02:00
81d56dfdc0 Geoip: Add geoip_distance() native. 2014-08-05 20:08:27 +02:00
6941e406f4 Geoip: Add geoip_latitude() and geoip_longitude() natives. 2014-08-05 20:08:25 +02:00
b439753ac5 Geoip: Add geoip_timezone() native. 2014-08-05 20:08:24 +02:00
c11f721ad4 Geoip: Add geoip_region_name() native. 2014-08-05 20:08:22 +02:00
b61ed9fa3e Geoip: Add geoip_region_code() native. 2014-08-05 20:08:20 +02:00
95bc1703a6 Geoip: Add geoip_city() native. 2014-08-05 20:08:19 +02:00
0d59209e4c Geoip: Replace GeoIP.dat by GeoLite2-Country.mmdb. 2014-08-05 20:08:17 +02:00
7dd1ea3719 Geoip: Convert code to libmaxminddb API. 2014-08-05 20:08:16 +02:00
9d59de41a2 Geoip: Fix compilation #4. 2014-08-05 20:07:10 +02:00
6916eb8613 Geoip: Module should clear memory at mapchange. 2014-08-05 20:07:08 +02:00
94552e5503 Geoip: Fix compilation #3
Update project files.
2014-08-05 20:04:55 +02:00
936d4f4f6d Geoip: Fix compilation #2
A trick to bypass issue where variable creaton was required at the top of function.
2014-08-05 20:04:54 +02:00
526a70a6d7 Geoip: Fix compilation #1
MSVC doesn't fully implement C99, ssize_t, stdbool.h, etc have to be provided manually.
Most of fixes are casting type and unpacking structure.
2014-08-05 20:04:52 +02:00
58a64597e8 Geoip: Import libmaxminddb library which supports Geoip2 databases. 2014-08-05 20:04:50 +02:00
209f46a235 Geoip: Remove GeoIP library. 2014-08-05 20:04:49 +02:00
2659e63483 amxconst: Add some more structure 2014-08-05 18:59:08 +02:00
d9b20d7896 amxconst: Move SND_* constants where they belong 2014-08-05 18:48:37 +02:00
566596f7b4 cellarray: Touch up documentation to make the parser happy and make it consistent 2014-08-05 16:05:19 +02:00
c9ea68d1d3 Fix typo in documentation. 2014-08-05 11:41:55 +02:00
10d5c8e9ad Add change_level() native. 2014-08-05 09:49:32 +02:00
d60c94cbb1 amxmodx: Fourth batch of documentation updates 2014-08-05 01:39:16 +02:00
9e9e3a9abd hlsdk_const: Fix up section heading to make docgen happy, purge tabs 2014-08-04 23:54:07 +02:00
b2dd2661d0 Merge pull request #103 from alliedmodders/gpl3-deux
Update amxx gpl command and ship license files.
2014-08-04 14:49:29 -05:00
d1122b982c Ship license files with builds. 2014-08-04 14:40:01 -05:00
9c08b11a75 Update 'amxx gpl' server command with new license text. 2014-08-04 14:31:28 -05:00
4733155583 Merge pull request #102 from alliedmodders/gpl3
Add license files for GPL2+/GPL3+ and update headers.
2014-08-04 13:43:21 -05:00
2a18a264d4 Update date for license and GPLv2 exception. 2014-08-04 13:18:42 -05:00
f787db1be5 Update license headers for plugins and includes. 2014-08-04 13:18:41 -05:00
d113b1b646 Update license headers for ts modules. 2014-08-04 13:18:40 -05:00
8be13a4ecc Update license headers for tfcx module. 2014-08-04 13:18:40 -05:00
12775d0627 Update license headers for sqlite module. 2014-08-04 13:18:39 -05:00
5ec6cc0d5e Update license headers for socket module. 2014-08-04 13:18:38 -05:00
edeb44b0b8 Update license headers for regex module. 2014-08-04 13:18:37 -05:00
bf30d1d3ce Update license headers for nvault module. 2014-08-04 13:18:36 -05:00
1fc2e8cc6f Update license headers for ns module. 2014-08-04 13:18:35 -05:00
4be6ca834a Update license headers for mysql module. 2014-08-04 13:18:35 -05:00
7274beebed Update license headers for hamsandwich module. 2014-08-04 13:18:34 -05:00
b7c205baf0 Update license headers for geoip module. 2014-08-04 13:18:33 -05:00
c41219ae79 Update license headers for fun module. 2014-08-04 13:18:32 -05:00
96a8fc5700 Update license headers for fakemeta module. 2014-08-04 13:18:31 -05:00
caf0dbb341 Update license headers for engine module. 2014-08-04 13:18:31 -05:00
82784a6169 Update license headers for dod modules. 2014-08-04 13:18:30 -05:00
b6103a1916 Update license headers for cstrike modules. 2014-08-04 13:18:29 -05:00
1cff91ced5 Update license headers for compiler. 2014-08-04 13:18:28 -05:00
1bb54f839e Update license headers for AMXX core. 2014-08-04 13:18:19 -05:00
63cf35b904 hlsdk_const: Fix up headings for proper display in api reference 2014-08-04 19:55:45 +02:00
bc3808cb3f ham_const: Fix up headings for proper display in api reference 2014-08-04 19:39:40 +02:00
b5aef1856d amxmodx: Third batch of documentation updates 2014-08-04 19:24:36 +02:00
f134ff9fdf amxmodx: Second batch of documentation updates 2014-08-04 16:29:01 +02:00
c9316542be amxconst: Grant @xPaw his beloved tabs 2014-08-04 02:32:12 +02:00
8ba288cfb1 amxmodx: First batch of documentation updates 2014-08-04 00:48:37 +02:00
9544364116 amxconst: Purge tabs 2014-08-04 00:35:52 +02:00
79f15d5621 amxconst: Fix up the headings some more and move long descriptions to @note 2014-08-04 00:30:49 +02:00
45ea164270 Add licenses for GPLv2 and GPLv3. 2014-08-03 17:25:18 -05:00
82371fea3b Add new GPLv3 license text and acknowledgements. 2014-08-03 17:24:27 -05:00
69fc7eeabe Merge pull request #100 from xPaw/xs
Remove XS__LIBRELEASE and tabs so docgen can catch the stocks
2014-08-03 22:25:42 +02:00
c219878ac2 Remove XS__LIBRELEASE and tabs so docgen can catch the stocks 2014-08-03 22:26:54 +03:00
5aef27a3ab amxconst: Add proper headings for all constant types 2014-08-03 16:33:08 +02:00
26d1449ac3 Merge pull request #98 from alliedmodders/vsgen
Tweak build scripts so the vs build frontend will work.
2014-08-02 22:15:24 +02:00
6bf21c5687 Tweak build scripts so the vs build frontend will work. 2014-08-02 12:29:53 -07:00
5ddd37eb77 Merge pull request #97 from Arkshine/expose-set_amxstring_utf8
Expose set_amxstring_utf8 to AMXX API
2014-08-02 21:11:23 +02:00
30b0585447 Fix missing cellstack.inc file. 2014-08-02 18:42:18 +02:00
fc48579776 Update AMXX SDK in all modules. 2014-08-02 18:30:53 +02:00
69371d6d6d Merge pull request #96 from xPaw/inc
Fix some comments
2014-08-02 18:18:27 +02:00
c068c0d0f4 Fix some comments 2014-08-02 19:12:32 +03:00
102f88674b Merge pull request #95 from Arkshine/update-project-files
Update project files.
2014-08-02 13:53:18 +02:00
3b6726e0c7 Update project files. 2014-08-02 13:51:17 +02:00
f43570c964 Fix typo and remove unecessary line. 2014-08-02 13:45:31 +02:00
b5fe5d29c9 Add MF_SetAmxStringUTF8Char and MF_SetAmxStringUTF8Cell. 2014-08-02 13:42:14 +02:00
3ac76914bd Merge pull request #94 from Arkshine/adt-stack
Introduce API to create Stack structures
2014-08-01 23:49:56 +02:00
c3c5149fa0 Add new line at the end of file. 2014-08-01 23:20:29 +02:00
e7b7506efa Introduce API to create Stack structures 2014-08-01 23:14:44 +02:00
0bfcaa85b6 Merge pull request #93 from Arkshine/atcprintf-new-parameters
Add new special format specifiers.
2014-08-01 22:34:57 +02:00
4ab559ceef Fix various issues. 2014-08-01 22:08:45 +02:00
5689be448c Merge pull request #35 from Freeman-AM/master
hlsdk_const.inc : Add iuser1 constants
2014-08-01 19:12:16 +02:00
7aa895089a hlsdk_const.inc : modification of constants description. 2014-08-01 19:09:47 +02:00
bbc83291ef Add new format parameters. 2014-08-01 18:55:07 +02:00
5ef5f4b41f hlsdk_const.inc : modification of constants description. 2014-08-01 18:53:19 +02:00
600e5dce97 hlsdk_const.inc : modification of constants description. 2014-08-01 18:18:56 +02:00
47dc226393 Merge pull request #76 from Arkshine/improve-cellarray
Update dynamic Array.
2014-08-01 18:03:53 +02:00
eabafd4eed Fix typo, documention and others issues. 2014-08-01 09:21:26 +02:00
f5164a9c02 Update statsx.txt 2014-08-01 12:25:36 +08:00
fc560a79d9 Add the SourceMod API doc generator. 2014-07-31 10:22:04 -07:00
c255191a2a Merge pull request #91 from skyrim/bug/possible-buffer-overflow
Fix of a possible buffer overflow
2014-07-31 08:27:43 +02:00
f1b2c802e6 Fix of a possible buffer overflow 2014-07-30 22:43:26 +02:00
8f6f49c9f3 Update scrollmsg.txt 2014-07-31 00:55:54 +08:00
a397dfffb7 Update telemenu.txt 2014-07-31 00:50:09 +08:00
dc9237c1d8 Update time.txt 2014-07-31 00:49:06 +08:00
7248c5e731 Update timeleft.txt 2014-07-31 00:41:38 +08:00
4970aaf02d Update multilingual.txt 2014-07-31 00:36:12 +08:00
6da929dc95 Update miscstats.txt 2014-07-31 00:24:18 +08:00
2b1b400e37 Merge pull request #90 from Arkshine/fix-compilation
Fix compilation.
2014-07-30 10:20:28 +02:00
6040dbfbb9 Fix compilation. 2014-07-30 10:19:41 +02:00
2b93228076 Merge pull request #89 from skyrim/code/charsmax-magic-nums
Replaced sizeof(str)-1 and magic nums with charsmax
2014-07-30 10:07:07 +02:00
0de8ee48d0 Replaced sizeof(str)-1 and magic nums with charsmax 2014-07-29 16:32:32 +02:00
f1e07caca4 Fix compilation. 2014-07-29 12:22:32 +02:00
0365676262 Merge pull request #88 from xPaw/client-cmd-be-g
Remove some client_cmd
2014-07-29 12:15:20 +02:00
c084965cf1 Remove some client_cmd 2014-07-29 13:13:39 +03:00
b4365e3fb9 Merge pull request #87 from xPaw/what-is-this
Instead of assigning FCVAR_PROTECTED to cvars after startup, register cv...
2014-07-28 23:41:40 +02:00
0e0d7ec9d5 Instead of assigning FCVAR_PROTECTED to cvars after startup, register cvars with said flag 2014-07-29 00:33:08 +03:00
4c1dac3cd5 Merge pull request #86 from xPaw/amx-ban
Trim target in amx_ban to prevent bypassing equali checks
2014-07-28 23:02:25 +02:00
ab46adc91c Trim target in amx_ban to prevent bypassing equali checks 2014-07-29 00:00:07 +03:00
919af60ca9 Merge pull request #85 from xPaw/missing-tr
Add missing [tr] translations
2014-07-28 21:45:14 +02:00
437ce48f42 Add missing [tr] translations 2014-07-28 22:40:38 +03:00
16d19097c5 Merge pull request #84 from xPaw/amx-help
Replace hardcoded defines in adminhelp with cvars
2014-07-27 15:05:44 +02:00
fea209fa7f Replace hardcoded defines in adminhelp with cvars 2014-07-27 15:59:09 +03:00
580eb24546 Fix compilation warning. 2014-07-27 13:48:05 +02:00
8d719e1191 Merge pull request #83 from xPaw/leet-speek-can-go-to-hell
Remove leet speak
2014-07-27 13:09:44 +02:00
d2595b8b92 Merge pull request #31 from xPaw/burn-baby-burn
Remove compatibility stuff from the core
2014-07-27 12:07:58 +02:00
fecf24ebfd Add missing [tr] translation in time.txt 2014-07-27 13:05:06 +03:00
d65cedf8c7 Remove leet speak 2014-07-27 13:03:23 +03:00
88042ce5a9 Merge pull request #82 from xPaw/ml-plugin-update
Multilingual plugin update
2014-07-27 11:57:51 +02:00
dff6dc53f4 Use formatex and charsmax 2014-07-27 12:51:36 +03:00
87c0be470b Merge pull request #80 from xPaw/package-script
Package script fixes
2014-07-27 11:44:56 +02:00
3241e91e84 Merge pull request #81 from xPaw/messing-with-copyrights
Update copyright year
2014-07-27 11:42:08 +02:00
499b5a1ac8 Use MAX_PLAYERS 2014-07-27 12:37:58 +03:00
f2b1d26da3 Add --no-mysql to checkout-deps.sh 2014-07-27 12:31:19 +03:00
fae6c52082 Don't build mysql module with travis because every time it runs, it downloads full mysql sourcecode 2014-07-27 12:17:07 +03:00
a6f10efd03 splitext didn't work 2014-07-27 12:11:44 +03:00
5d85c0a965 Update VS references to amxmodx_version.inc 2014-07-27 11:59:49 +03:00
60b1ec222e Add extern amxmodx_language 2014-07-27 11:52:30 +03:00
c5ba642630 Change zeroes to manual in predefined version.inc 2014-07-27 11:43:50 +03:00
b4d006438c Update core to use amx_language cvar instead of vault 2014-07-27 11:42:34 +03:00
ef1e1edea5 Update copyright year 2014-07-27 11:22:40 +03:00
868be37007 Remove svn_version.inc from package script 2014-07-27 11:09:15 +03:00
57a1004c15 Replace svn_version with default amxmodx_version which should get replaced by AMBuild regardless 2014-07-27 11:07:13 +03:00
9d0ea883ff Ignore compiled plugins 2014-07-27 11:04:17 +03:00
1c32e7284b Fix package script copying wrong amxmodx_version file to include folder 2014-07-27 11:02:06 +03:00
1d17835e9a Update multilingual plugin
- User pcvars
- Remove vault usage
- Remove amx_setlang (not very useful, it's covered by the cvar now)
- Remove server language from the menu (covered by the cvar now)
- Add a cvar for previously hardcoded DISPLAY_MSG
2014-07-27 10:54:46 +03:00
c97312ba41 Merge pull request #79 from Arkshine/remove-debug
Remove old debug lines.
2014-07-26 23:19:06 +02:00
e440663ea3 Remove old debug lines. 2014-07-26 23:19:28 +02:00
a77b946ce2 Merge pull request #78 from 9iky6/patch-9
Update statsx.sma
2014-07-26 18:39:23 +02:00
aa37e7f4e8 Update statsx.sma 2014-07-26 21:30:45 +06:00
795131cd9f Update statsx.sma 2014-07-26 21:18:40 +06:00
d4cdec6f11 Update statsx.sma 2014-07-26 21:13:49 +06:00
6fbf08869c Update statsx.sma 2014-07-26 21:03:05 +06:00
279a053dbe Update statsx.sma 2014-07-26 21:01:07 +06:00
cfaf862249 Update statsx.sma 2014-07-26 20:58:30 +06:00
dae467032b Update statsx.sma 2014-07-26 20:57:23 +06:00
6ae11ed755 Update statsx.sma 2014-07-26 20:56:42 +06:00
fec17e2bf5 Update statsx.sma
Fix MAX_PLAYERS -> MaxClients
2014-07-26 20:33:07 +06:00
42fa547cb4 Improve CellArray. 2014-07-25 21:28:23 +02:00
0b7bc23a30 Merge pull request #73 from Arkshine/maxclients
Add some generic constants - part 2
2014-07-25 09:56:08 +02:00
cf93ad50fa Update menufront.txt 2014-07-21 22:28:46 +08:00
46c9535087 Update mapsmenu.txt 2014-07-21 22:24:49 +08:00
57d621ac14 Update mapsmenu.txt 2014-07-21 22:24:19 +08:00
59219d3825 Update mapchooser.txt 2014-07-21 21:41:18 +08:00
8a6f6d7e36 Update languages.txt 2014-07-21 21:37:46 +08:00
477b61c5aa Update imessage.txt 2014-07-21 21:34:02 +08:00
2930654c7d Update common.txt 2014-07-21 21:32:10 +08:00
1f98a77ba0 Update cmdmenu.txt 2014-07-21 21:26:40 +08:00
9f513a755b Update antiflood.txt 2014-07-21 21:25:13 +08:00
8c46046fdb Update adminvote.txt 2014-07-21 21:23:09 +08:00
178516ac17 Update adminslots.txt 2014-07-21 20:59:41 +08:00
6b6a7bdc2b Update adminhelp.txt 2014-07-21 20:56:19 +08:00
4346a59035 Update admincmd.txt 2014-07-21 20:50:50 +08:00
da90ed748b Update adminchat.txt 2014-07-21 02:25:38 +08:00
2fccafb3ca update admin.txt
add a chinese language
2014-07-21 01:00:25 +08:00
a2b564eaaa Fix another potantial bug. 2014-07-20 17:48:05 +02:00
0347571ee9 Fix some typos and possible bugs. 2014-07-20 17:31:43 +02:00
da63bcb24b Fix redefinition of constant. 2014-07-20 17:14:05 +02:00
1fe80667a2 Fix definitively unused variable warning. 2014-07-20 15:25:37 +02:00
ee2ae84d7a Remove MAX_PLAYERS define assocaited to get_players. 2014-07-20 15:15:45 +02:00
7b96b4df22 Remove unecessary variable. 2014-07-20 12:56:59 +02:00
07534edfcd Use the new constants in various place. 2014-07-20 12:27:02 +02:00
e84653571c Fix stupid compiler warning on unused wariable. 2014-07-20 10:27:58 +02:00
19c8b007b2 Merge pull request #72 from Arkshine/add-constants
Add some generic constants
2014-07-19 21:02:59 +02:00
ee99ee93e4 Add 👍 to MAX_PLAYERS for the sake of convenience. 2014-07-19 19:58:22 +02:00
8cef1af95d Move check out the loop. 2014-07-19 19:54:57 +02:00
2c4e99fe8d Add some generic constants to amxconst.inc file. 2014-07-19 19:46:40 +02:00
1a633ec925 🔥 Remove old file check 2014-07-19 18:19:01 +03:00
d7a74ebb94 🔥 Remove amxmod compat hack from the compiler 2014-07-19 18:12:15 +03:00
3a5cb29e67 Merge pull request #69 from Arkshine/update-regex
Update regex module
2014-07-18 18:14:56 +02:00
5aba776da5 Regex: Recompile libpcre.a with -mmacosx-version-min=10.5. 2014-07-18 18:02:13 +02:00
1c9febfd22 Regex: Fix documention. 2014-07-18 18:02:12 +02:00
b4359d0f53 Merge pull request #71 from Arkshine/fix-set_ent_rendering
Fix typo in set_ent_rendering native.
2014-07-18 17:04:54 +02:00
a078064497 Merge pull request #70 from Arkshine/bug-6171
Add entity_intersects native (bug 6171)
2014-07-18 17:04:35 +02:00
14f2a95205 Fix typo in set_ent_rendering native. 2014-07-18 16:49:39 +02:00
dbe95c849b Engine: Add entity_intersects native. 2014-07-18 16:37:32 +02:00
752f95e913 Regex: Fix plugin title. 2014-07-18 13:50:41 +02:00
ce92ef745c Regex: Fix compilation under OSX
Lib has been recompiled to target i386.
2014-07-18 13:45:29 +02:00
0ec65bef5b Regex: Fix compilation. 2014-07-18 12:42:13 +02:00
7d69a78d06 Merge pull request #68 from Arkshine/feature-improve-client-buy
Improve client buy forward
2014-07-18 10:00:10 +02:00
5eaeaa8dc1 Cstrike: Fix compilation. 2014-07-17 20:28:40 +02:00
b2bb919c83 Merge pull request #67 from Arkshine/Fix-lang
Fix some translations.
2014-07-17 16:53:24 +02:00
1262c197c4 Fix some translations. 2014-07-17 16:53:20 +02:00
face80aa3f Merge pull request #66 from patrig/patch-26
Update statscfg.txt
2014-07-17 15:35:41 +02:00
4cbb9b0e64 Merge pull request #64 from 9iky6/patch-8
Update statsx.txt
2014-07-17 15:35:16 +02:00
7a46222758 Merge pull request #58 from patrig/patch-23
Update restmenu.txt
2014-07-17 15:31:22 +02:00
8111eee1b2 Update statscfg.txt
Add Russian language ...
2014-07-17 19:27:47 +06:00
9413eba2f6 Merge pull request #61 from 9iky6/patch-5
Update adminchat.txt
2014-07-17 15:25:28 +02:00
17553c844a Merge pull request #63 from 9iky6/patch-7
Update pausecfg.txt
2014-07-17 15:24:33 +02:00
092535d653 Merge pull request #62 from 9iky6/patch-6
Update cmdmenu.txt
2014-07-17 15:23:56 +02:00
82d7d23b86 Merge pull request #60 from 9iky6/patch-4
Update admin.txt
2014-07-17 15:23:38 +02:00
62e4eb29eb Regex: Update documentation. 2014-07-17 14:58:57 +02:00
a98df451cf Update restmenu.txt
fix [ru].
2014-07-17 18:33:27 +06:00
9c84c17d5e Regex: Update regex_subtr (Increase buffer and make it UTF-8 safe) 2014-07-17 14:02:21 +02:00
939a724b1a Regex: Add regex_replace native. 2014-07-17 11:21:06 +02:00
ffb179c991 Update statsx.txt 2014-07-16 01:54:50 +06:00
d53ce41a20 Update pausecfg.txt 2014-07-16 01:52:17 +06:00
c0201a52a5 Update cmdmenu.txt 2014-07-16 01:46:31 +06:00
baef33c12d Update adminchat.txt 2014-07-16 01:37:17 +06:00
7d49398186 Update admin.txt 2014-07-16 01:35:28 +06:00
1dba9eaeb9 Merge pull request #59 from patrig/patch-24
Update pausecfg.txt
2014-07-15 18:56:43 +02:00
718e5efaf3 Merge pull request #57 from patrig/patch-22
Update admincmd.txt
2014-07-15 18:55:08 +02:00
84404ec311 Merge pull request #56 from patrig/patch-21
Update telemenu.txt
2014-07-15 18:54:40 +02:00
6d6d492c51 Merge pull request #55 from patrig/patch-20
Update time.txt
2014-07-15 18:54:33 +02:00
d0501a8314 Merge pull request #54 from patrig/patch-19
Update timeleft.txt
2014-07-15 18:54:21 +02:00
ff39293537 Merge pull request #53 from patrig/patch-18
Update scrollmsg.txt
2014-07-15 18:54:12 +02:00
e03b2f7183 Merge pull request #52 from patrig/patch-17
Update plmenu.txt
2014-07-15 18:54:01 +02:00
b1ac1453e1 Merge pull request #51 from patrig/patch-16
Update nextmap.txt
2014-07-15 18:53:52 +02:00
e71b20359c Merge pull request #50 from patrig/patch-15
Update multilingual.txt
2014-07-15 18:53:44 +02:00
42fb23d6c3 Merge pull request #49 from patrig/patch-14
Update miscstats.txt
2014-07-15 18:53:33 +02:00
9682abb095 Merge pull request #48 from patrig/patch-13
Update menufront.txt
2014-07-15 18:52:58 +02:00
d32457f9cf Merge pull request #47 from patrig/patch-12
Update mapsmenu.txt
2014-07-15 18:52:46 +02:00
69651e6ebf Merge pull request #46 from patrig/patch-11
Update mapchooser.txt
2014-07-15 18:52:29 +02:00
132a7fd0fc Merge pull request #36 from patrig/patch-1
Update admin.txt
2014-07-15 18:52:14 +02:00
14600c0980 Merge pull request #45 from patrig/patch-10
Update languages.txt
2014-07-15 18:51:59 +02:00
965f479bad Merge pull request #44 from patrig/patch-9
Update imessage.txt
2014-07-15 18:51:46 +02:00
ab12ed6275 Merge pull request #43 from patrig/patch-8
Update common.txt
2014-07-15 18:51:28 +02:00
8e0609e3ad Merge pull request #41 from patrig/patch-6
Update antiflood.txt
2014-07-15 18:51:07 +02:00
2d0479bb07 Merge pull request #42 from patrig/patch-7
Update cmdmenu.txt
2014-07-15 18:50:47 +02:00
320eede0a4 Merge pull request #40 from patrig/patch-5
Update adminvote.txt
2014-07-15 18:50:29 +02:00
f496dc5bff Merge pull request #39 from patrig/patch-4
Update adminslot.txt … …
2014-07-15 18:50:10 +02:00
f0ce4e9a67 Merge pull request #38 from patrig/patch-3
Update adminhelp.txt …
2014-07-15 18:49:55 +02:00
d31cc7adbb Update pausecfg.txt
Update restmenu.txt …

Just do later completed yet. need to run
2014-07-15 16:55:19 +06:00
091a685d75 Update restmenu.txt
Add Russian language ...
2014-07-15 16:26:39 +06:00
357258c46e Update admincmd.txt
Add Russian language ...
2014-07-15 16:14:25 +06:00
c3eef5df05 Update telemenu.txt
Add Russian language ...
2014-07-15 16:00:24 +06:00
e46b5fc132 Update time.txt
Add Russian language ... Thanks NiHiLaNTh
2014-07-15 15:57:04 +06:00
982c3ae3bd Update timeleft.txt
Add Russian language ...
2014-07-15 15:53:20 +06:00
b06baffb06 Update scrollmsg.txt
Add Russian language ...
2014-07-15 15:50:50 +06:00
9be1e63080 Update plmenu.txt
Add Russian language ...
2014-07-15 15:48:34 +06:00
e190309f4e Update nextmap.txt
Add Russian language ...
2014-07-15 15:34:39 +06:00
bf210cd080 Update multilingual.txt
Add Russian language ...
2014-07-15 15:33:37 +06:00
08968e2130 Update miscstats.txt
Add Russian language ...
2014-07-15 15:31:32 +06:00
7e29c62e18 Update menufront.txt
Add Russian language ...
2014-07-15 15:15:41 +06:00
3ffd04b12d Update mapsmenu.txt
Add Russian language ...
2014-07-15 15:11:50 +06:00
76d30f2e5b Update mapchooser.txt
Add Russian language ...
2014-07-15 15:06:09 +06:00
d196fcf32c Update languages.txt
Add Russian language ...
2014-07-15 15:01:00 +06:00
41175ce3e9 Update imessage.txt
Add Russian language ...
2014-07-15 14:56:59 +06:00
d6acb22582 Update common.txt
Add Russian language ...
2014-07-15 14:55:04 +06:00
4a7c0bb9ea Update cmdmenu.txt
Add Russian language ...
2014-07-15 14:44:20 +06:00
bb222d1f33 Update antiflood.txt
Add Russian language ...
2014-07-15 14:42:14 +06:00
ba5a0fccbf Update adminvote.txt
Add Russian language ...
2014-07-15 14:40:15 +06:00
9197fd38b1 Update adminslot.txt … …
Add Russian language ...
2014-07-15 14:16:43 +06:00
34a8576eca Update adminhelp.txt …
Add Russian language ...
2014-07-15 14:14:07 +06:00
699f324716 Update admin.txt
Add Russian language ...
2014-07-15 13:20:46 +06:00
e53c30bacf hlsdk_const.inc : Add iuser1 constants 2014-07-08 12:58:12 +02:00
287f471ac4 Regex: Remove regex_match_ex and RegexError tag, change regex_match_all to use flags and update documentation.
- regex_match_ex was kind of duplicated.
- regex_match_all uses now integer flags (header like regex_compiler_ex)
- Removed RegexError tag to allow old natives to use these constants without mismatch tag error.
- Made all error params optional
2014-07-08 00:08:35 +02:00
a44d20b26b Regex: Add regex_match_all_c and regex_match_all natives (by Nextra) 2014-07-07 20:49:38 +02:00
ee4f6b8a89 Regex: Use AMTL. 2014-07-06 12:23:22 +02:00
08475bb0cc Regex: Update documentation + add regex_match_simple stock. 2014-07-06 12:23:22 +02:00
0714354f52 Regex: Update compiled libraries and pcre.h to v8.35. 2014-07-06 12:23:22 +02:00
d4de0e6f1e Regex: Update PCRE to v8.35.
I was über lazy at first, so took libs from SM.
But actually it's quite easy to compile, so let's update to latest version \o/.
2014-07-06 12:23:21 +02:00
d1153b8049 Regex: Update pcre.h. 2014-07-05 13:51:08 +02:00
f9503cb98a Regex: Add regex_compile_ex and regex_match_ex natives.
Purpose is to use the PCRE flags and error num directly.
Harcoding flags letters is really not readable and friendly.
Also this makes error params optionnal.
2014-07-05 12:21:36 +02:00
201a3003d9 Regex: Update compiled libraries. 2014-07-05 00:32:40 +02:00
7a6e793813 Regex: Add PCRE 8.32 in tools directory. 2014-07-05 00:28:24 +02:00
c2c78f6724 Cstrike: Random cleanup. 2014-07-05 00:04:20 +02:00
7cb004c728 Cstrike: Fix forwards [un]loading at map change. 2014-07-04 23:52:47 +02:00
58774361bb Cstrike: Make sure to execute forwards on alive players. 2014-07-04 16:57:40 +02:00
6c4cb27d3e Cstrike: Implement CS_OnBuyAttempt forward. 2014-07-04 10:41:13 +02:00
0728fee706 Cstrike: Make CS_OnBuy forward more reliable - part 4
Added support for shield , which is a special case.
Moved hashmap creation to OnPluginsLoaded.
2014-07-04 00:17:55 +02:00
17f2006f38 Merge pull request #17 from Freeman-AM/master
Telemenu: Some bug fixes and small improvements
2014-07-03 23:11:21 +02:00
18b91278db Telemenu: Remove ducking feature for Natural Selection because of incompatibilities
The main reason to remove this feature and let it behave like normal in Natural Selection is the fact that, in this game, there is different classes. Humans can crouch when some (small) aliens can't and normally never get the FL_DUCKING flag.
There is a small chance to create a teleportion point ducking as human and teleport an alien who will get an unsual flag for an alien.

So to don't mess with the game, this feature is disabled.
2014-07-03 22:19:20 +02:00
884c5e9643 Cstrike: Make CS_OnBuy forward more reliable - part 3
Remove unused hooks.
2014-07-03 21:14:11 +02:00
0cf39307e0 Cstrike: Make CS_OnBuy forward more reliable - part 2
Purpose is to have the forward be called only on actual buying.
This has been requested on the forum.
2014-07-03 21:10:53 +02:00
6e50a0effd Cstrike: Make CS_OnBuy forward more reliable - part 1
Purpose is to have the forward be called only on actual buying.
This has been requested on the forum.
2014-07-03 13:40:05 +02:00
fe8e32155d Merge pull request #34 from Arkshine/move-sm_libs
Move sm_memtable.h and sm_stringhashmap.h to public directory.
2014-07-03 12:08:16 +02:00
ce75bcbf61 Move sm_memtable.h and sm_stringhashmap.h to public directory. 2014-07-03 11:51:30 +02:00
6d283a1599 Merge pull request #33 from Arkshine/sync-amtl
Sync AMTL.
2014-07-03 11:33:30 +02:00
de73007922 Sync AMTL. 2014-07-03 11:26:50 +02:00
006e6e967a Fix array size typo in timeleft.sma plugin
Reported by CryWolf through private message (thanks!).
As note, typo was inserted in last commit (3abd842).
2014-06-24 23:31:16 +02:00
63322c9f2f Merge pull request #32 from 9iky6/patch-3
Update plmenu.sma
2014-06-22 12:20:19 +02:00
c7bdddfda3 Update plmenu.sma 2014-06-22 15:59:21 +06:00
e166c37d22 Merge pull request #27 from xPaw/patch-lang
Fix some languages
2014-06-17 13:50:41 +02:00
8764321c8d Fix typos in cstrike.inc (related to #25) 2014-06-08 19:58:18 +02:00
fd144a6b5b Add missing [sr] translations, thanks Gasa 2014-06-07 22:54:43 +03:00
363f1be4a5 Add missing [ro] translations, thanks knif3vitalii 2014-06-06 18:25:21 +03:00
55cb6d4b94 Remove verbose untar from checkout-deps. 2014-06-05 13:40:04 -07:00
2e6dc308a8 🔥 Remove backwards compatible CreateMultiForwardEx 2014-06-05 23:33:45 +03:00
9b1f4e01c7 🔥 Remove backwards compatible RadiusDamage 2014-06-05 23:20:06 +03:00
2696f0af0e 🔥 Remove compatibility stuff from the core 2014-06-05 23:00:47 +03:00
9558861cb7 Merge pull request #30 from Arkshine/add-travis-ci
Add Travis CI
2014-06-05 19:45:40 +02:00
bfdf734ac1 Add Travis CI 2014-06-05 19:45:03 +02:00
d3e8b9066c Revert "Merge pull request #29 from xPaw/travis-ci"
This reverts commit 17b8858408, reversing
changes made to 0375d6469a.
2014-06-05 10:11:38 -07:00
4c473451c9 Merge pull request #28 from xPaw/remove-amxmod-compat
Remove amxmod compatability
2014-06-05 19:00:27 +02:00
e3e3d8a255 🔥 Remove NS2AMX utility backwards compatibility 2014-06-05 17:18:25 +03:00
0be46af0c6 🔥 Remove references to compat includes 2014-06-05 17:04:37 +03:00
66281d81b3 Add missing [cz] translations, thanks Backstabnoob 2014-06-05 15:43:18 +03:00
0de8abc342 Add missing [de] translation in multilingual, thanks Mordekay 2014-06-05 15:40:42 +03:00
17b8858408 Merge pull request #29 from xPaw/travis-ci
Add Travis CI
2014-06-05 12:43:26 +01:00
563e4fcdf4 Update versioning script to match SourceMod changes 2014-06-05 14:37:37 +03:00
bbd6cc7dcb Add Travis-CI 2014-06-05 14:36:27 +03:00
ae9315ad48 🔥 Remove amxmod compatability
This doesn't remove anything from the engine
2014-06-05 13:48:56 +03:00
a58c2b0f94 💄 Remove invalid token from statscfg 2014-06-05 13:22:42 +03:00
7167663160 💄 Fixed translation tokens in stats_dod
Blame whoever copypasted all strings from miscstats
2014-06-05 13:20:22 +03:00
95c2e82543 Fix some languages 2014-06-05 12:02:29 +03:00
0375d6469a Merge pull request #26 from xPaw/patch-1
Add more links to Readme
2014-06-03 11:31:25 +02:00
7b97896221 💇 2014-06-03 12:19:43 +03:00
6ea15d1765 Add more links to readme
Conveniently stolen from SM repository
2014-06-03 12:18:23 +03:00
08378eed4b Merge pull request #25 from Arkshine/feature-client_buy-forward
Implement CS_OnBuy forward + Do some clean up (bug 5906)
2014-06-03 10:20:13 +02:00
2595fbe764 Cstrike: Remove unused defines and fix typo. 2014-06-03 10:05:56 +02:00
d2f2748e9e Cstrike: Enable/Disable detours whether CS_OnBuy and CS_InternalCommand are used in plugins + Add more check for safety. 2014-06-01 22:24:52 +02:00
f1e206fde6 Cstrike: Refactor code to seperate detours for readability/maintainability + Fix OSX symbols. 2014-06-01 19:00:37 +02:00
0c1be7ca7b Merge pull request #24 from alliedmodders/hamsandwich-stkalign16
Align stack on 16 byte boundary in hamsandwich trampolines.
2014-05-31 17:19:47 -05:00
c96456503c Cstrike: Fix ResolveSymbol misuse under linux/osx. 2014-05-31 20:06:26 +02:00
423eb0499b Align stack on 16 byte boundary in hamsandwich trampolines. 2014-05-31 06:34:52 -05:00
3987085572 Combine prologue and epilogue code for void and non-void functions in hamsandwich trampolines. 2014-05-31 04:00:25 -05:00
fe52f1eeac Don't bother saving and restoring eax in hamsandwich trampolines. 2014-05-31 03:09:17 -05:00
f08a4f5a66 Cstrike: Fix typo under OSX. 2014-05-31 09:14:00 +02:00
a984c85ffc Cstrike: Define "UseBotArgs" and "BotArgs" symbols in game data file. 2014-05-30 22:53:27 +02:00
9d99863c7e Cstrike: Add CSW_SHIELDGUN constant (valid CS value) 2014-05-30 16:56:26 +02:00
f130a8ea89 Cstrike: Implement CS_OnBuy forward. 2014-05-30 16:54:36 +02:00
38e2e3e393 Cstrike: Move utility stuff in its own file. 2014-05-29 01:19:52 +02:00
e4ff6853dd Cstrike: Convert code to use CDetour and MemoryUtils. 2014-05-29 00:40:37 +02:00
d7b3b47aa4 Cstrike: Import some memory tools from SourceMod 2014-05-28 22:51:14 +02:00
1b514d6f23 Merge pull request #23 from Arkshine/fix-unicode-issuee
Fix an unicode issue with amx_SetStringOld.
2014-05-27 15:48:19 +02:00
f5a5d8f8e7 Undo last change and change cell cast to unsigned char. 2014-05-27 15:15:56 +02:00
83c2b3ef62 Merge pull request #22 from Arkshine/fix-unicode-issuee
Fix an unicode issue with amx_SetStringOld.
2014-05-27 14:38:27 +02:00
90c4fc1db1 Fix an unicode issue with amx_SetStringOld. 2014-05-27 13:49:59 +02:00
a828ee8fda Merge pull request #21 from Nextra/newmenus
Newmenus: Add menu timeouts (+ extra bugfix)
2014-05-27 12:31:30 +02:00
dc3e68c507 Newmenus: Fix typo in error message 2014-05-27 10:38:25 +02:00
a6ffae72f5 Newmenus: Add get_menu_by_id and use it everywhere 2014-05-27 10:33:53 +02:00
c91d67912b Newmenus: Update MENU_TIMEOUT doc 2014-05-27 10:32:28 +02:00
9b51137767 Update checkout-deps.sh. 2014-05-26 16:21:20 -07:00
62cf10f0c3 Cstrike: Move game datas in its own file. 2014-05-26 21:19:18 +02:00
f08e22db95 Cstrike: Rename cstrike.cpp to CstrikeNatives.cpp 2014-05-26 18:50:39 +02:00
88c489d393 Cstrike: Move AMXX API in a new file. 2014-05-26 18:08:41 +02:00
94e0021e78 Telemenu: Fix a typo error 2014-05-25 11:50:11 +02:00
1b4d0c7965 Telemenu: Remove some TAB before comments for readability 2014-05-24 18:35:06 +02:00
2ca61e2de2 Telemenu: Fix bad array usage 2014-05-24 18:30:02 +02:00
aa67fae7b9 Telemenu: Fix some bugs and add some improvements
Bugfixes
- a typo error induced by me, id instead of player
- The second teleportation way of this plugin can only be done when the menuactor is not alive.
There is no crouch in death mod or spectator mod, so i remove this useless call. (Line 134 - 139)
Improvements :
- Check mod VEC_DUCK_VIEW only one time.
- Removal of code duplication
2014-05-24 15:53:30 +02:00
4d3e219d84 Merge pull request #20 from Nextra/mexit
Newmenus: Add MEXIT_FORCE and fix possible crash
2014-05-23 13:45:23 +02:00
50fbf29b3b Newmenus: Fix unsigned underflow on "end" variable 2014-05-22 00:07:37 +02:00
ff18b03250 Newmenus: Add MEXIT_FORCE for proper exit button on non-paginated menus 2014-05-21 22:18:48 +02:00
3b87c428dc Newmenus: Add necessary API changes for newmenu timeouts 2014-05-21 19:17:04 +02:00
c8b7a09028 Newmenus: get_user_menu should also handle newmenu timeouts properly 2014-05-21 19:01:27 +02:00
fa5336cade Newmenus: Use Menu::Close everywhere 2014-05-21 18:58:51 +02:00
34337fb959 Newmenus: Add Menu::Close to remove a bunch of redundant code 2014-05-21 18:51:55 +02:00
6a4c55de7d Newmenus: Fire MENU_TIMEOUT on menuselect client command 2014-05-21 18:47:20 +02:00
2e8ce87c23 Newmenus: Add MENU_TIMEOUT status code and pass it where necessary 2014-05-21 18:45:40 +02:00
cd7cb8c1a8 Newmenus: Execute menu callback when old-style menu overwrites new menu
show_menu simply resets CPlayer::newmenu. The menu callback is never fired and the plugin never informed that the menu has been closed. This can result in leaking menu handles. Using "menuselect 10" on the client is not an appropriate solution because it is possible to construct newmenus that contain 10 valid items.
2014-05-21 18:17:09 +02:00
44b4ff6f05 Telemenu: Fix view_ofs not correctly set at teleportation 2014-05-21 00:59:48 +02:00
d3bae33c64 Telemenu: Plugin style compliancy 2014-05-19 14:03:31 +02:00
914ae9e0d1 Telemenu: Improve ducking feature
Apply ducking state on teleported player only when the teleportation point is saved by a ducking player.
This feature fix possibles errors that could happen with games that don't use crouch, like ESF, NNK...
And for game like Counter-Strike 1.6, this is more logic.
2014-05-19 13:52:21 +02:00
7ae802d736 Fix compile.sh script for OS X. 2014-05-18 20:37:44 -05:00
d83ec1810a Merge pull request #18 from alliedmodders/static-libstdcxx
Link amxxpc with static libstdc++ on Linux.
2014-05-18 19:04:43 -05:00
b3d1b49fab Telemenu: Switch format to formatex 2014-05-18 16:20:40 +02:00
a6e3b57848 Telemenu: Add charsmax in place of hardcoded buffer lengths 2014-05-18 16:11:13 +02:00
7007105150 Telemenu: Add the ability to save the view and use it during teleportation 2014-05-18 15:58:53 +02:00
9c93cd1283 Telemenu: Add the ability to teleport in crouched areas 2014-05-18 15:32:45 +02:00
d2f909981a Telemenu: Use of float version of origin natives instead of integer version 2014-05-18 15:23:40 +02:00
aa00fc6f63 Trigger build. 2014-05-17 19:22:10 -05:00
db001a6eb5 Sync changes from SourceMod's bootstrap script. 2014-05-17 16:37:12 -05:00
f69a8e66c6 Don't copy debug files into package directory.
Debugging symbols should be present in the binaries by default now.
2014-05-17 14:57:57 -05:00
072747b741 Add --symbol-files option to AMBuild configure. 2014-05-17 14:54:38 -05:00
4fa8a90787 Add build directories to gitignore. 2014-05-17 14:37:15 -05:00
c0e3509e65 Merge pull request #15 from Arkshine/fix-cs-spectator-issue
CS: Fix spectator team index not being set in specific situation
2014-05-15 16:09:09 +02:00
0edb16150a CS: Manually set SPECTATOR team index. 2014-05-15 00:01:28 +02:00
7e6812f64a Merge pull request #10 from Arkshine/client_printex
Add client_printex Stock (bug 5828)
2014-05-13 14:33:23 +02:00
1c13d0dd6b Use a more standard if conditionnal way. 2014-05-13 14:09:45 +02:00
f58faf5f2c Merge pull request #13 from Arkshine/fix-cs_set_user_team
Fix cs_set_user_team issue on spectator
2014-05-13 13:27:03 +02:00
207b9aef96 Merge pull request #14 from Arkshine/fix-missing-float-tag
Fix missing Float tag in some DoD forwards headers (bug 6121)
2014-05-13 13:26:34 +02:00
c5c2721e60 Fix missing Float tag in some DoD forwards headers. 2014-05-12 16:40:19 +02:00
db76fc7b66 Fix cs_set_user_team issue on spectator 2014-05-12 14:41:08 +02:00
c1cf9d8e67 Update .gitignore 2014-05-12 14:14:26 +02:00
5f210d3404 Append a note about usage of the new buffer size (related to ce4ef6e272) 2014-05-08 16:18:50 +02:00
24328568ed Fix typo with TrieGetArray return value in #8. 2014-05-07 10:41:55 +02:00
f5921a3535 Refactor code
It would seem I was wrong (was I drunk?). It doesn't support custom
message using formating (%s).
This simplifies things, as this stock is now meant to be used only on
predefined message.

* If not a predefined message, we redirect to client_print, as there is
more checks and can deal with ML.
* If length goes above known limits, we redirect to client_print to be
cut properly.
* Changed MSG_ONE to MSG_UNRELIABLE and MSG_ALL to MSG_BROADCAST.
* Updated documention.
2014-05-05 20:42:51 +02:00
f691d2ed79 Fix english 2014-05-05 00:59:36 +02:00
60f54ee691 Merge pull request #9 from Nextra/statsx-lang
StatsX Language/Translation Update (bug 3040)
2014-05-04 20:15:22 +02:00
db3933d150 Merge pull request #8 from Arkshine/trie-update
Trie Update
2014-05-04 20:14:10 +02:00
d0b335dc6e Add missing 'stock' keyword. 2014-05-04 18:32:15 +02:00
25f507c5e3 StatsX: Add is_user_alive check to eventSpawn 2014-05-04 17:04:01 +02:00
2fb232ee68 StatsX: Use replace_string and set task timer to 0.1 (AMXX minimum) 2014-05-04 17:03:59 +02:00
90c4eed92e StatsX: More charsmax in place of hardcoded buffer lengths 2014-05-04 17:03:58 +02:00
bf4ba091e4 StatsX: cmdReport has to use LANG_SERVER 2014-05-04 17:03:57 +02:00
c19b9d9d5d StatsX: Switch spawn detection from ResetHUD to Ham_Spawn 2014-05-04 17:03:56 +02:00
5143cada8e StatsX: Don't format roundend hudstats if we don't show them 2014-05-04 17:03:55 +02:00
f630a8afc8 StatsX: Format team score (g_sScore) on demand 2014-05-04 17:03:54 +02:00
ccd0adb84d StatsX: Actually use cached player id in end_game_stats 2014-05-04 17:03:53 +02:00
4afefa25d1 StatsX: Format roundend stats for each player individually 2014-05-04 17:03:52 +02:00
4de2bf21a3 StatsX: Remove implicit usages of global buffers for formatting 2014-05-04 17:03:51 +02:00
136309ae6f StatsX: Move hudstats formatting to own function 2014-05-04 17:03:50 +02:00
12d2e49adf StatsX: Rip out LANG_SERVER where possible (still pass 0 as id) 2014-05-04 17:03:48 +02:00
85bb592eeb StatsX: Switch cvar access to pcvars 2014-05-04 17:03:47 +02:00
164285b221 StatsX: Switch from using defines to charsmax 2014-05-04 17:03:46 +02:00
297ced77b9 StatsX: Switch format to formatex 2014-05-04 17:03:45 +02:00
3e1de6b014 Add .gitignore. 2014-05-03 17:51:07 -07:00
2a2e2e2868 Replace .hgignore with .gitignore. 2014-05-03 17:50:29 -07:00
0c1931284e Clean up include file. 2014-05-03 23:50:43 +02:00
9ac3763267 Add iterators natives 2014-05-03 23:21:56 +02:00
b6cd247d12 Add new 'replace' and 'size' paramaters in some natives.
Fix some typos
Update the test plugin
2014-05-03 22:36:40 +02:00
f3bce9ecfd Add TrieGetSize native. 2014-05-03 16:09:31 +02:00
55456eaf17 Fix format_time (returned length doesn't include null terminator, related to a86ca1491) 2014-05-03 15:41:05 +02:00
12a8864532 Remove refcounting 2014-05-03 14:28:12 +02:00
d933783629 Switch trie_natives off KTrie 2014-05-03 13:22:48 +02:00
f3aee6d766 Add AMTL files 2014-05-03 13:00:21 +02:00
3b0ce189ea Add print_radio constant (counter-strike only) 2014-05-02 19:13:38 +02:00
9a2bce66fd Add client_printex stock 2014-05-02 19:13:15 +02:00
9c191949d8 Add amxclient_cmd native (bug 5887, r=Nextra) 2014-05-02 09:16:16 +02:00
d3f22d2089 Add support for bot without "player" classname in Hamsandwich (bug 6111, r=ds) 2014-05-01 10:21:46 +02:00
6eb10a5f5a Missing modification on a86ca1491 2014-04-30 16:11:27 +02:00
Lev
75822ec227 Reset the status variable on success (bug 5994, r=arkshine) 2014-04-30 15:42:03 +02:00
ce4ef6e272 Increase get_amxstring buffer size (bug 5901, r=ds) 2014-04-30 15:22:55 +02:00
a86ca1491f Add new string natives/stocks, make some UTF-8 safe (bug 6110, r=ds) 2014-04-30 09:33:03 +02:00
0519111528 Remove debug spew. 2014-04-20 14:56:45 -05:00
2d4e3a6d25 Link amxxpc with static libstdc++ on Linux. 2014-04-20 14:52:50 -05:00
c99a518ba4 Oh come one. 2014-04-18 22:31:14 +02:00
512e3ff61c Fix some typo and fix mac. 2014-04-18 22:22:09 +02:00
3d732bbbb6 Added SQL_SetCharset native to (re)set character set (bug 5999, r=ds). 2014-04-18 22:04:32 +02:00
Lev
19e160117f Directly kick players rather than use a loopback command (bug 5946, r=arkshine) 2014-04-16 17:27:20 +02:00
f78fda6d9c Add new CellArray natives: Clone/Resize/FindString/FindValue (bug 6104, r=ds) 2014-04-15 10:34:48 +02:00
d6d4badbda Fix crash in Hamsandwich with hooked function without return (hopefully last time) 2014-04-14 13:37:09 +02:00
0f890ce7f1 Fix crash in Hamsandwich with hooked function without return. 2014-04-14 11:39:08 +02:00
e81e7bee13 Fix missing DataPacks plugin test and include file in PackageScript (thanks GuskiS) 2014-04-12 20:33:55 +02:00
b3609a23fa Add missing magic tag in include file (previous patch). For some reason my change was ignored. 2014-04-11 23:02:46 +02:00
8a1464ac41 Introduce DataPacks (bug 5885, r=ds) 2014-04-11 22:57:42 +02:00
5468e9745c Add set/show_dhudmessage (bug 5979, r=ds) 2014-04-11 21:54:24 +02:00
4cd9d1df46 Fix issue by not including port when an admin is added by IP address (bug 5978, r=arkshine) 2014-04-11 21:47:43 +02:00
f097e01c3f Fix typo in previous commit. 2014-04-10 12:55:58 +02:00
ec101fc52b Trigger a build 2014-04-09 18:33:49 +02:00
1a7daad657 Update globally Hamsandwich module (bug 5611, r=sawce) 2014-04-09 16:44:02 +02:00
9815050287 Increase var/func and input line maximum length (bug 5924, r=dvander) 2014-03-24 01:04:17 +01:00
1503a6571f Fix TFC_PC_CIVILIAN value (bug 6042, r=arkshine) 2014-03-22 16:59:15 +01:00
3501e8fa46 Fix conflict with unicode string and bcompat translation layer (bug 5944, r=dvander) 2014-03-22 15:23:55 +01:00
46fb7b310e Add amx_xvar command (bug 5896, r=arkshine) 2014-03-20 23:41:10 +01:00
64327b8ddb Fix nextmap plugin failing in game where mp_chattime cvar doesn't exist (bug 5922, r=arkshine) 2014-03-20 19:05:41 +01:00
33cdfa644e Add check for empty string in amx_chat command (bug 6017, r=arkshine) 2014-03-20 18:49:59 +01:00
5dc96ddf47 Add strtof native (bug 5909, r=Nextra) 2014-03-20 18:21:38 +01:00
f520a39c89 Add DMG_GRENADE constant (bug 6030, r=arkshine) 2014-03-20 18:14:31 +01:00
bc97cc0bfb Add missing Pawn includes in VC project file 2014-03-20 18:11:49 +01:00
79af43b861 Testing commit 2014-03-17 08:50:44 +01:00
f1883fd773 Trigger a build. 2014-03-11 22:29:30 -07:00
d77e4a1470 Fix package.pl. 2014-03-11 19:54:37 -07:00
4c2f4095d2 Update README.md 2014-02-23 13:17:57 -08:00
4a79099115 Merge pull request #6 from alliedmodders/fix-winres-rc
Change winres.h to winresrc.h.
2014-02-15 21:26:42 -08:00
11d0b204f5 Change winres.h to winresrc.h. 2014-02-15 21:13:12 -08:00
db466c56fa Update README.md 2014-02-14 09:20:46 -08:00
8a55f1db35 Update README.md 2014-02-13 23:07:04 -08:00
31654d2908 Create README.md 2014-02-13 23:06:43 -08:00
d61abc5a18 Fix Windows build. 2014-02-13 00:13:43 -08:00
4df96b097d Add env var support to AMBuildScript. 2014-02-13 00:04:52 -08:00
ea051bddfb Import the package needed for rmtree(). 2014-02-12 23:30:03 -08:00
3b2a005a92 Merge pull request #5 from alliedmodders/depscript
Add a checkout-deps.sh script.
2014-02-12 20:58:54 -08:00
fb186b6fab Add a checkout-deps.sh script. 2014-02-12 20:46:19 -08:00
f453bca1c3 Merge pull request #4 from alliedmodders/macmin_cflags
Add -mmacosx-version-min=10.5 to compiler flags on OS X (no bug, r=dvander).
2014-02-12 19:58:19 -06:00
be4d91c105 Add -mmacosx-version-min=10.5 to compiler flags on OS X. 2014-02-12 19:40:05 -06:00
60bea040d0 Merge pull request #3 from alliedmodders/egg
Fix whitespaces.
2014-02-10 23:40:09 -08:00
0f303eb999 Fix whitespaces. 2014-02-10 23:38:55 -08:00
94c864390d Quell GCC madness. 2014-02-10 00:20:00 -08:00
3772645fca Merge pull request #2 from alliedmodders/strbreak
Add new variants of strbreak, which is too broken to use (bug 6041, r=ds).
2014-02-10 00:06:06 -08:00
e2855dee7d Undo vim modelines. 2014-02-09 23:49:19 -08:00
aa46469878 Add new variants of strbreak, which is too broken to use. 2014-02-09 23:40:45 -08:00
4125796569 Remove the debug clamp. 2014-02-09 10:37:02 -08:00
44ebe2f09a Remove deps.zip since GitHub doesn't like large files.
Former-commit-id: 2536a500acb86417c73ec65249c881d8e3e695ff
2014-02-08 23:48:30 -08:00
d46d657190 Merge pull request #1 from alliedmodders/ambuild
Port AMX Mod X to AMBuild 2.

Former-commit-id: caa26e5133dc97557b7d7e111de73c1dcac7fe94
2014-02-08 22:16:32 -08:00
e56cd58d70 Update the rest of the buildbot scripts for AMBuild.
Former-commit-id: ef3e192105c8c7f3905a2ceb82df4751d51cc013
2014-02-08 21:45:40 -08:00
426771deda Switch bootstrap.pl and startbuild.pl to AMBuild.
Former-commit-id: 462765c926139c44a1c2922e0281b4653fad783a
2014-02-08 21:23:02 -08:00
f0f319a418 Add WinCSX to AMBuild scripts.
Former-commit-id: eca50829ae45c9d7bad2f0c79a95ba7a1e35c63e
2014-02-08 21:16:41 -08:00
779e064a17 Add .rc files.
Former-commit-id: 3d9c34eff669112a54d181ca3f970e2c77d31409
2014-02-08 20:53:01 -08:00
1f15fdd6cb Update versioning for AMBuild and git.
Former-commit-id: ea473061ef1f3b52716decfb4dafcfd66167730d
2014-02-08 20:37:33 -08:00
a07cf853d7 Fix a cxxflag being in cflags.
Former-commit-id: 4358bad902adba3595c856aa37b3faa6c4e1dba2
2014-02-08 16:27:02 -08:00
59c3e271db Remove all files related to SVN versioning.
Former-commit-id: 57a320bfe97fcf87cf2adc6a5ee3ae07814f798d
2014-02-08 16:26:40 -08:00
922b4802f1 Port AMBuild scripts to Windows.
Former-commit-id: 9af9b5f205cfd588a16e1164bd033c22ce2107fc
2014-02-08 16:09:29 -08:00
bd586d37e6 Add OS X support to AMBuild and 10.9 support to amxxpc.
Former-commit-id: 91779cb9414e0ade9c170752cfc313c0425c8d14
2014-02-08 15:25:57 -08:00
90b2860fd2 Get parity with makefile flags.
Former-commit-id: d1ee3b078001fc2bd5f0454cf457897cd0a0a817
2014-02-08 14:49:03 -08:00
0748a05bf0 Remove the C# builder - the last vestige of the Old Republic.
Former-commit-id: ff7277048f52b8ee658583ed7c7801204bed9493
2014-02-08 14:35:11 -08:00
8f51d87826 Get PackageScript release-equivalent on Linux.
Former-commit-id: 15cfb571fbfb37281e1465a013305ff6267b7dce
2014-02-08 14:29:15 -08:00
e57845dd50 Add the PackageScript.
Former-commit-id: 8fe47f62d5ac5426fd1b718f4339c9add70e9fa5
2014-02-08 13:46:34 -08:00
fdc804b7df Remove precompiled binaries from the plugins folder.
Former-commit-id: 4821df4aaf289b1f7d9fed0b2dfee40179d9e542
2014-02-08 12:44:35 -08:00
ad36859607 Port plugin building to AMBuild.
Former-commit-id: 9ac73de5b247da341b0b4cdf00ec3c7e0472be82
2014-02-08 12:42:00 -08:00
c4e90ce865 Initial import of AMBuild infrastructure for C++ projects.
Former-commit-id: 53baa4f8c25525674f5e71f8f6ff2663928500ab
2014-02-08 01:14:15 -08:00
bc57a4e74f Triggering a build.
Former-commit-id: 45b67bd4fcacf483065d7447a2c12e6c45806b24
2014-01-22 20:03:52 -06:00
878d68bb21 Backed out changeset: 2bc36c43b15f
Former-commit-id: 0f14674ff19adc5bd1461bc622a01c3064281026
2013-09-10 09:04:52 +02:00
dc607846a3 Trigger build to hopefully fix Linux build.
Former-commit-id: ac1a72323631568561ae192190764b0015d42ba5
2013-09-05 21:05:35 -05:00
568bec17fc Fixed building with newly updated SDK.
Former-commit-id: bf0455aea7c54493b2b921a2fef52120163e0959
2013-09-05 19:51:52 -05:00
2a458530b7 Fixed cstrike module crash on OS X (r=dvander).
Valve now compiles OS X binaries with -fvisibility=hidden, so dlsym no longer works with non-exported symbols.


Former-commit-id: f77f6430a288cbe1200bae05c64494f6a0030bc6
2013-09-03 17:56:27 -05:00
87d2a54638 Rebuilt amxjitsn object with older version of nasm to fix JIT crash on OS X (r=dvander).
Former-commit-id: 011b69169c6abe324c0c27415de5e6f174909f64
2013-09-03 17:53:42 -05:00
9971541d78 Fix linux warning to make GCC compiler happy
Former-commit-id: f23bda76a3bb25333a619e82703605ac1cc92308
2013-08-24 23:42:18 +02:00
3b6c207ea8 Move slay as last option instead of first in Slay/Slap Menu (bug 5861, r=arkshine)
Former-commit-id: 31f5fdfa9788d5ea8552e2dc101c582e7959ecc0
2013-08-24 01:14:54 +02:00
af0a1200ab Add client_print_color native (CS only) (bug 5823, r=Nextra)
Former-commit-id: 9e37c60bc543676cbd659621a129bd953fc71473
2013-08-24 01:03:13 +02:00
ab6644c874 Add client command in Misc. Stats plugin to enable/disable sounds (bug 5846, r=arkshine)
Former-commit-id: b2de28b5f32d7d2c9dc52aacc4d95a7e4b029db1
2013-08-24 00:59:57 +02:00
7f0c820566 Fix missing new line on client console message which is not truncated server-side if its length exceeds buffer size (bug 3140, r=arkshine)
Former-commit-id: 6373b0238ddda08ce1d7f9c137650120522d08ef
2013-08-24 00:58:23 +02:00
de818ab5ec Update tfcx LINUXOFFSET value (bug 5845, r=arkshine)
Former-commit-id: 0f1908fa746e11d7915c43053e628d2a29cc7be4
2013-08-24 00:56:26 +02:00
73b365e952 Fix two player transfer issues in Players Menu plugin (bug 5850, r=arkshine)
Former-commit-id: 16f9e669369e6d2b5be6a39ba56b3c8f07b5a5f2
2013-08-24 00:55:21 +02:00
Lev
d9fb9bac09 Add assign operator for floats to allow implicit int-to-float conversion (bug 3997, r=dvander)
Former-commit-id: 04b6a21f239bb9332a1410d22c8c3c45510a28b2
2013-08-24 00:42:16 +02:00
6139d52a39 Fix dictionary text files parser failing on BOM marking (bug 5858, r=Nextra)
Former-commit-id: 096464e3d5852cde0d91fe407598c970c5495dce
2013-08-16 18:50:56 +02:00
784f91e441 Add a new access level flag 'v' for temporary bans (bug 3218, r=arkshine)
Former-commit-id: d09b92cf6c3ffa6ea82b4c4b005056e7875ee80f
2013-08-16 18:49:55 +02:00
da30315556 Fix Wno-delete-non-virtual-dtor flag to be passed only for .cpp files.
Former-commit-id: 4f8b31483ddf784589bc2bd53f736772147c631d
2013-08-10 19:29:28 +02:00
419c8f6ee6 Fix client_death/damage forwards passing alive victims on ClientKill (bug 5812, r=Nextra)
Former-commit-id: 39fadf43027ccfaff20a7c671aec4f22fdf432ca
2013-08-10 19:10:54 +02:00
ddacdb0ab2 Add set_ent_rendering native (bug 5773, r=Nextra)
Former-commit-id: d322cd2e79497eae463e941973db952079219c80
2013-08-10 14:16:26 +02:00
ec644cf1a4 Fix unused but set variable compilation error under linux.
Former-commit-id: 1aa4373e3dce07d1a8331a74a557f56eca574520
2013-08-10 13:01:23 +02:00
b5572520c2 Fix uninitialized variables.
Former-commit-id: 21f39612a8f877c204c93540f0d9037047cc4da9
2013-08-10 12:26:32 +02:00
54cac3b051 Check map objectives in d4d32d912299 using the new get_map_objectives native.
Former-commit-id: 25fe31aa3450099529a955532090347f85485336
2013-08-10 12:03:08 +02:00
9e4fe0d514 Add missing stats sounds, sounds precaching and fix few bugs in miscstats plugin (bug 5810, r=arkshine)
Former-commit-id: beca0030e4636dffce77d34e18c981adef34b065
2013-08-10 11:46:02 +02:00
917c52ec96 Add ewrite_[coord_f/angle_f], write_[coord_f/angle_f] and [e]message_begin_f natives (bug 5829, r=arkshine)
Former-commit-id: 34ab529d53729009fce913582838b609077b5f37
2013-08-10 10:22:38 +02:00
86f5c9f031 Make registered server commands case-insensitive (bug 5625, r=Nextra)
Former-commit-id: 44e5f42691a0deabd3ba612d9587a1dc139f6763
2013-08-09 01:27:02 +02:00
0afe87be0a Add get_map_objectives native for CS (bug 5820, r=Nextra)
Former-commit-id: 47487a4aa7b32a5767c2a23df5ddc7e9643c3428
2013-08-08 19:11:12 +02:00
225494b559 Fix tfcstats_pause imcomplete implementation (bug 5836, r=Nextra)
Former-commit-id: ea7b0f56fd2ea2f8d59d5b30172d8d9bfe4079f9
2013-08-07 16:46:40 +02:00
dca0bbcbb1 Fix tfcstats_rankbots not working as expected when disabled (bug 3192, r=Nextra)
Former-commit-id: 2ed695c8bbb1d69dc9241af18fb0477b1f19cce8
2013-08-07 16:44:25 +02:00
7e11cb5cc1 Add has_map_ent_class native (bug 5814, r=Nextra)
Former-commit-id: bfa749105feb49cf9f9b3878dededa33ae7d699c
2013-08-07 16:40:37 +02:00
5557124f05 Add an additionnal note to reflect change in 436d02c3ec30
Former-commit-id: 3ceb00dfdd2528eb9ab544b77d629938a916e386
2013-08-05 19:12:16 +02:00
a459f578fa Set set_user_rendering default color/amount to 0 to follow game behavior (bug 5772, r=arkshine)
Former-commit-id: b9d6327829da6da96ea32a1a8bb428cb816c23f4
2013-08-05 19:00:51 +02:00
98f8602c59 Set set_hudmessage default channel to -1 to reflect auto-channeling support (bug 5771, r=arkshine)
Former-commit-id: 418023ed916ff68e77a75ea729ac456d72b97cf5
2013-08-05 18:54:19 +02:00
f3f29e4769 Fix broken admin chat access consistency and apply general optimizations in adminchat plugin (bug 5822, r=arkshine)
Former-commit-id: 99caf22f48f0da39f5cbfe04b847dfa576366f5c
2013-08-05 18:44:23 +02:00
16b2721c2a Apply general optimizations in adminslots plugin (bug 5831, r=arkshine)
Former-commit-id: 1ea1766188a73cb80a50396fb2b88e11c88bc1e1
2013-08-05 18:26:57 +02:00
2385dd3972 Remove slowhack in amx_nick command and apply general optimizations in admincmd plugin (bug 5832, r=me)
Former-commit-id: 9d85ff7b1f4c5ee9c7b13a3bc362095c002add94
2013-08-05 18:18:58 +02:00
fd47b6e0c6 Apply general optimizations in adminhelp plugin (bug 5833, r=me)
Former-commit-id: 100fff803ff2796fe0772d83d0cfb15d9b02ee3a
2013-08-05 17:44:15 +02:00
1bf18472c1 Add cellarray.inc/celltrie.inc in project Pawn Includes filter
Former-commit-id: 0122820d6f401abc6acedaa4de80d518d6c68674
2013-08-05 17:11:51 +02:00
5a6d3fde61 Add ArraySortEx/SortADTArray natives and new sort method Sort_Random (bug 5494, r=Nextra)
Former-commit-id: 1ff337d9801e2fbd9ad210bc1285d31679b3029e
2013-08-05 16:56:59 +02:00
71ac17464a Add UTF-8 support in /top15 MOTD (bug 5825, r=me)
Former-commit-id: ae91c6f5ade72b2c851eb1289423444e4a7d42e4
2013-08-03 20:35:05 +02:00
735160157c Move datastructs.cpp in Source Files filter
Former-commit-id: 84f7f744b3a4a996f766f7ecf7e14dee4624b8e0
2013-08-01 13:44:59 +02:00
4b717322d3 Fix possible out of bound error and apply general optimizations in timeleft plugin (bug 5818, r=arkshine)
Former-commit-id: 3abd8429022833f93f18d1f08abaff8204f53306
2013-08-01 00:55:44 +02:00
eb43b69e4d Add strtok2 which fixes a trim issue with strtok (bug 3993, r=arkshine)
Former-commit-id: ad9e3ad972b6f7a2e34c61d615e25de07c9acdfa
2013-07-31 23:40:49 +02:00
da6d417d5d Fix last mapcycle issue and apply general optimizations in nextmap plugin (bug 5817, r=arkshine)
Former-commit-id: 9b5c7afc0048f6fc8830bc5475cbe60d4230f7ef
2013-07-31 20:18:55 +02:00
3e1c70a887 Allow [g|s]et_pdata_cbase usage at map end whereas player's private datas are still valid (following fakemeta behavior) (bug 5787, r=me)
Former-commit-id: 30394243ff3f1cf08e1a8ebfcbf05dbea3a215b2
2013-07-31 17:54:46 +02:00
bde7b8dd7f Implement cooldown on say_team @ to prevent admin's client get overflowed if executed a couple of times (bug 5815, r=arkshine)
Former-commit-id: 7db35f0d9764430d34d53844e8f5eb0933527e16
2013-07-31 17:01:55 +02:00
096c5e7509 Comment declared modules in modules.ini as they are autoloaded as needed (bug 5816, r=arkshine)
Former-commit-id: 4b54b099454273815ff490830c72ae72940ec425
2013-07-31 16:23:25 +02:00
2854e70c94 Fix DOD grenade_throw incorrect calling behavior and wrong returned weapon IDs (bug 5785, r=arkshine)
Former-commit-id: 79252c33fb03c37a4e7ce3c7b49cd3e1618ae559
2013-07-27 23:08:33 +02:00
e4d74f199f Fix re-entrancy issue when a [generated] message is sent during register_event forward (bug 3664, r=joropito)
Former-commit-id: 163098892c0f0315ece9d89667782fd0ad53f3ca
2013-07-27 20:49:19 +02:00
2f964928ff Fix pfn_spawn metamod return to follow engine behavior (bug 5807, r=me)
Former-commit-id: efe3bda51be78618cfc758a5d75a9a4bcc49a353
2013-07-27 20:36:33 +02:00
0dd14eed43 Add ability to text formatting to set_fail_state (bug 5800, r=me)
Former-commit-id: 2af8a27164f9332e4a6178691fe11b41d2bef7d1
2013-07-27 20:33:17 +02:00
f9954e5831 Missing amxx.cfg update for CS/NS mod in 449793c3c1de
Former-commit-id: d96a6389b83a22cc2922ee3f3eb44a89e1a97a02
2013-07-20 11:39:51 +02:00
7498f84261 Fix uninitialized variable warning.
Former-commit-id: 65acac2b4fc16e1383d629b77200babe88b0556a
2013-07-04 20:36:31 +02:00
389eee472f Update Portuguese translations (bug 3236, r=me)
Former-commit-id: 1e36ba07dcb16118c461d12bbc7038e87ae229dc
2013-07-04 20:16:25 +02:00
93339d9be4 Add client_cmdStart forward (bug 5779, r=me)
Former-commit-id: 785ce1ea81567e30a729954a74ded7fdfef1ef7c
2013-07-03 01:00:52 +02:00
90e7aa65a1 Fix incorrect behavior of impulse forwards (bug 3243, r=Arkshine)
Former-commit-id: 1aae4c3ec57c61ba3f32579e236b07da54ae14bf
2013-07-03 00:19:12 +02:00
6c2655c841 Comply to AMXX style for more consistency in a4e667e91410
Former-commit-id: 6a989a1857bd8a768b1701f842840c4d16351eb1
2013-07-02 23:32:22 +02:00
1e7a4d2727 Comply to AMXX style for more consistency in 47c47df488e8
Former-commit-id: f9deb552af855345c8bd11d5eea17b0c5e9439f6
2013-07-02 23:31:27 +02:00
0ddc00727d Comply to AMXX style for more consistency in 7319646e4d61
Former-commit-id: 1722d0cb4f480be6dec4dc7355cdc580efa3ac6f
2013-07-02 23:15:55 +02:00
6912199ae0 Comply to AMXX style for more consistency in 8f3605ea03d5
Former-commit-id: 3075e0b375fcede21f2055442305d1ffdb9b64fd
2013-07-02 23:13:26 +02:00
83e70d7dd7 Add [Get|Set]ModelCollisionBox and [Get|Set]ModelBoundingBox (bug 3527, r=joropito)
Former-commit-id: 4d174007b14a9b6b8589f96a9259f3249db23799
2013-07-02 20:48:18 +02:00
c0fcf06c96 Add [get|set]_pdata_[bool|byte|short|vector|ehandle] and set_pdata_ent (bug 5770, r=joropito)
Former-commit-id: da3d13a9c027f764d0506273fca2ac71a75719c7
2013-07-02 16:05:39 +02:00
21a00e00a2 Add menu_addblank2 and menu_addtext2 to fix unexpected behavior with the original ones when slot=1 (bug 3096, r=Arkshine)
Former-commit-id: b4f84a5cee58d4a8fad716af82bca5b8aa0f5ff2
2013-07-02 14:54:07 +02:00
1026edec6c Add new register_event flags to filter humans and bots (bug 5768, r=me)
Former-commit-id: 15b0fba122d8c2ba7024b74aa07b78a877cc9d8c
2013-07-02 11:22:43 +02:00
15572e2d61 Fix server crash when nvault is writting to journal file without write permission (bug 3231, r=Arkshine)
Former-commit-id: 6ad9e6bc8cf748bb06d5618cb21741d6e79b0110
2013-07-02 10:20:21 +02:00
bf395c8ac1 Fix definitevely time drift on repeating tasks (bug 3302, r=dvander)
Former-commit-id: 28aa4dfbf7cb03a2d929423ef3c607f92a96aa75
2013-07-01 22:58:56 +02:00
e409a6cf23 Fix typo in 3bcba0ef360b
Former-commit-id: 4fcf93afb9a154cf92163cecdb3e8b7493d0aa71
2013-06-29 12:31:08 +02:00
14d986c87a Update amx_show_activity documentation in amxx.cfg (bug 5774, r=me)
Former-commit-id: 1983f452260e88fb8d5e6f201017651a4c968cf8
2013-06-28 23:46:10 +02:00
873fb6924f Add strtol native (bug 3233, r=joropito)
Former-commit-id: 9508f9f86db99e93de1819f585c741396d8e4c30
2013-06-27 18:55:19 +02:00
1000fdc902 Update Polish translations (bug 5570, r=me)
Former-commit-id: 1ded7ef6695be1f1e0f810d7ab35a46ed071e7cb
2013-06-27 18:16:20 +02:00
e3a380bbe4 Fix linux warnings (and build?)
Former-commit-id: 21906adfdf35e5deecb10eb286a5b09b706f20a4
2013-06-25 19:06:11 +02:00
89b28d5a4a Add missing Bosnian/Croatian translations in 0f878ec60a69
Former-commit-id: c343ecbe7888365fd4d6f69122c7e7336640cf8b
2013-06-25 12:08:47 +02:00
17a8e7f56e Fix user_slap/amx_slap unexpected behavior using large negative damage (bug 4975, r=joropito)
Former-commit-id: 1e4d0e216eef3d556c68eeca7362562c663e2dd1
2013-06-25 11:45:00 +02:00
38fb271c83 Fix an overflow issue with ArrayInsert[Before|After] (bug 4330, r=joropito)
Former-commit-id: ba56af8a7132de17e42412bd33c1958353711e60
2013-06-22 12:34:38 +02:00
e5864c5abf Add GetFileTime returning a file timestamp as a unix timestamp (bug 4543, r=joropito)
Former-commit-id: cf7b8645fa6a14e5be71336df4543901b2c53e0b
2013-06-21 23:09:41 +02:00
139d68700b Add Bosnian language (bug 4528, r=me)
Former-commit-id: df7c045089fdc6d73fe85728d1ea15c9e23488f9
2013-06-21 00:30:34 +02:00
57dd24a2e0 Fix incomplete implementation of csstats_pause cvar (bug 5755, r=joropito)
Former-commit-id: 4766f848641edeab86fca1d6637fc0ae09af3744
2013-06-20 17:53:59 +02:00
4cfa4fa1ca Add Croatian language (bug 4772, r=me)
Former-commit-id: 9624a8022d31d81041d9ceec920a9c34d39b7089
2013-06-20 01:58:44 +02:00
525c45e9f5 Add plugin version to debug trace information (bug 3649, r=joropito)
Former-commit-id: 9bfdce37387378597a5fe73a78dbb495d70add19
2013-06-17 17:49:20 +02:00
a1306b8d96 Fix duplicated native call (bug 5255, r=me)
Former-commit-id: ac896547f98657c240f1b44a446df26941e58f86
2013-06-17 13:39:12 +02:00
f2fd18d803 Fix incorrect spanish translation
Former-commit-id: 8a483130a52f7351808f3cfdcb4c2a0b59046004
2013-06-17 12:57:12 +02:00
6b6fe3c5d9 Add new command : amx_extendmap (bug 3068, r=sawce)
Former-commit-id: 064f10034400fe162072676f4fa362c68c8e8938
2013-06-17 12:18:11 +02:00
5cb07b900a Fix unexpected behaviors when a game menu is overlapped with custom one (bug 3199, r=me)
Former-commit-id: 96390761d3b26dd5e6329fa0e836de935b4263c4
2013-06-16 22:33:48 +02:00
d5ce84a9f5 Fix pev_blending not working with set_pev (bug 5758, r=me)
Former-commit-id: 4c3fc7eb970c57814daa6fcc1c26cabc8a02608f
2013-06-16 22:15:19 +02:00
f6ff4796b2 Fixed Linux and Mac builds.
Former-commit-id: 6f39588049f51abf92164ec7a79b0b9c0688f3c5
2013-06-16 12:55:22 -05:00
f606adfa69 Fix cs_user_spawn to properly respawn players (bug 3752, r=dvander)
Former-commit-id: 3bae515741f59ca9679cbacc1f81dce6734fa67b
2013-06-15 23:08:00 +02:00
4e81779adb Fix native_filter documentation (bug 5692, r=me)
Former-commit-id: b44616576fd47ac6742428759b73ef50d5d68f89
2013-06-15 22:37:52 +02:00
de8257d7aa Fix set_view altering pev properties instead of entity_state for rendering players (bug 5382, r=arkshine)
Former-commit-id: 89a65c6a7fc4e257580c0fcc1a759c0f5b488ae6
2013-06-15 22:02:24 +02:00
f608ae76ed Fix crash using [get|set]_usercmd (bug 5744, r=me)
Former-commit-id: 676952c02f7df7d3595a6f36bc3efbead3a40eee
2013-06-15 20:59:11 +02:00
950ef59319 Fixed crash regression in JIT compiler (r=dvander).
This regression was caused by the 16-byte stack alignment chageset: 5cb8a336b05c


Former-commit-id: 1c7d8ab157e562368d1c4e16cecd0da6f90df468
2013-05-27 03:24:15 -05:00
d010b126cd Testing commit.
Former-commit-id: 4f768ad326156840b8a6de1a610c4dd33e9a6311
2013-05-26 22:29:20 +02:00
369ed2adb7 Hopefully last build trigger.
Former-commit-id: 51f47cd70dc0d71e4dbdd4eed020fc1247ff0e69
2013-05-25 23:12:32 -05:00
2d74ae8f53 Trigger a build.
Former-commit-id: dbd5bd3f50ce453b8c0d29c30538bddb383ddecd
2013-05-25 20:42:26 -05:00
1f69ffd2bc Trigger a build.
Former-commit-id: c2c2521e59addcf1264bf1cabdca380d4bd7ada8
2013-05-25 20:35:12 -05:00
f53ab14afc Trigger a build.
Former-commit-id: f8741164c7c201f9501a6a62001d1c575a822687
2013-05-25 20:41:28 -05:00
5f4524e385 Trigger a build.
Former-commit-id: 6c1d55d357f3bc85759e9295dbdf2d7256e03923
2013-05-25 20:19:48 -05:00
5f132b0f1c Trigger a build.
Former-commit-id: 870b548ae7ccb49acd6ab9d61196b3d592927e0a
2013-05-25 20:06:24 -05:00
6d1d20cbcb Trigger a build.
Former-commit-id: 39fe66a68d3c9d734140de80f6ae46b75efa52f0
2013-05-25 19:15:55 -05:00
ba4c28ca41 Trigger a build.
Former-commit-id: 661b176f46a4f9304be43d92b147ea4a23ad7269
2013-05-25 19:10:23 -05:00
d64fa7cb7b Trigger a build.
Former-commit-id: 7e2b688c6e65a8dd9513a1c77312b2fbf34dd812
2013-05-25 18:56:59 -05:00
f6bbb15e75 Trigger a build.
Former-commit-id: 9d468c4a0b4bcd1fc41d8f407c68c8fe443d40e9
2013-05-25 18:12:32 -05:00
ec9ae29be8 Trigger a build.
Former-commit-id: 2b65f8f4b611cfca7bbb196694c12cd12f6bdc7a
2013-05-25 17:47:36 -05:00
3a65722bff Changed my handle for amxx client command.
Former-commit-id: 51b3160068ef6cbe3dd6ba6acaeacf35c333b7b6
2013-05-25 00:05:34 -05:00
c8ae274845 Hopefully triggering a build.
Former-commit-id: 57a6a70c0902685c2b5bf94ac50585e6b8dea00e
2013-05-24 23:15:30 -05:00
e54e1af413 Hopefully triggering a build.
Former-commit-id: c0064dfe38808f7c35bee013eb1099ab121ab38e
2013-05-24 23:11:23 -05:00
73ef98ca60 Hopefully triggering a build.
Former-commit-id: bb9724c4abfdf2898d3ef638ac185065638459e7
2013-05-24 22:37:45 -05:00
360477f209 Hopefully triggering a build.
Former-commit-id: f1d808cb8fd40643f58e42ba7de18fad559fbf8c
2013-05-24 22:40:31 -05:00
7e64cbf543 Updated ham sandwich offsets for TFC.
Former-commit-id: 561e9d87dfe374662c189bc76ea65bf4b40f07e7
2013-05-24 22:28:06 -05:00
2c2de2169f Updated hamsandwich offsets for DOD.
Former-commit-id: e65de8d409bbfde88cb96a8a33e658ee77a321ea
2013-03-17 04:05:41 -05:00
52178abe4d Disable Next button if license agreement is not accepted.
Former-commit-id: 05edd66a34866e57b6966f9a2591da9e83df9268
2013-02-26 02:18:48 -06:00
ad46732e12 Fixed version number.
Former-commit-id: fef9682efc6e96913d44dcc0d2c1400877907347
2013-02-24 01:31:35 -06:00
7718aac519 Re-built Pawn assembly interpreter and JIT object files.
Former-commit-id: ac5b6b15f2cb304847d39d3080ffb8a2a8926074
2013-02-24 01:04:09 -06:00
ed1d061aa4 Re-enable JIT on Mac OS X (bug 5601, r=dvander).
Former-commit-id: b220d90bb4dff8b777dbafe39b871e50b74e1d59
2013-02-24 01:03:56 -06:00
2a6486b78f Align stack on 16-byte boundary for native calls in the JIT compiler (bug 5601, r=dvander).
This alignment is needed if a native calls a library function on OS X or uses SSE instructions.


Former-commit-id: fc08daf58b480f0909b453cd3aeafc96f1304bcc
2013-02-24 01:03:55 -06:00
e5c92a2c30 Align address of asm_runJIT down to nearest page boundary instead of up for mprotect on Linux and OS X (bug 5601, r=dvander).
Former-commit-id: af6ba72b0ba1f2ac1316337a6c67f5f39996182a
2013-02-24 01:03:54 -06:00
d8ddbb0687 Align stack on 16-byte boundary for native calls in the assembly interpreter (bug 5601, r=dvander).
This alignment is needed if a native calls a library function on OS X or uses SSE instructions.


Former-commit-id: 895c8561967efe2b456ae73684431b9469e6cd37
2013-02-24 01:03:53 -06:00
e414ede098 Fixed clang warnings when neither the assembly interpreter nor JIT are enabled (bug 5601, r=dvander).
Former-commit-id: fd100b2fa78412c4698a16280dacf0bf4005b9d8
2013-02-24 00:45:53 -06:00
e3d750597a Fixed module loading on OS X (bug 5601, r=dvander).
Former-commit-id: 3d0277c1f01b71fa8401a7f815e09bebfb0f73cf
2013-02-24 00:45:53 -06:00
fe2e9dbfc2 Removed patch file that was accidentally added in a previous changeset.
Former-commit-id: e3cb306a72f6adcb57a536ac66f3ad7ebaa27443
2013-02-24 00:45:53 -06:00
13db8fdf70 Filled out the license pane.
Former-commit-id: 8368f5728b457ca3e62ad5f2d27d717e1b56c505
2013-02-23 21:54:49 -08:00
bd65a373ec Fix back button.
Former-commit-id: 3a0937a2f75c279de7c113121c098b04a59fe9d1
2013-02-19 00:30:33 -08:00
14b1716be8 Fix build.
Former-commit-id: 489c275d88f775824b39d27ee24b7ae1d168b37a
2013-02-19 00:28:48 -08:00
a73ae02b7e Switch to WPF.
Former-commit-id: e75aa871e3fecbe716c8dc49a348148d1bedf7f3
2013-02-19 00:27:10 -08:00
0ffd9caaed Initial import of C# installtool.
Former-commit-id: 072e30433709380ffcb8e9ea1d658c1ebcb99f7d
2013-02-17 01:34:05 -08:00
5c380e2310 Add AMXXStudio configs to the tree.
Former-commit-id: 2c9749232234c1b8b07c50a2359a8fd8f3842c8c
2013-02-14 23:31:42 -08:00
7e7209d29a Bump version to 1.8.3-dev.
Former-commit-id: 3dd030c4e3f53c8baf4f30e22beaba15c852804d
2013-02-14 23:30:38 -08:00
afd0acd4a7 Fix build bustage (TM).
Former-commit-id: 58d6835c1794423101e92664a8f4e36b40826638
2013-02-14 02:00:29 -08:00
07aaf3713c Fix build bustage.
Former-commit-id: 553dea80f22f664b24ca89908dca2e8c42cf37af
2013-02-14 01:57:09 -08:00
1b908eeb9e Disable JIT on Mac OS X due to crash.
Former-commit-id: bac92ddbc7c262e4a1c31cc3dfbf4763e10f3440
2013-02-14 01:52:29 -08:00
3db718799f Bump version for release.
Former-commit-id: 4e0f69d8421b4d0a421f5960ce8ff77497acfa63
2013-02-14 00:51:48 -08:00
146d77f819 Fixed Windows tsx build.
Former-commit-id: 9ffe0365415ba5cd9fdaa12782c9677f8f1ca951
2013-02-13 03:32:25 -06:00
06a9241bcf Changed my handle.
Former-commit-id: 9b29f183153a23dbf0f830cb4580dc4dd2853143
2013-02-13 03:23:27 -06:00
ce4b23b41a Fixed metamod paths in MSVC projects.
Former-commit-id: c99a90817fb726ee28783d9b1139e4d540daa9fa
2013-02-13 03:22:59 -06:00
3184d1466e Backout changeset aa745bf0c347 (bug 3302) for regression reported in bug 5552.
Former-commit-id: 0d2385b0045e46fdefee4ca2b5f6442397cfbe60
2013-02-13 01:13:18 -08:00
8793d8f8d5 Fix strfind ignoring its last parameter (bug 4070, r=dvander).
Former-commit-id: a31621dd0c08c7bbede41a06d0ebf8abab1b66a5
2013-02-13 00:54:26 -08:00
a26a98cb98 Fix incorrect result for replace_all (bug 5064, r=dvander).
Former-commit-id: e3824c4c87c43734e6c5d4831f2ca7cece0a5147
2013-02-13 00:40:57 -08:00
5e69db511c Made amxxpc_osx executable.
Former-commit-id: ea2a4889fe69274051fa71b1d94308935cdc34e4
2013-02-13 02:32:01 -06:00
468aaba79e Fix last map being duplicated for each blank line in maps file (bug 5005, r=dvander).
Former-commit-id: e0bcbaeac750a494eb700dea78dd7210783d7623
2013-02-13 00:29:54 -08:00
a3aa086375 Fix crash in EngFunc_TraceTexture (bug 4576, r=dvander).
Former-commit-id: c439946a3451dbdfafa2f542e08bc7f83d586165
2013-02-13 00:27:53 -08:00
82ad133d91 Add hamsandwich support for Adrenaile Gamer (bug 4445, r=dvander).
Former-commit-id: e08f1dfccf3b5bfb65687aee06c5d8fdbff94540
2013-02-13 00:25:48 -08:00
250cb89479 Really fixed HLSDK paths in MSVC project files.
Former-commit-id: e04d44c85196034f5deebbf3c46ecc9fc710aeed
2013-02-13 02:08:29 -06:00
121dc75451 Directly kick players rather than use a loopback command (bug 3884, r=dvander).
Former-commit-id: dfe1903ecf4faa49b83b85213aa0fbc083fbb0c2
2013-02-13 00:15:40 -08:00
69c06545ce bug 3553 follow-up fix.
Former-commit-id: 65d97fe5f5bca0c3a3ba8574f7c924d8ba7dc1cd
2013-02-13 00:09:34 -08:00
9e5b5683af Increase the capacity of speech.ini (bug 3553, r=dvander).
Former-commit-id: d10ef5e49419251d3c841148093fb3210bc6d028
2013-02-13 00:08:32 -08:00
f01357aa7a Fixed HLSDK paths in VS 2010 projects files.
Former-commit-id: 32516f18ee3b87c2030ba5fad91f0b3e7a1ec741
2013-02-13 01:22:50 -06:00
7f13ae3e4f Fixed buildbot Perl scripts for Mac OS X build (bug 5601, r=dvander).
Former-commit-id: 375e91c1d22c5cc2a9107bbc804cbc17794421d4
2013-02-13 01:22:40 -06:00
e5b990b8e0 Removed dlsym from Linux package.
Only dlsym64 is completely gone. The dlsym binary must remain to be used by the builder. It just won't appear in the Linux download pacakages anymore.


Former-commit-id: c387cdeff8270d4e2f1dab7e66173f1be76cc71f
2013-02-13 01:22:15 -06:00
99411af951 Updated installer to support new Linux metamod filename and Mac OS X binaries (bug 5601, r=dvander).
Former-commit-id: 0be36403602c16adaddc84881c9613b3f0f9c1ff
2013-02-13 01:20:11 -06:00
b318509687 Added dependencies for the Installer Delphi project.
Former-commit-id: 88173f089cfe2d6b72e987f763ff25c7038528bc
2013-02-13 01:19:36 -06:00
37f7975416 Rebuilt compiler binaries and built new binaries for OS X. 2013-02-13 01:16:41 -06:00
40c1fee55a Added support for Mac OS X and building with clang (bug 5601, r=dvander). 2013-02-13 01:14:37 -06:00
b0fe6c83e2 Fix get_team() sometimes being wrong for dead players (bug 4656, r=dvander). 2013-02-12 23:17:24 -08:00
59fc122986 Triggering build. 2013-02-12 03:38:26 -06:00
3ec6bbc2ce Triggering build. 2013-02-12 03:30:51 -06:00
a431cb420b Triggering build. 2013-02-08 04:07:52 -06:00
5a6c4ea408 Removed amxxpc64 and rebuilt amxxpc binaries. 2013-02-08 03:44:40 -06:00
7d9376a64b Remove SCASM, which was pointless and buggy bloat. 2013-02-08 00:38:35 -08:00
6e4f09366e Ditch amxxpc64. AMXX files will now only contain 32-bit code. 2013-02-08 00:35:59 -08:00
6c22cb171d Synced hamdata.ini. 2013-02-04 18:40:04 -06:00
77e900585a Backed out changeset 41ca53ad9bff 2013-02-04 18:37:37 -06:00
86bfeec554 Synced hamdata.ini 2013-02-04 18:36:18 -06:00
45343e6e27 Updated hamsandwich offsets for HL1 and CS 1.6 beta. 2013-02-04 07:31:33 -06:00
944f608f09 Fixed hamsandwich vtable patching on Linux for newer GCC binaries. 2013-02-04 07:31:32 -06:00
ad960a64e2 Fixed Linux ClientCommand detour crash in cstrike module for beta. 2013-02-02 23:41:45 -06:00
e2a687d96d removed pushbuild.txt test file 2012-07-27 14:56:48 -03:00
53e43b8f31 testing push 2012-07-27 14:45:35 -03:00
da2eb8ea66 Hopefully fixed Windows build. 2011-07-01 21:51:27 -05:00
088f109a64 Added .hgignore file. 2011-06-29 00:59:58 -05:00
9d65198786 Upgraded MSVC project files for VS 2010 and modified build tool to use them. 2011-06-29 00:50:14 -05:00
49e3b748c3 Fix time drift on repeating tasks (bug 3302, r=dvander). 2010-12-12 18:36:59 -08:00
5324c7c620 Fix TrieSetArray reading the wrong parameter (bug 3816, r=dvander). 2010-09-11 23:02:43 -05:00
26d2a4f877 Add documentation to set_view (bug 4065, r=dvander). 2010-12-12 18:24:30 -08:00
76d407b45a Fix menu_create() documentation (bug 4426, r=dvander). 2010-09-11 22:33:57 -05:00
e783c4bfcb Fixed fopen leak in mapsmenu (bug 3957, r=dvander, a=blocking). 2010-04-27 00:40:38 -07:00
afc663a51a Lowered wait time in between threaded queries (bug 3740, r=dvander). 2010-04-27 00:24:50 -07:00
cb500636cc Fixed amx_ban (bug 4159, r=dvander, a=blocking). 2010-04-27 00:21:49 -07:00
e6f4dfbfe2 Added packager. 2010-04-04 18:10:35 -07:00
1bfdda7e71 Fixed more Makefile paths. 2010-04-04 18:00:36 -07:00
330fd1c2ae Fixed Makefile paths for Metamod. 2010-04-04 17:55:37 -07:00
56b676eafb Fixed core build. 2010-04-04 17:37:05 -07:00
73e3e52057 Updated version files for HG. 2010-04-04 17:22:45 -07:00
56b53584d1 Reversed test condition for build failure. 2010-04-04 17:11:11 -07:00
f43fcd6670 Invoke builder.exe correctly. 2010-04-04 17:02:16 -07:00
5984f0d442 Turns out mono eats exit codes. AWESOME. 2010-04-04 16:58:24 -07:00
1b75b0ba92 Fixed exit code from failed builds. 2010-04-04 16:49:12 -07:00
52f5723f4e Another windows bootstrap fix. 2010-04-04 16:42:24 -07:00
eb6ab857fc Fixed bootstrapping on Windows (I hope). 2010-04-04 16:37:28 -07:00
24bfff9cf1 See if a build will run! 2010-04-04 16:32:15 -07:00
1d3f91be43 bootstrap script now builds builder tool. 2010-04-04 16:24:42 -07:00
824d9953d9 Initial import of bootstrapig for buildbot. 2010-04-04 16:07:37 -07:00
b706108ed6 Squashed commit of the following:
commit 011d9b6b07d904ad1e81ef7c747269903e2d47c4
Author: David Anderson <dvander@alliedmods.net>
Date:   Mon Jan 11 00:17:08 2010 -0600

    Initial import from Subversion (amxmodx/trunk rev 3757).
2014-02-06 23:06:54 -08:00
adab9c93a0 Removed filtering on admin vote questions (bug 3356, r=sawce). 2009-02-07 23:44:23 +00:00
0f8c61c1e1 Re-added fflush function (bug 3355, r=sawce). 2009-02-07 23:43:07 +00:00
0b4f28fecf SQL_QuoteString can now be used without a DB handle (bug 3427, r=sawce). 2009-01-08 20:02:09 +00:00
d97ab913cf Fixed zero precision bug in atcprintf (bug 3242, r=sawce). 2009-01-08 20:00:38 +00:00
2249f1e70c Gah 2008-08-20 06:08:27 +00:00
0f4ee9d91d Added some missing testsuite plugins to nsi installer file. This should hopefully be all that's missing. 2008-08-19 18:30:32 +00:00
5cc5ea4006 Added missing fakemeta_util.inc to nsi installer file 2008-08-19 18:12:05 +00:00
2145823971 Updated nsi installer file list; it was missing celltrie.inc 2008-08-19 14:34:12 +00:00
cdf3807955 Bumped version numbers. 2008-08-17 00:50:57 +00:00
10ff8c11fd Fixed another build tool regression. 2008-08-17 00:18:59 +00:00
81af863496 New compiler builds. 2008-08-17 00:14:45 +00:00
3e8c921b9f Updated compiler builds after all. 2008-08-16 23:40:53 +00:00
f201592ddb Fixed regression. I'm not making new builds though. 2008-08-16 23:32:58 +00:00
72bebf9af8 Reverted all amxxpc binaries. There was some build regression somewhere on Linux, so this had to be rolled back for now. 2008-08-16 23:29:51 +00:00
73ea754640 Fixed not building because sdk stuff was moved around. 2008-08-16 23:24:25 +00:00
ce9728af93 Fixed GeoIP not compiling on gcc 2008-08-16 23:20:07 +00:00
6486c56a15 Bumped versions. 2008-08-16 22:47:59 +00:00
1d95fb3dcd Updated build tool for compat regression in Mono. 2008-08-16 22:45:59 +00:00
c07d8f3d93 Final VS 2005 + Linux tomfoolery 2008-08-16 20:13:12 +00:00
adaf207b58 Forgot about this in my VS 2005 tirade 2008-08-16 10:19:42 +00:00
0dc6a4a5dd Whoa, amb1941: All of AMX Mod X is now officially moved over to Visual Studio 2005 (MSVC 8)
Also did the following:
* Removed -fPIC from all Linux makefiles
* AMXX build tool now also moved over to VS 2005
* AMXX build tool binary renamed from "AMXXRelease" to "builder"
* MSVC project files now can use environment variables to point to the paths of the Metamod headers and HL SDK: $(METAMOD) and $(HLSDK) respectively
2008-08-16 09:48:39 +00:00
626bfe5240 Updated GeoIP code 2008-08-16 08:24:19 +00:00
e4a3647b88 Updated GeoIP database to August 2008 2008-08-16 07:59:05 +00:00
f942a857d0 Moved sven module of out trunk for now 2008-08-16 07:46:30 +00:00
633a81f864 Fixed amb1564: amx_chat sundry details did not obey cmdaccess.ini (patch from Teyut). 2008-08-16 07:07:09 +00:00
1b5dc0d567 Added corrections in bug 1762. 2008-08-16 06:53:07 +00:00
21b8f905ae Added amb1762: Macedonian translation (thanks z3r0Lev3L). 2008-08-16 06:51:07 +00:00
36a15919ca Added amb1365: Slovak translation (thanks Centaury). 2008-08-16 06:40:49 +00:00
24ff7c3a01 Fixed amb1288: amx_banip did not show time (patch from "James") 2008-08-16 06:16:29 +00:00
7beef260f2 Fixed amb1175: new module and plugin did not get added to addon packages. 2008-08-16 05:01:32 +00:00
36db059672 Fixed amb1163: float printing broke on large values. 2008-08-16 04:56:50 +00:00
01f3d729de probable fix for RTE in tfc stats.sma: amb1642 2008-05-07 17:36:53 +00:00
0a38ef831f Fix for amb1647: brush origin retrieval was wrong 2008-05-07 05:17:21 +00:00
55d18da46c Fix for amb1648: typo in validate_menu_text 2008-05-07 04:58:32 +00:00
a7d6352a22 Fix for amb1643: TFC's stats.amxx added an option it did not support to the stats config menu 2008-05-07 04:54:08 +00:00
240c92e20f Updated all module SDKs to stop the most annoying issue ever: amxxmodule.h required size_t but did not include stddef.h
Also stopped dodfun, dodx, tfcx and tsx from loading on games other than the ones they are designed for.
2008-04-29 06:53:55 +00:00
f410ea743d Added part of amb1604: unregister_message - OH GOD I HOPE I DIDNT BREAK IT 2008-04-29 02:18:39 +00:00
9100ec753c Added amb1167: menu_addtext(menu, const text[], slot=1) 2008-04-27 19:19:53 +00:00
1d7cbd4203 Added check for mod game when a module loads: If the module has the optional function, and reports that it is not an expected game, the module will not load.
This should fix how some people seem to think the counter strike modules will work on games other than counter strike.
2008-04-27 00:07:06 +00:00
4049a0c3be Initial addition of ns_remove_upgrade (amb1635): oh god I hope this will suffice 2008-04-26 21:40:56 +00:00
86ea50dfdd amb1624: revision 3234 was accidentally undone 2008-04-26 08:18:34 +00:00
6a4318f4d1 Work around for amb1632 - can't completely fix due to float rounding issues that don't work too well with pawn's floatround 2008-04-26 07:52:59 +00:00
6d03b29963 forgot 32-on-64 support for this 2008-04-15 23:36:13 +00:00
44e078c7c0 added support for building 32-bit on 64-bit machines 2008-04-15 23:26:54 +00:00
e1dd514f15 msvc project files updated for trie_natives 2008-04-15 05:40:31 +00:00
c52943b03c oops, forgot a file i hope this broke the nightlies 2008-04-15 05:36:50 +00:00
b33d2f559b Fixed the debug builds having NDEBUG defined, causing stuff like asserts not working properly 2008-04-14 19:56:31 +00:00
53ed817183 Added amb1600: trie natives 2008-04-14 19:52:11 +00:00
683f453b6f Fixed building a 32bit binary on a 64bit machine
Added a super cool new native
2008-04-13 22:54:47 +00:00
145ff45876 Wrong language key in vote kick/ban (amb1456) 2008-04-10 06:12:35 +00:00
e3e64233ec Fix for amb1596 ; csx was allocating a buffer to small for csstats.amxx's stats[] array 2008-04-10 05:48:36 +00:00
313044fe89 Fix for amb1565 CCmdManager's gotAccess check was retardedly checking to make sure a user has all access flags instead of one of the access flags; this is inconsistent with how access is checked elsewhere 2008-04-10 05:42:06 +00:00
074fd60f3c plmenu now ignores immunity if a command is executed on self 2008-03-30 21:26:31 +00:00
b608305c79 cs and ns did not have plmenu bantimes and slapdamage amounts in their amxx.cfg
also added "0" slap damage to the default values as it was mistakingly left out
2008-03-30 21:23:01 +00:00
bbf7593e43 fix for amb1139: Menufront now follows cmdaccess.ini changes for its additions (also, pluginmenu does now too) 2008-03-30 20:51:48 +00:00
e373ee1165 Small change to previous commit, g_CaseSensitiveName[id] is cleared at the start of getAccess lookup 2008-03-30 19:38:01 +00:00
375d6aa0da Added amb1263: A new flag in users.ini, 'k' implies name/tags are case sensitive 2008-03-30 19:28:36 +00:00
4c4fde8bf3 Sort of fix for amb1293: It's a bug with HLDS's parsing of localinfo keys 2008-03-30 10:55:13 +00:00
5e9e119c76 Fix for amb1545: show_activity was ignoring the last client 2008-03-30 07:36:10 +00:00
2a383feef6 added amb1290: Invalid_Array handle in cellarray.inc 2008-03-30 07:26:59 +00:00
a726b796db cellarray test had old ArrayGetCell syntax, oops 2008-03-30 07:25:35 +00:00
9348f9931e amb1096 affected DoD, TS and TFC modules, fixed. 2008-03-23 03:45:21 +00:00
4c79232f17 Fix for amb1199 - incorrect comment for Ham_DOD_RoundRespawnEnt 2008-03-04 19:21:09 +00:00
16720a2f70 Fix for amb1343 - show_activity() had a messed up vformat() call 2008-03-04 19:18:17 +00:00
69a8a86ff6 Fix for nvault not loading on some Linux servers - nvault no longer uses exceptions, so libstdc++ is no longer needed 2008-03-04 19:06:39 +00:00
b0286c9c4d Half-fix for amb1218 - typo in ns.inc 2008-03-04 18:55:54 +00:00
660e97c764 Fix for amb1313 - @section svencoop windows should have been @section SvenCoop windows 2008-03-04 18:51:35 +00:00
df522ebe6f Woops!
Fix for amb1096 - csstats_rank mode 2 caused a server lockup.
2008-03-04 18:40:15 +00:00
be35cc9912 Fixed amb1267 - FlagManager caused a crash if the cmdaccess.ini was not writable 2008-03-04 18:02:16 +00:00
9801c4166f Fix for amb1389 - client_changeteam had a reversed syntax 2008-03-04 17:22:40 +00:00
80db0ed0b3 Fix for amb1452 - ns_give_item was giving wrong items 2008-03-04 17:19:15 +00:00
b9d98ede39 fixed amxx build 2008-01-07 18:18:52 +00:00
Zor
e6c8afa5de Removed the olddeadflag from CPlayer and moved the spawn forward into the PStatus Client Message 2007-12-28 19:13:24 +00:00
60b3f30ab3 fixed fs1315 (fread_blocks broken due to typo) 2007-12-26 15:46:06 +00:00
cfd2011e80 added two FindCloses 2007-12-16 10:00:08 +00:00
5ed4c27732 fixed amb1089 - amx_banip message printed twice 2007-11-15 18:12:25 +00:00
afd1072583 fixed amb1049 - sloppy TraceResult namings 2007-11-15 18:08:15 +00:00
64ad54aa51 fixed amb1134 - unused cvar 2007-11-15 18:06:16 +00:00
3df060cad6 fixed amb1143 - typo in SetClientKeyValue() 2007-11-15 18:05:16 +00:00
1497d58e41 removed -fno-threadsafe-statics, didn't do anything 2007-11-13 16:46:59 +00:00
fd028ca1e7 fix for amb1077 - PT_TLS bugs in glibc 2007-11-13 16:45:55 +00:00
a1d812398b fixed amb1130 2007-11-13 02:28:09 +00:00
df96a81a75 fixed code that was clearly never tested (amb1126) 2007-11-13 02:25:20 +00:00
656d30be83 fixed amb1096 2007-11-13 01:44:17 +00:00
6e8a164e67 bumped version to 1.8.1 2007-11-12 23:50:41 +00:00
521288dae0 added dlopen() failure logging to linux 2007-11-12 23:48:26 +00:00
4c464390ac fixed amb1080 - german translation typo 2007-10-30 01:59:51 +00:00
408e69c41c fixed amb1079 - threaded queries with results would crash 2007-10-30 00:09:18 +00:00
cc99d6d1fb finalized build numbers and all that other release crap 2007-10-26 02:23:21 +00:00
3030302952 updated installer file list 2007-10-26 01:58:59 +00:00
f281a24274 added pluginmenu to build 2007-10-26 01:47:40 +00:00
efbba0a909 small change to the version changer for release builds 2007-10-26 01:42:35 +00:00
3750788893 fixed amxmodx makefile 2007-10-26 01:42:12 +00:00
993b6e6c74 added 3 more spaces to version output so our version numbers look nice 2007-10-26 01:41:45 +00:00
7f51048438 fixed ns makefile 2007-10-26 01:31:28 +00:00
212697b950 whoops, that was one terrible commit. the bug is really fixed now. 2007-10-26 01:09:08 +00:00
6a567f3c77 fixed a memory corruption bug in CVector 2007-10-26 01:03:23 +00:00
36241e2905 updated revision numbers 2007-10-26 00:28:17 +00:00
b630ffe28f added amb1063 - sven coop offsets from ts2do 2007-10-26 00:16:04 +00:00
f6276db4d0 fixed amb1067 - SQL_SetAffinity crashed when targeting sqlite 2007-10-26 00:10:09 +00:00
a2e3f8682f fixed amb1069 - map prefixes still didn't work 2007-10-25 23:54:51 +00:00
dbf6143747 fixed linux build 2007-10-23 11:24:51 +00:00
4aafcc50a0 lowered thread think time from 500ms to 200ms 2007-10-22 22:21:20 +00:00
a86b1c5097 added amb281 - multiple result sets for MySQL 2007-10-22 21:31:02 +00:00
2d737970d0 small fix for amb1024 - weird plugin dir choice 2007-10-22 20:06:28 +00:00
b7f8503655 added amb844 - get_pdata_ent 2007-10-22 19:52:06 +00:00
ca3d15c27e fixed amb816 - stats comments were wrong 2007-10-22 19:40:35 +00:00
468e6fb9dd added amb909 - LoadFileForMe() 2007-10-22 19:26:45 +00:00
50bbefa3ba fixed amb1023 - register_library had an outdated comment 2007-10-22 19:00:25 +00:00
c635638fd1 implemented amb773 - now precaches sounds from speech.ini, can be disabled via compiler switch 2007-10-16 20:59:57 +00:00
b2b2c1d961 fixed a very nasty bug where the runtime stack/heap values appeared to simply be corrupted by the JIT initialization function. this probably never manifested in thiadmer's builds because the routine was broken at a higher level 2007-10-03 06:35:20 +00:00
748d000c02 fixed the other native relying on this offset as well 2007-10-03 00:54:19 +00:00
c1791361da now for the one byte fix... 2007-10-03 00:51:25 +00:00
6a483cfcae fixed amb291 issue 2007-10-03 00:50:30 +00:00
fcdd17480c fix for amb253 - database now spinlocks instead of failing to lock 2007-10-02 23:38:31 +00:00
21ad8ba71b Extension of amb29 - forgot to change the retarded pause menu 2007-09-09 03:34:52 +00:00
dd55716f15 Fix for bail breaking is_user_bot - amb914
This still doesn't cache since that proved to be buggy; this will check the flag first, and then auth second.
2007-09-06 16:37:57 +00:00
bd3b7fc70c Fix for amb895 - amx_plugins now displays properly over RCON 2007-09-03 16:39:32 +00:00
26f1c8dec7 clarified menu_create and its handler 2007-09-02 18:52:24 +00:00
a749aad1b4 - inserted a nasty backwards compatibility shim specifically for war3ft 3.0-rc. this may be extended globally if i can find a way to generalize it without breaking menu_create().
- updated comment about player_menu_info() as it was wrong.
2007-09-02 18:35:53 +00:00
58c7239b48 Fix for amb817 - dod stats heading was mislabeled 2007-09-01 16:39:01 +00:00
e616bd523e changed version number to 1.8.0 2007-08-16 21:18:56 +00:00
d163ead2ac it helps, just a bit, to actually commit the file 2007-08-16 19:09:49 +00:00
00838065ae fixed a format bug in statscfg.sma 2007-08-16 19:08:17 +00:00
8298158f08 newmenu stuff is now in its own nice callback. yay 2007-08-16 19:07:59 +00:00
824ed30872 Fix for amb790 - users.ini with spaces / tabs before a comment line were being read as an admin entry.
admin.sma now trims each line it reads.
2007-08-16 17:58:34 +00:00
2b15c30ad1 committed a bunch of phrases for statscfg, fixed a few languages missing some phrases 2007-08-16 17:47:00 +00:00
643ddc18be Removed erroneous default values for pdata string natives. 2007-08-16 17:13:07 +00:00
639db5846e workaround for msvc optimizing away stack usage on detour 2007-08-16 16:30:16 +00:00
0bb430b3eb Reverted amb149 2007-08-16 15:16:41 +00:00
550dbae0c7 fixed typos and added FindClose to search function 2007-08-12 21:24:27 +00:00
f0ee52f892 now returns error message instead of bug report when trying to install 0 files 2007-08-12 20:28:21 +00:00
84b146d74a added another check to prevent users from running it in an invalid directory 2007-08-11 14:06:03 +00:00
3f1226e504 Fixed +/- cmds not being set in the flag manager. 2007-08-11 13:38:19 +00:00
186519dc92 Fix for amb774 - is_user_bot() checked on killer twice, when one check should have been victim. 2007-08-10 14:59:05 +00:00
51ce96ac3c Fix for amb775 - clcmdmenu used a buffer that was too small to generate the command (from 64 to 512) 2007-08-10 14:55:44 +00:00
16f6048d74 updated comment so future bail doesn't ask "which one is right" 2007-08-10 07:17:40 +00:00
e2c1bad224 fixed a serious bug in the ClientCommand detour for cstrike, crashing on cl_autobuy 2007-08-10 07:12:04 +00:00
e6663991a7 All include files should be semicolon-correct now 2007-08-10 04:52:12 +00:00
62c41fbd03 Removed semi colon pragma 2007-08-10 03:41:59 +00:00
0b581b1506 fixed mysql makefile 2007-08-09 16:03:41 +00:00
76a7cafe50 Changed the new %S format option to %a to hopefully prevent some confusion. 2007-08-08 02:40:40 +00:00
12ab387be5 Implemented amb743 - plmenu for cstrike now has a to spectator option. (Requires cstrike module) 2007-08-08 02:32:53 +00:00
cfc9c1dd02 bumped installer version to 1.8 2007-08-07 21:09:30 +00:00
544d2dedef moved mkdir from amxmodx.inc to file.inc 2007-08-07 00:54:22 +00:00
1721383237 Fix for amb736 - find_entity defined twice 2007-08-05 11:23:02 +00:00
68961a91e2 Fixed amb735 - adminslots cvar comments in config files were misleading 2007-08-05 10:41:10 +00:00
435766b2ef reverted a bad change in fakenatives 2007-08-04 14:18:56 +00:00
750247e8a6 fixed a bug that broke creative natives from the last change 2007-08-04 14:17:19 +00:00
a81d6f3271 Added hamdata.ini to core config 2007-08-04 04:10:29 +00:00
cb62613501 synced language files 2007-08-04 04:10:14 +00:00
2efc82ea59 Included fakemeta_util for convenience. 2007-08-04 03:59:56 +00:00
a95658bd2d Added hamsandwich include files to back include directory 2007-08-04 03:55:42 +00:00
5f10cc1ebc added ns plmenu to build 2007-08-04 03:43:49 +00:00
226d188d19 Fix for amb257 - get_user_origin mode 4 false positives.
Most should be filtered out.
2007-08-04 03:34:34 +00:00
9e0f3f01a7 fixed ns win32 build 2007-08-04 00:02:35 +00:00
06b461acd7 fixed msvc7 project files for ns 2007-08-03 23:51:10 +00:00
ffb8fc683b Implemented amb291 - cs_{set,get}_c4_defusing() 2007-08-03 19:11:47 +00:00
aa2cac0f0c added fastdelegates, sheesh 2007-08-03 17:41:34 +00:00
2bc6d965f6 Fix for amb437
dod_set_user_kills & dod_set_user_score no longer have the dead scoreboard class side effect.

dod_set_pl_deaths comment has been updated to reflect the side effect.
2007-08-03 17:35:12 +00:00
c5e36a4e3c fixed a possible bad bug in linux builder 2007-08-03 17:31:42 +00:00
bbc6af247b fixed linux being broken 2007-08-03 17:29:59 +00:00
164780363b failed builds block again
added some redirection to windows builder
2007-08-03 17:26:57 +00:00
807e6a0f9a compression is now optional 2007-08-03 17:17:54 +00:00
605bef0482 ham sammich is now versioned properly 2007-08-03 17:01:31 +00:00
2e3c652996 added hamsammich support to build tool
added /useenv support to buildtool for win32
2007-08-03 16:48:04 +00:00
a8652dd91b updated amxxrelease build 2007-08-03 16:37:56 +00:00
2379aa3108 fixed msvc7 project files 2007-08-03 16:36:04 +00:00
ed3f5dfd4b Fixed the admins list not flushing when amx_reloadadmins is executed. 2007-08-03 16:29:53 +00:00
747d326ed5 Implemented amb216 - SQL_MakeStdTuple now has an optional timeout parameter. 2007-08-03 15:52:35 +00:00
b4ff754e29 Implemented amb340 - amx_ban / amx_banip now display reason in the show_activity blurb.
Language files need synced.
2007-08-03 15:46:50 +00:00
67ac030c56 Expanded on the info message when a admin_ban user tries to ban someone not in the cache. 2007-08-03 15:29:29 +00:00
15b62648c9 Implemented amb307 - admincmd now caches a few of the last connections.
amx_addban changed back to ADMIN_BAN.  Users without RCON access will only be able to ban those in the old connection cache.  Users with RCON access still have unrestricted access to amx_addban.

The old connection cache can be viewed with amx_last (ADMIN_BAN access required by default).
2007-08-03 15:26:22 +00:00
b09bf4c532 Work around for amb228 - amxmod_compat caused set_user_hitzones to stop functioning.
Any plugins being emulated by amxmod_compat that still use the traceline forward will still cause the issue, but if no plugins use that forward it won't interfere.

(also, plugin_flags() can now specify a plid)
2007-08-03 06:48:08 +00:00
e045e2fdb6 Fix for amb196 - amx_modules did not handle invalid modules properly. 2007-08-03 05:27:36 +00:00
36dc8da47c Removed native/module filters, oops. 2007-08-03 03:01:22 +00:00
25d95f1115 Fix for amb183 - plmenu's team menu is not compatible with natural selection. 2007-08-03 02:59:46 +00:00
e254ef6b15 Added ns_get_user_team for a replacement for get_user_team. 2007-08-03 02:57:59 +00:00
7038305812 Merged ns plugins / include files to trunk.
(ns/unstuck doesn't require engine any more)
2007-08-02 16:37:57 +00:00
c77176a4ce Re-added svn versioning to module 2007-08-02 16:33:34 +00:00
c604eefde0 Merge of rewritten NS module into trunk 2007-08-02 16:20:32 +00:00
48022d3c5c Implemented amb673 - pre-compiled regular expression support.
Also commented in the include file a bit better.
2007-08-01 17:36:10 +00:00
cf36abf7e6 Implemented amb31 - plmenu default options (for ban menu and slap menu) are configurable in a config file.
Need to include this in the mod - dependent plmenus when they are reviewed later.
2007-08-01 06:03:51 +00:00
ed84900ab6 amb467 - conmotd.txt is removed 2007-08-01 04:19:23 +00:00
83c82387e3 Changed ArrayGetCell() to return the cell value instead of byreferencing the value. 2007-07-26 16:22:29 +00:00
9ce9b142e7 Implemented amb397 - amx_add{client}menuitem now accepts filenames as well as registered plugin names
(is_plugin_loaded() now has an optional second parameter to search for filenames)
2007-07-25 18:54:32 +00:00
ced56c79b6 what the hell how did this change 2007-07-25 18:13:38 +00:00
d836aeb716 Added some defines for cmd_target's filter system (for less cryptic code)
Changed all immunity obeying commands to allow for self execution - amb633
2007-07-25 18:10:08 +00:00
7c642fbf6e final fix for amb29 - ml issues with pause/stop saving in menu.
Need to sync ml changes before can test; should be good.
2007-07-25 17:28:26 +00:00
a28a80e45f Few additions to fakemeta:
Implemented amb632 - lookup_sequence, also added set_controller (since it dealt with models).

Implemented set_pev_string, for setting with an already allocated string handle.  Also added pev_serial, to get the entity serial number.
2007-07-24 06:05:43 +00:00
2cbf7fca08 Forgot to update SVN with TS3.0 and RegisterHamFromEntity changes 2007-07-19 18:43:27 +00:00
4b02ffa920 Fix for amb519: geoip_code2 and geoip_code3 will overflow the result buffer on an unsuccessful lookup.
Added two replacement natives for those two: geoip_code2_ex and geoip_code3_ex, could not modify the old natives without breaking backwards compatibility.
2007-07-19 18:37:13 +00:00
8316318c31 Fix for amb343 - tfc_clearmodel didn't function as advertised. 2007-07-17 02:18:04 +00:00
7b6d4ce699 Fix for amb503 - csx module not setting meta result when paused. 2007-06-30 05:11:13 +00:00
6f590c85f6 fixed bug where fwrite_blocks crashed the server 2007-06-29 21:46:24 +00:00
f86dad801f compiled against latest components, updated link of mxFlatPack in .dpr, bumped version to 1.77 2007-06-28 12:23:50 +00:00
ee5dccfc0f - added ability for statscfg to use translations (amb28)
- added ML translations for new statscfg lines (amb28, from kwo)
- added miscstats/statsx support for new statscfg lines (amb28, patches from kwo)
2007-06-28 04:25:04 +00:00
16c17cff63 Undid portions of revision 3261: get_{pcvar,cvar}_num discrepancies, the added overhead just wasn't worth how stupidly rare the occurrences were. 2007-06-25 03:23:19 +00:00
ce526ac432 Fixed amb109 - mapsmenu now checks mapcyclefile cvar before reverting to mapcycle.txt 2007-06-22 18:37:38 +00:00
a3342213b5 Added amb427: Additional weapons to dod_{get,set}_user_ammo 2007-06-22 18:25:16 +00:00
ef41393bc3 Fixed amb130 - various menus did not take ADMIN_ALL / ADMIN_ADMIN into account. 2007-06-22 17:47:32 +00:00
a45d98efea Fix for amb421: get_user_weapons omitting a weapon in Day of Defeat. 2007-06-22 17:10:21 +00:00
e23f3747ba Possible fix for amb149 - register_event with "e" triggers false positives for dead players not fully in game. 2007-06-22 16:51:16 +00:00
3f268e5f2e Fixed amb69 - metamod trying to reload amxmodx on systems with poorly configured clocks. 2007-06-22 16:02:17 +00:00
b3e61b1d75 Fix for amb108 - statsx keeping port when saving stats by ip - this should still allow for old stats files to work, but there is a small chance for idiosyncrasies if there are multiple users with the same ip (but different port) saved. 2007-06-22 15:35:46 +00:00
6865b984e0 Fixed accidental reversal of think and touch virtual index under Day of Defeat. 2007-06-22 05:06:49 +00:00
7c4dccac8c Added amb30 - csstats_rankbots will stop bots from showing in /top15 2007-06-21 19:37:58 +00:00
6c0300801f Added amb32 - amxx {cvars,cmds} now takes an optional parameter to filter plugins by plugin filename 2007-06-21 15:26:02 +00:00
069c293aba Fixed amb350 - typo in traceline_set_float 2007-06-21 03:44:36 +00:00
7690f1a099 Fixed the mirror system not working. 2007-06-12 15:59:10 +00:00
add02dc55e Fixed amb365 - EF_SetSize() stock had incorrect params 2007-06-05 02:38:48 +00:00
961114c260 Fix for amb305 - tasks cause a crash on mods that do not have the standard mp_timelimit cvar. 2007-05-28 14:49:34 +00:00
ff3def3d00 Forgot to remove the MAX_MAPS define :o 2007-05-24 18:19:45 +00:00
39f759368f Added show_activity changes to mapsmenu
Made mapsmenu use cellarray natives instead of MAX_MAPS
2007-05-24 18:15:41 +00:00
4cdd43b29b Fixed accidental commit of a language file 2007-05-24 17:16:36 +00:00
0c82e09df1 Added amb42 - different amx_show_activity values. 2007-05-24 17:11:11 +00:00
1129f09660 Added the any tag fix for functions returning any: 2007-05-22 01:29:18 +00:00
079606c143 Added amb311 - mapcycle file now ignores .bsp extension 2007-05-20 15:03:26 +00:00
66feed1d2b Added charsmax() define, as a less typo-prone utility for sizeof(array)-1.
Added any: syntax to all variable args that need it, added proper {Float,_}: tags to some that didn't have it but should have.
2007-05-18 15:20:34 +00:00
65748001f0 Added FCAP_* constants 2007-05-16 16:28:44 +00:00
4504875df9 Fixed Makefile
Fixed a few forwards not having FP_DONE at the end (doh!)
2007-05-16 15:24:14 +00:00
cd023c30d9 Added GPL header to all files.
Item_CanDrop -> {CS,DOD}_Item_CanDrop

Added Ham_CS_Item_GetMaxSpeed

Reversed classname and callback parameters for RegisterHam.

Finished commenting ham_const.inc.
2007-05-16 03:57:18 +00:00
7bb562182f Changed _array_included to _cellarray_included 2007-05-14 22:11:28 +00:00
77ca104a8d Renamed array.inc to cellarray.inc so that rukia doesn't start hagging about it. 2007-05-14 22:10:13 +00:00
b660df8df6 Added {get,set}_pdata_cbase{_safe} - compliments Fakemeta's get_pdata functions, but this will set/get an offset that is a CBaseEntity.
Split constants from hamsandwich.inc into ham_const.inc.

Finished commenting native calls, need to finish the constant comments.
2007-05-13 14:01:13 +00:00
b1a086ee93 Added {get,set}_pdata_cbase{_safe} - compliments Fakemeta's get_pdata functions, but this will set/get an offset that is a CBaseEntity.
Split constants from hamsandwich.inc into ham_const.inc.

Finished commenting native calls, need to finish the constant comments.
2007-05-13 13:59:54 +00:00
504ddb4c2f Expanded ESF entries (they had the Linux binary in a retarded location).
Added vanilla HLDM support.

Fixed a weird crash when compiled in release build for Linux.

Expanded HamFilter error messages a tad.
2007-05-12 17:33:58 +00:00
d38d2f56e1 Fixed large return values (Vectors) in MSVC. 2007-05-12 13:16:05 +00:00
9b0ed67c9c Fixed vtable for TFC and NS 2007-05-11 16:54:26 +00:00
1081e84981 Disassembled the rest of the mods, all but cs are untested currently. 2007-05-11 15:02:25 +00:00
ee64440fef Removed TFC_DBGetItemName because I can't figure out the return value syntax (it doesn't sound like a useful function anyway).
Disassembled DoD for the new virtual functions.

Fixed cs weapon virtual functions.  Oops :o
2007-05-10 17:17:33 +00:00
0c56e2803e Added more virtual functions to the table, only have counter-strike disassembled currently. 2007-05-10 16:08:02 +00:00
5fc89085d6 Added the ability to change parameters on the fly.
Added GetHamReturnStatus()
2007-05-09 14:58:55 +00:00
f747acdc7c Added return type modification / retrieval.
Added HAM_{IGNORED,HANDLED,OVERRIDE,SUPERCEDE} to include file.

Added the ability to disable and re-enable hooks.
2007-05-08 17:26:51 +00:00
4e2493759e Hopefully fixed up HamExecuteB for the last time.
Fixed a small memory leak because I wasn't deleting post forwards at map change.

Hopefully fixed an erroneous display of 'stray' keys.
2007-05-07 13:51:40 +00:00
1f1ecfa590 Added module auto load to hamsammich.
Started the stupid comment crap.
2007-05-05 12:36:12 +00:00
bd2ad31f5e Fixed HamExecuteB and made its system a bit more logical. 2007-05-04 15:42:02 +00:00
fb5e7dbfdb Added unhooking of virtual tables at map change.
Removed some more debugging output.
2007-05-04 14:56:57 +00:00
0ac5ce46a7 Removed legacy code from my search to find the mystical link errors.
Removed some debug output from Trampolines.
2007-05-04 13:07:02 +00:00
1073a42409 Fixed silly link errors in MSVC 2007-05-04 13:05:09 +00:00
66d7d39bee First commit of the rewrite
Doesn't build on windows for some retarded reason
2007-05-04 12:51:13 +00:00
46bd9127fb Removing files for a r3wr1t3 2007-05-04 12:39:53 +00:00
5309189602 Implemented amb245 - precache_sound() now returns whatever the engine function returns instead of just returning 1 2007-05-04 01:38:30 +00:00
006396bc92 Apparently this was a bad idea 2007-05-04 01:17:13 +00:00
dc4c9f0258 Fixed this up or something strange like that... 2007-05-04 01:11:01 +00:00
3b737ab87b added request amb122 2007-05-03 13:27:51 +00:00
6170cbc95a implemented amb92 2007-05-02 23:11:49 +00:00
78f18de61a Fixed bug amb244 2007-05-02 02:06:07 +00:00
e34120803d Implemented request amb242: added cs_get/set_user_hostagekills() natives 2007-05-01 21:38:39 +00:00
fdb094045e Wow, nice typo DS 2007-05-01 21:27:52 +00:00
8c45216cfd Oh, forgot to reset ServerPrint 2007-04-30 18:32:40 +00:00
897ed0cb10 Implemented request amb237 - added ServerPrint to Fakemeta 2007-04-30 18:29:33 +00:00
fd8489d088 Fixed amb116 - DispatchKeyValue didn't work with worldspawn (entity 0) 2007-04-28 16:19:04 +00:00
710cd548a9 added linux support to CS_InternalCmd 2007-04-26 20:07:31 +00:00
525eb65e1c updated linux compiler builds 2007-04-26 20:04:38 +00:00
580e52bd2c CZ Bots will now follow restrictions
Fixed amb222 (rebuy could get around restrictions)
2007-04-26 19:22:23 +00:00
2f6bfca68e added CS hook to catch internal bot commands and rebuy commands for players 2007-04-26 19:21:11 +00:00
0377715cdc added CS hook to catch internal bot commands and rebuy commands for players 2007-04-26 19:18:55 +00:00
e3240214a3 Fixed some typos 2007-04-26 14:20:19 +00:00
fc2b220c38 Fixed amb230 - radius_damage didn't completely kill players on some mods 2007-04-25 18:13:16 +00:00
74c6290dc0 imessage and admin plugins compile again 2007-04-25 17:24:02 +00:00
a93ef02efa Base package builds completely again - DS can't do anything right :| 2007-04-25 16:37:13 +00:00
68d2b03e48 Added amb37, amb38, amb39 and amb205: various cstrike natives.
(Still need to test)
2007-04-25 15:40:15 +00:00
d682375d7d rewrote how new menus are detected -- menucmds are no longer used since they're idiotic anyway 2007-04-25 14:44:37 +00:00
3b80342a02 fixed windows build part 2 2007-04-25 14:15:35 +00:00
8f49cddd7d fixed windows build 2007-04-25 14:15:00 +00:00
d679885985 fixed a memory leak in SortCustom1D() 2007-04-25 14:10:47 +00:00
82c3807bd5 implemented SQL_QuoteString and SQL_QuoteStringFmt
fixed sqlx test script not working on first load
2007-04-25 13:55:56 +00:00
58ad23186b updated compiler builds 2007-04-25 13:48:31 +00:00
c957a9db0f Added SQL_QuoteString to include/tests 2007-04-25 13:45:15 +00:00
359b7e25dd added sql_rewind 2007-04-25 13:19:42 +00:00
5d6d0282b0 Fixed amb110 - socket_change() returned 1 if select() syscall returned -1 (KoST) 2007-04-24 19:17:30 +00:00
33e01af955 Fixed Windows builds of all modules - they were broken as a result of all the moves of svn_version.h *sigh* 2007-04-24 18:50:16 +00:00
0d5531a090 IMessage now supports unlimited messages and uses pcvars 2007-04-24 18:18:45 +00:00
2659c906fb Changed map list to use dynamic arrays 2007-04-24 17:41:56 +00:00
d563ecb060 Added pseudo dynamic array natives.
Changed some of the "..." tags to "any".
2007-04-24 16:38:36 +00:00
bfe1ff6e15 implemented amb27 (SQL_Rewind)
fixed builds
2007-04-24 15:46:33 +00:00
adfc2ab451 fixed mysql msvc7 build 2007-04-24 15:26:08 +00:00
ea912f794c Stole the magical any: tag from sourcemod 2007-04-24 13:36:36 +00:00
8e1f54465d Fixed amb226 - missing return after pfnClientPrintf 2007-04-20 19:02:35 +00:00
2c2259ea15 Fixed possible issue that could arise with the new newmenu last page handler :O 2007-04-20 15:47:55 +00:00
be4fdb1776 Fixed the completely börked handling of the last page with newmenus. 2007-04-20 15:27:04 +00:00
76158b031d Forgot to actually register LookupLangKey :o 2007-04-20 03:02:41 +00:00
599029b68e Fixed an issue where "exit" wasn't working properly on pages with valid next and more selections. 2007-04-20 02:59:35 +00:00
201d65749e Added LookupLangKey for the upcoming show_activity changes. 2007-04-20 02:55:59 +00:00
17d8197e72 Added amb#34 - Plugin cvar/command menus.
Still need to add ML support.
2007-04-18 15:52:03 +00:00
1ed1d0005c Added menu property to change number color 2007-04-18 04:20:48 +00:00
51f8d7f84e Added a more intuitive method for rcon-protecting cvars.
Added SQL cvars to the protected list
2007-04-17 19:03:25 +00:00
1ec4d9cc7d fixed amb18 and various associated menu re-entrancy bugs 2007-04-16 18:00:54 +00:00
b90bc3a3e4 fixed bug amb46 2007-04-16 17:11:40 +00:00
de530e2ca3 fixed amb200, added native test suite 2007-04-16 17:08:15 +00:00
5d4669d52e implemented amb17
expanded menu tests
deprecated MEXIT_NORMAL, MPROP_ORDER, MPROP_PADMENU
fixed various bugs in PagekeyToItem
2007-04-16 06:58:28 +00:00
Zor
8dc310f1bb Fixed error on compile that svn_version.h could not be found in moduleconfig.h 2007-04-15 10:26:55 +00:00
Zor
9cca961024 Fixed error with the dod_client_spawn not being called when the player spawns after a map cap and not being dead 2007-04-15 10:24:45 +00:00
7b4283bf4a Fixed amb207: Last item displayed as "10" instead of "0" on new menus. 2007-04-13 23:59:52 +00:00
1f423dc39f Fixed amb208: new menu state not being reset when item has no state callback. 2007-04-13 23:57:14 +00:00
ab6fea5767 Added amb202: csstats_rankbots in amxx.cfg
Organized comments a bit in all config files.

Added default value comments to all cvars.
2007-04-13 20:21:51 +00:00
3328b570d4 Removed accidental server debug output. 2007-04-13 18:44:39 +00:00
63427b2ad0 Added amb51 - 4 options in amx_vote
Also fixed a potential formatting issue with the vote display.
2007-04-13 18:43:36 +00:00
61052c41a1 added amb64 - amx_voteban auto detects if it should ip ban. 2007-04-13 18:17:24 +00:00
5c68df7ac7 Fixed the damn comments 2007-04-02 18:39:38 +00:00
8872d98dd6 Possible fix for amb86: "USER" key should have been "PLAYER" 2007-03-30 14:33:52 +00:00
03bae80ed2 Addendum to revision 3434; fixed for other mods, although they're not multilingual, just in-case. 2007-03-30 13:35:08 +00:00
1161b5ee7e Fix for amb91: miststats buffer was too small for some language translations.
Not sure if this affects other mods, need to look through their stats stuff.
2007-03-30 13:22:12 +00:00
b49bf1b13c Fix for amb78: get_concmdsnum result caching causing discrepencies 2007-03-30 02:13:49 +00:00
81994ecf58 Fix for access() with ADMIN_ALL
Very minor optimization for is_user_admin

(amb81)
2007-03-30 02:04:30 +00:00
4682cec1cb Documentation fix for amb120 2007-03-30 01:59:57 +00:00
b9a0ffacc4 Fix for amb118: amx_help would not output ADMIN_ADMIN commands 2007-03-30 01:52:10 +00:00
ae46e3f6ab Moved svn_version.h and svn_version.tpl out of SDK directories... 2007-03-27 16:07:28 +00:00
68beb4b1a3 Fixed some minor annoyances with dlsym
- Added missing newline character to "File not found" message
 - Now properly handles relative file paths
2007-03-21 20:24:01 +00:00
118b002ee8 Synced Module SDK files with most recent fixes
- Fixed potential issue with Meta_Query
 - Removed debug message from GiveFnptrsToDll that has been present for a long long time

Again I ask why?
2007-03-21 20:22:20 +00:00
a004e906dd Updated SQLite to 3.3.13 - why? I have no idea 2007-03-21 20:19:37 +00:00
eaa4122c5a Fixed amb107: socket_open doesn't return error by reference 2007-03-19 09:45:45 +00:00
e326ab1593 Fixed amb94 - Name length in amx_psay
I'm never trusting Brad again.
2007-03-18 12:10:36 +00:00
5252e06c2a fixed amb90 (not working in 0th slot, related to commit 2491) 2007-03-16 04:17:47 +00:00
e61809496d Updated modules.versions 2007-03-16 04:16:30 +00:00
edaf960407 Added request amb76 - hex format specifier (%x and %X) 2007-03-14 02:16:09 +00:00
e3217964c4 Fixed core MSVC8 compile :\ 2007-03-14 02:12:51 +00:00
397479cd77 Fixed amb85 - tag mismatch warning on ShowSyncHudMsg 2007-03-13 22:51:12 +00:00
d151ee0b58 Added svn:ignore property to a bunch of stuff 2007-03-13 21:26:04 +00:00
ce88004900 Tiny bit of reorganizing done to WinCSX 2007-03-13 21:10:28 +00:00
1e8d0e10e6 Fixed unused symbol warning 2007-03-13 20:34:38 +00:00
bb641688ee Oops, guess I forgot to fix this path 2007-03-13 20:22:47 +00:00
ab53914351 Massive reorganization attempt - part 2
Moved old/defunct/unofficial modules out of trunk
2007-03-13 19:45:19 +00:00
54186736c8 Massive reorganization attempt - part 1.8 2007-03-13 19:28:24 +00:00
b66fea0fbc Massive reorganization attempt - part 1.77 2007-03-13 19:22:44 +00:00
bf2c9620f3 Massive reorganization attempt - part 1.76 2007-03-13 19:19:33 +00:00
af96229d5d Massive reorganization attempt - part 1.75 2007-03-13 18:44:23 +00:00
be323039d1 Massive reorganization attempt - part 1.5 2007-03-13 11:48:53 +00:00
c71be87a3a Massive reorganization attempt - part 1
Oh dear, what has DS done now?
2007-03-13 11:46:03 +00:00
e4b01bc066 fixed various linux compiling issues... 2007-03-13 04:16:20 +00:00
3ac076e098 Hello, I might have added some SLN files for the MSVC8 projects 2007-03-13 03:11:28 +00:00
e6120fdcd6 fixed a small bug where loading under dlsym crashed
fixed line endings in vim
2007-03-13 00:42:16 +00:00
4dc4616933 added "makeopts" to win32 devenv 2007-03-13 00:29:10 +00:00
46a3929365 excluded svn_version.tpl
if a mod fails to build, it's no longer fatal
2007-03-13 00:21:35 +00:00
4597868d30 wow i forgot core's template 2007-03-12 22:45:57 +00:00
cf716c4049 added tsfun and added a --modules option to the versionchanger script 2007-03-12 22:33:43 +00:00
cc6b9d3d81 added dynamic versioning
committed .sln files to a few wayward projects
2007-03-12 22:27:27 +00:00
a34279b971 fixed a bug in the installer packager 2007-03-12 20:44:29 +00:00
5cac87c99f *sigh* This compiles again 2007-03-11 05:19:54 +00:00
309bc2dcaa Added a special comment inside in_view_cone 2007-03-11 04:55:38 +00:00
7124f8bd2c MSVC didn't like my cdecl placement :( 2007-03-10 18:16:21 +00:00
c9b19c76a5 Added a whole lot more functions that nobody will use 2007-03-10 18:05:30 +00:00
8939c3076a Continued making adding new entries easier
{hs_}register_function->ham_register(HamHook:function,...)

Added a few more hooks

Fixed a few directory errors

Updated config file
2007-03-09 18:15:09 +00:00
71065a65dd attempted merge at 1.77 back into trunk... Oh MY GOD 2007-03-09 03:04:40 +00:00
7adc49c541 changed start page back to original first page 2007-03-08 17:23:36 +00:00
baba221dd9 made my life 1,000 times easier for creating these release builds 2007-03-08 06:20:11 +00:00
829485ef2a bumped version one last time
fixed makefile for nongpl changes
2007-03-08 04:54:03 +00:00
b793b80360 fixed several FTP bugs (thanks bail!) 2007-03-07 20:38:42 +00:00
ea34c2c78a fixed a bug reported by peanut where amx_fwrite() had the wrong sizeof() type 2007-03-07 02:29:54 +00:00
722e97fef2 (hopefully) fixed bug where 0 files+dirs were detected 2007-03-05 21:37:48 +00:00
bd412d7204 Fixed bug amb70 - include files not semicolon-correct
Also, removed OLOcode from amxmisc.inc
2007-03-05 19:30:40 +00:00
39e6d958bf bumped installer version 2007-03-04 06:06:44 +00:00
bb54b37399 removed allow_nongpl, it wasn't really viable 2007-03-04 04:37:42 +00:00
88dd3b021e removed this option 2007-03-04 04:33:29 +00:00
ef4d19378d bumped more versions 2007-03-04 03:43:57 +00:00
7f1ea1490d bumped necessary module versions 2007-03-04 03:42:11 +00:00
041fb4e37f updated compiler builds 2007-03-04 01:46:38 +00:00
193e59df90 updated compiler builds 2007-03-04 01:40:40 +00:00
d4703f045d fixed a bug where '%c' did not correctly count toward the writable string length 2007-03-04 00:02:23 +00:00
109b1e45b5 added non-gpl plugin blocking (wow i can't believe it came to this) 2007-03-03 23:14:24 +00:00
1f1edef98d Merged in NS 3.2 Final offsets 2007-03-01 22:39:57 +00:00
83631e95aa fixed bug amb41 2007-02-24 21:08:00 +00:00
6eb1242600 fixed tags (amb36) 2007-02-24 20:07:21 +00:00
77e7ea161b Fixed half of amb29 - Debug plugins could not be paused/stopped
Waiting on language keys to fix the rest
2007-02-21 21:03:48 +00:00
09f271e5d0 Fixed amb35, multiple plugins loading 2007-02-21 18:42:14 +00:00
e35a8326d5 Fixed an issue where backwards amx mod compatibility layer wasn't transparent. 2007-02-20 22:25:17 +00:00
09d46aa025 Fixed native get_num_ents 2007-02-20 20:57:21 +00:00
615e097c68 Fixed am49892 - Plugin load fails going to error logs instead of normal logs 2007-02-19 08:46:43 +00:00
ade56b62e9 Fixed am50089 - unary - float operator 2007-02-19 08:11:00 +00:00
b3d7f04b5e Fixed am50530 - amx_psay output format fix 2007-02-19 07:34:38 +00:00
4f81c50a3e Fixed am50731 - compiler crash when amxmisc is included before amxmodx 2007-02-19 07:03:26 +00:00
d45c3aeb96 Fixed am51050 - "amxx {pause,unpause" had misleading output 2007-02-19 06:57:26 +00:00
fff603635a Fixed am51051 - unpause() returning true on stopped plugins 2007-02-19 06:43:52 +00:00
06f01ea7dc Wow I deleted the comment too! 2007-02-19 06:38:08 +00:00
2395abcf7e Fixed retarded typo 2007-02-19 06:37:03 +00:00
d33f9ba2d4 Fixed am51083 - Comments in amxmodx.inc 2007-02-19 06:29:02 +00:00
aec28542ac Fixed am51276 - typod "return" 2007-02-19 06:23:34 +00:00
73219c45dd Fixed bug am51368 - Unused variable 2007-02-19 06:16:56 +00:00
39d6cb7840 Fixed #error ignoring #if blocks 2007-02-16 18:49:21 +00:00
bfd4e345dd corrected a typo 2007-02-14 18:55:42 +00:00
aded0f9c1c Added request am49339 - exploding chainsaw gun 2007-02-14 05:17:57 +00:00
811265e28b made it a little safer 2007-02-12 19:35:01 +00:00
0caffa2b82 fixed bug where directories in / couldn't be detected unless your home directory was / 2007-02-12 19:32:32 +00:00
4dfb01bb1d finished ftp browser in the settings dialog (rewrote it, looks pretty nice now imo), various other changes 2007-02-12 18:21:40 +00:00
862ed243be Fixed typo (am51042) 2007-02-10 21:10:55 +00:00
39f1fa6045 Fixed unnecessary call to accessUser() (am51009) 2007-02-09 08:34:33 +00:00
f26939e2cc Fixed bug am50907 - Name and Tag admins were case sensitive 2007-02-09 07:26:37 +00:00
9d53451933 bumped version to 1.76d 2007-02-05 21:21:50 +00:00
4ae54eeb2a fixed am50849 2007-02-05 21:13:15 +00:00
d62ae07b75 Merged in changes from revision 3276 in 1.77: ES_Body was not a valid parameter for get/set_es() 2007-02-01 22:25:18 +00:00
0f22a7fa06 Added missing natives:
- take_damage
- entity_use
- get_num_ents
2007-01-31 20:20:49 +00:00
7f3c2d00ac fixed bug am50501 2007-01-28 05:01:38 +00:00
b324e8ed9d Merged revision 3260 from 1.77; Stats would not display on awkward mp_roundtime settings 2007-01-26 06:15:49 +00:00
8420823713 Merged revision 3251 from 1.77; debug commands not counted as running in amx_plugins 2007-01-26 06:12:25 +00:00
1d1b50ce0c Merged revision 3250 from 1.77; amx_addban is now ADMIN_RCON access by default 2007-01-26 06:11:00 +00:00
35fcca8a66 Merged revision 3258 from 1.77; forward_return with non-string values 2007-01-26 06:08:29 +00:00
7a01503478 Merged revision 3249 from 1.77; fixed typo in tfcconst.in (am50097) 2007-01-26 06:04:11 +00:00
dd8f138892 Back ported revision 3242 - Every include file now is const correct (am49281) 2007-01-26 05:56:10 +00:00
8341e41f04 Fixed TE_GLOWSPRITE (vittu) & TE_PLAYERSPRITES examples 2007-01-18 00:18:31 +00:00
a682ec6b7a Fixed TE_DLIGHT example Valve mistake! (P34nut) 2007-01-17 18:16:17 +00:00
451b648c7f Fixed TR_InOpen missing with *et_tr native (XxAvalanchexX) 2007-01-17 14:52:09 +00:00
2d1c43c937 Merged in changes to report 49977 2007-01-17 06:56:52 +00:00
17adb214f2 Fixed bug am49982 (wrote parameter counts) 2007-01-17 05:32:45 +00:00
3a2839c6c9 bugfix for 49698 2007-01-15 15:56:48 +00:00
f96f95c4ff translated shortcuts into english :x 2007-01-15 15:53:14 +00:00
609fdae508 Fixed native get_user_origin mode 4 2007-01-09 15:01:08 +00:00
580305ce92 fixed am49041 (hopefully) 2007-01-02 13:23:23 +00:00
cbfd12e0f1 fixed am49040 2007-01-02 13:17:33 +00:00
c5ccf7d2c8 fixed am48881 2007-01-02 13:04:56 +00:00
Zor
d1c42751cd - Fix in need of testing in regards to the TK / TA bug detected
- Created a temp pointer as the first thing to do in the CurWpn function.  This way if another message gets thrown while still in the middle of this function the global pointer to messaged player is not affected.
2006-12-29 19:25:16 +00:00
68f1ce7a52 fixed an initialization bug 2006-12-23 22:05:51 +00:00
e5b0ed3af1 fixed bug am48866 part 2 2006-12-23 19:01:11 +00:00
49e70063fa fixed bug am48866 2006-12-23 18:59:30 +00:00
7aa4cf70be removed amd64 support from installer (and yep, installer's version is already up-to-date ;] ) 2006-12-19 19:50:20 +00:00
b661873426 removed amd64 crap 2006-12-19 14:34:41 +00:00
8e290cdf31 final build info 2006-12-19 14:26:31 +00:00
42f23a832a bumped version number for plugins 2006-12-19 14:24:01 +00:00
13e619bf97 bumped versions 2006-12-19 14:18:05 +00:00
4332d6c271 fixed bug am47617 2006-12-19 14:03:02 +00:00
627b3f0f98 Fixed bug 48522 2006-12-19 12:24:36 +00:00
b7b55d060a sawce's sdk fixes 2006-12-19 11:19:45 +00:00
b110021f4f fixed bug am48308 2006-12-19 11:12:12 +00:00
96c49f4ff9 defaulted value back to 0 for backwards compat 2006-12-19 11:03:00 +00:00
f53c877670 fixed bug am27152 2006-12-19 10:57:43 +00:00
b237317e50 Fixed bug am48018 2006-12-19 10:36:26 +00:00
73b2ceb855 fixed bug am47988 2006-12-19 03:32:58 +00:00
b64fb4678d fixed issue 48202 2006-12-19 02:35:16 +00:00
d6ed1a8d8a Fixed bug am48234 2006-12-19 02:24:09 +00:00
b762174c30 fixed bug am48275 2006-12-19 02:02:49 +00:00
86838bead1 Fixed bug am48294 2006-12-19 01:58:46 +00:00
e6c15d9f05 Fixed bug am48580 2006-12-19 01:57:18 +00:00
266ed797c5 Fixed bug at48523 2006-12-18 14:33:06 +00:00
93cb2060dd fixed typo 2006-12-11 04:07:55 +00:00
0cd1782d01 fixed bug at48369 once and for all 2006-12-10 22:58:28 +00:00
75a5dadd4d small bug fix, compressed exe again :x 2006-12-10 22:37:01 +00:00
f03449acbd fixed 3rd bug at48369 2006-12-10 22:32:49 +00:00
34f127b9aa fixed 2nd bug at48369 2006-12-10 22:25:09 +00:00
0c345ceebc fixed bug at48201 2006-12-09 18:23:52 +00:00
c5dc780635 correction since commit 3164 was accidental 2006-12-06 08:46:44 +00:00
fe0e461c76 checks if the none option is the majority vote 2006-12-06 07:41:38 +00:00
935da9f0de version bump? >:o 2006-12-05 19:31:22 +00:00
36e9f29d55 2006-12-03 02:20:32 +00:00
c66c076a03 fixed bug at47865 2006-11-28 20:04:04 +00:00
4eaea443e1 who would have thought that iterators change?! 2006-11-22 07:33:54 +00:00
299f1b5f62 Fixed bug am46960 (cannot unpause through menu) 2006-11-22 06:14:10 +00:00
4e7bf7e348 ! 2006-11-22 05:39:08 +00:00
d048996b50 fixed bug am47194 (journal crash) 2006-11-22 05:30:58 +00:00
a34c8daf34 again... oops 2006-11-22 04:17:08 +00:00
6cd5a51c8e fixed issue am47452 2006-11-22 04:14:56 +00:00
5cabf748ca fixed issue am47474 2006-11-22 04:13:39 +00:00
1905ea7295 added info about console commands 2006-11-22 02:47:15 +00:00
89158f9342 Added request am47144 (register_*cmd return id) 2006-11-22 02:45:12 +00:00
db7dc509e0 Fixed another serious bug where deleting menus and not returning PLUGIN_HANDLED would cause the iterator to fail and crash 2006-11-21 23:59:21 +00:00
c15a23a2a7 fixed a serious bug where deleted forwards could be placed in the re-use cache too soon 2006-11-21 23:06:50 +00:00
3e0866e57a fixed bug am47134 2006-11-11 19:05:46 +00:00
551e5298cc fixed bug am46924 2006-11-05 18:38:09 +00:00
dfea3e8a13 corrected typo (at46807) 2006-11-03 13:27:17 +00:00
e8a30e7187 bumped version 2006-11-01 00:33:30 +00:00
8a93673276 2006-10-31 22:53:29 +00:00
ece4db4f43 oh no, new version number 2006-10-31 20:37:43 +00:00
8b8cc3dd6b Fixed bug am46630: rename_file did not have a relative location version 2006-10-31 20:18:44 +00:00
b33e76d9c4 Fixed bug am46559 2006-10-31 19:48:47 +00:00
6fb6d7d399 Fixed bug am46699 - dod stats.sma did not show multi-lingual menus correctly 2006-10-31 19:42:34 +00:00
5649a17502 fixed silly translation bug 2006-10-31 19:38:30 +00:00
5cfc2df359 fixed potential in-game bug 2006-10-31 19:36:47 +00:00
1ac390b54c Fixed version # 2006-10-31 19:31:54 +00:00
102c2b219f Fixed bug am46336 - could not compile TraceLn 2006-10-27 05:53:09 +00:00
4e1d420495 added AMX_ERR_GENERAL to the error list 2006-10-27 05:49:34 +00:00
e93e75fa39 Bumped version numbers 2006-10-27 05:47:38 +00:00
90c213bc6d fixed querying invalid players 2006-10-27 05:41:04 +00:00
6c3e7e7ee0 removed another get_players("ae") 2006-10-27 05:40:09 +00:00
8a2528108d Fixed bug am46378 2006-10-25 16:54:37 +00:00
a65d65bee4 fix for bug am46266: TFC team names not picking up 2006-10-24 22:57:19 +00:00
483403aa3a Fixed bug am46335 - text spacing not aligned in adminchat 2006-10-24 22:30:15 +00:00
2a1dbf5247 Fixed bug am46350 2006-10-24 17:13:02 +00:00
7aa687eb69 Attempted a patch for am46340 2006-10-24 17:09:28 +00:00
699cb2a6d6 fixed bug at45677 2006-10-22 19:15:36 +00:00
7b82bc7b76 several bug fixes in the auto-update system, bumped version to 1.4.3 final and improved code snippets feature (can now append or insert snippet into new line) 2006-10-22 18:56:39 +00:00
ed43b8a5ac Changed to use CreateMultiForwardEx() instead 2006-10-22 03:52:02 +00:00
d2ebca38a1 Experimental addition to CreateMultiForward() for bcompat 2006-10-22 03:49:23 +00:00
d542015214 Fixed bug am46112 2006-10-22 00:45:33 +00:00
d84c3a3798 Fixed bug am46058, unpausing stopped plugins 2006-10-21 21:48:24 +00:00
405d9ff48e bumped trunk version 2006-10-21 21:27:07 +00:00
a63c728471 added two new tests to the menu test suite 2006-10-21 21:13:57 +00:00
a60e9d205b fixed bug where blanks misaligned the item selection process 2006-10-21 21:13:39 +00:00
553a950b98 added comment :( yes we broke backwards compat 2006-10-21 20:20:44 +00:00
955e827b19 Fixed bug am45492 (stats always resetting) 2006-10-21 19:23:16 +00:00
00380cfe4c fixed a bug in get_func_id (thanks P34CH_34732) 2006-10-02 06:12:02 +00:00
12ecf026db hack for backwards compat layer (thanks suicid3) 2006-10-02 06:07:38 +00:00
3fa6cd3227 added a timeout test which does not work, thanks MySQL 2006-10-01 19:59:27 +00:00
fe1ebfe7bb fix for 45337 and some other little things 2006-10-01 19:46:56 +00:00
f3057efd7d updated the test suite 2006-10-01 18:36:15 +00:00
39d5ea94fb Added extra param to is_in_viewcone to switch between a 2D and 3D calculation
Neither is still as accurate as I want them to be though :\
2006-10-01 06:08:39 +00:00
90f11b52bc Fixed am45318 - Some wrong constants from TraceResult enum 2006-10-01 02:39:59 +00:00
9740f6469d this feature is just for sawce (updated go to line dialog) 2006-09-30 19:03:49 +00:00
461e7de151 fixed bug at45362 2006-09-30 18:49:28 +00:00
2752 changed files with 865805 additions and 317782 deletions

24
.gitattributes vendored Normal file
View File

@ -0,0 +1,24 @@
# Auto detect text files and perform LF normalization
* text=auto
# Tell GitHub that these files are SourcePawn
*.inc text linguist-language=sourcepawn
*.sma text linguist-language=sourcepawn
# Custom for Visual Studio
*.cs diff=csharp
# Sources
*.C text
*.cc text
*.cxx text
*.cpp text
*.c++ text
*.hpp text
*.h text
*.h++ text
*.hh text
# Compiled Object files
*.o binary
*.obj binary

74
.github/CONTRIBUTING.md vendored Normal file
View File

@ -0,0 +1,74 @@
# Contributing to AMX Mod X
## Issue reports
Please consider the following guidelines when reporting an issue.
#### Not for general support
This is not the right place to get help with using or installing AMX Mod X, or for issues with specific, third-party AMX Mod X plugins or extensions.
For help with AMX Mod X, please consult the [AlliedModders forums](https://forums.alliedmods.net/forumdisplay.php?f=3). Similarly, for assistance with, or to report issues with, third-party AMX Mod X plugins or extensions, you should post in the existing thread for that plugin or extension on the [AlliedModders forums](https://forums.alliedmods.net/forumdisplay.php?f=3).
#### Details, details, details
Provide as much detail as possible when reporting an issue.
For bugs or other undesired behavior, answers to the following questions are a great start:
* What is the issue?
* What behavior are you expecting instead?
* On what operating system is the game server running?
* What game is the game server running?
* What exact versions (full x.y.z.a version number) of Metamod and AMX Mod X are installed on the game server?
* What is the specific, shortest path to reproducing this issue? If this issue can be reproduced with plugin code, please try to shorten it to the minimum required to trigger the problem.
If this is a feature request, the following are helpful. Generally, not all will apply, but whatever you can answer ahead of time will shorten back and forth conversation.
* What is your end goal, or what are you trying to accomplish?
* Why is this necessary, or what benefit do you see with it?
* Will this be useful to others?
#### Issues with security implications
Please report any security bugs to [security@alliedmods.net](mailto:security@alliedmods.net) rather than to this public issue tracker.
#### We're only human
Please keep in mind that we maintain this project in our spare time, at no cost. There is no SLA, and you are not owed a response or a fix.
#### Conduct
Please refer to the [AlliedModders forum rules.](https://forums.alliedmods.net/misc.php?do=showrules)
## Pull Requests
Firstly, thank you for considering contributing changes to the project!
However, if this is anything more than a small fix such as a gamedata update, a glaring code flaw, or a simple typo in a file like this one, please file an issue first so that it can be discussed, unless you have already spoken to multiple members of the development team about it on IRC or the AlliedModders forums.
We don't like to have to reject pull requests, so we want to avoid those scenarios. We wouldn't want you to feel like you wasted your time writing something only for us to shoot it down.
#### Rejection
*Copied from Phabricator's [Contributing Code guidelines](https://secure.phabricator.com/book/phabcontrib/article/contributing_code/#rejecting-patches), as we largely feel the same way about this.*
> If you send us a patch without coordinating it with us first, it will probably be immediately rejected, or sit in limbo for a long time and eventually be rejected. The reasons we do this vary from patch to patch, but some of the most common reasons are:
>
> **Unjustifiable Costs**: We support code in the upstream forever. Support is enormously expensive and takes up a huge amount of our time. The cost to support a change over its lifetime is often 10x or 100x or 1000x greater than the cost to write the first version of it. Many uncoordinated patches we receive are "white elephants", which would cost much more to maintain than the value they provide.
>
> As an author, it may look like you're giving us free work and we're rejecting it as too expensive, but this viewpoint doesn't align with the reality of a large project which is actively supported by a small, experienced team. Writing code is cheap; maintaining it is expensive.
>
> By coordinating with us first, you can make sure the patch is something we consider valuable enough to put long-term support resources behind, and that you're building it in a way that we're comfortable taking over.
>
> **Not a Good Fit**: Many patches aren't good fits for the upstream: they implement features we simply don't want. You can find more information in Contributing Feature Requests. Coordinating with us first helps make sure we're on the same page and interested in a feature.
>
> The most common type of patch along these lines is a patch which adds new configuration options. We consider additional configuration options to have an exceptionally high lifetime support cost and are very unlikely to accept them. Coordinate with us first.
>
> **Not a Priority**: If you send us a patch against something which isn't a priority, we probably won't have time to look at it. We don't give special treatment to low-priority issues just because there's code written: we'd still be spending time on something lower-priority when we could be spending it on something higher-priority instead.
>
> If you coordinate with us first, you can make sure your patch is in an area of the codebase that we can prioritize.
>
> **Overly Ambitious Patches**: Sometimes we'll get huge patches from new contributors. These can have a lot of fundamental problems and require a huge amount of our time to review and correct. If you're interested in contributing, you'll have more success if you start small and learn as you go.
>
> We can help you break a large change into smaller pieces and learn how the codebase works as you proceed through the implementation, but only if you coordinate with us first.
>
> **Generality**: We often receive several feature requests which ask for similar features, and can come up with a general approach which covers all of the use cases. If you send us a patch for your use case only, the approach may be too specific. When a cleaner and more general approach is available, we usually prefer to pursue it.
>
> By coordinating with us first, we can make you aware of similar use cases and opportunities to generalize an approach. These changes are often small, but can have a big impact on how useful a piece of code is.
>
> **Infrastructure and Sequencing**: Sometimes patches are written against a piece of infrastructure with major planned changes. We don't want to accept these because they'll make the infrastructure changes more difficult to implement.
>
> Coordinate with us first to make sure a change doesn't need to wait on other pieces of infrastructure. We can help you identify technical blockers and possibly guide you through resolving them if you're interested.

12
.github/FUNDING.yml vendored Normal file
View File

@ -0,0 +1,12 @@
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: https://www.sourcemod.net/donate.php

25
.github/ISSUE_TEMPLATE.md vendored Normal file
View File

@ -0,0 +1,25 @@
# Help us help you
- [ ] I have checked that my issue [doesn't exist yet](https://github.com/alliedmodders/amxmodx/issues).
- [ ] I have tried my absolute best to reduce the problem-space and have provided the absolute smallest test-case possible.
- [ ] I can always reproduce the issue with the provided description below.
# Environment
* Operating System version:
* Game/AppID (with version if applicable):
* Current AMX Mod X version:
* Current Metamod version:
- [ ] I have updated AMX Mod X to the [latest version](https://www.amxmodx.org/downloads.php) and it still happens.
- [ ] I have updated AMX Mod X to the [latest snapshot](https://www.amxmodx.org/snapshots.php) and it still happens.
- [ ] I have updated Metamod to the [latest version](https://www.amxmodx.org/downloads.php) and it still happens.
# Description
# Problematic Code (or Steps to Reproduce)
```PAWN
// TODO(you): code here to reproduce the problem
```
# Logs
* Please attach in separate files: game output, library logs, kernel logs, and any other supporting information.
* In case of a crash, please attach minidump or dump analyze output.

137
.github/workflows/ci.yml vendored Normal file
View File

@ -0,0 +1,137 @@
name: Continuous Integration
on:
workflow_dispatch:
push:
branches:
- master
- 1.9-dev
pull_request:
branches:
- master
- 1.9-dev
jobs:
test:
strategy:
matrix:
include:
- os: ubuntu-latest
os_short: linux
compiler_cc: gcc
compiler_cxx: g++
- os: ubuntu-latest
os_short: linux
compiler_cc: clang
compiler_cxx: clang++
- os: ubuntu-18.04
os_short: linux
compiler_cc: clang-3.9
compiler_cxx: clang++-3.9
- os: ubuntu-18.04
os_short: linux
compiler_cc: gcc-6
compiler_cxx: g++-6
compiler_install: 'g++6 g++-6-multilib'
- os: windows-latest
os_short: windows
compiler_cc: msvc
- os: windows-2016
os_short: windows
compiler_cc: msvc++14.16-vs2017-cl
# MacOS 32 Bins seem not supported
# - os: macos-latest
# os_short: mac
# compiler_cc: clang
# compiler_cxx: clang++
fail-fast: false
runs-on: ${{ matrix.os }}
name: ${{ matrix.os_short }}-${{ matrix.os }}-${{ matrix.compiler_cc }}
env:
DEPENDENCIES_FOLDER: dependencies
DEPENDENCIES_ROOT: ${{ github.workspace }}/dependencies
DEPENDENCIES_ROOT_WIN: ${{ github.workspace }}\dependencies
steps:
- uses: actions/checkout@v2
with:
submodules: recursive
path: amxmodx
# Setup Python for AMBuild
- uses: actions/setup-python@v2
name: Setup Python 3.8
with:
python-version: 3.8
- name: Install Python dependencies
run: |
python3 -m pip install --upgrade pip setuptools wheel
python3 --version
- name: Install AMXModX dependencies (Linux)
if: startsWith(runner.os, 'Linux') || startsWith(runner.os, 'macOS')
shell: bash
run: |
mkdir -p ${{ env.DEPENDENCIES_FOLDER }}
cd ${{ env.DEPENDENCIES_FOLDER }}
# Satisfy checkout-deps requirement for a "amxmodx" folder.
mkdir -p amxmodx
../amxmodx/support/checkout-deps.sh
- name: Install AMXModX dependencies (Windows)
if: startsWith(runner.os, 'Windows')
shell: cmd
run: |
mkdir %DEPENDENCIES_ROOT_WIN%\nasm
curl -L -o "%DEPENDENCIES_ROOT_WIN%\nasm\nasm.zip" https://www.nasm.us/pub/nasm/releasebuilds/2.13.03/win32/nasm-2.13.03-win32.zip
chdir %DEPENDENCIES_ROOT_WIN%\nasm
7z x nasm.zip
chdir %DEPENDENCIES_ROOT_WIN%
git clone https://github.com/alliedmodders/ambuild
git clone https://github.com/alliedmodders/metamod-hl1 metamod-am
git clone https://github.com/alliedmodders/hlsdk
curl -L -o "mysql-connector-c-6.1.1-win32.zip" https://downloads.mysql.com/archives/get/p/19/file/mysql-connector-c-6.1.1-win32.zip
7z x mysql-connector-c-6.1.1-win32.zip -o"mysql"
cd mysql
dir
ren mysql-connector-c-6.1.1-win32 mysql-5.5
move /Y mysql-5.5 ..\
cd ..\ambuild
python3 setup.py install
- name: Install Linux dependencies
if: startsWith(runner.os, 'Linux')
run: |
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
gcc-multilib g++-multilib libstdc++6 lib32stdc++6 \
libc6-dev libc6-dev-i386 linux-libc-dev \
linux-libc-dev:i386 lib32z1-dev nasm ${{ matrix.compiler_cc }} ${{ matrix.compiler_install }}
- name: Select compiler
if: startsWith(runner.os, 'Linux')
run: |
echo "CC=${{ matrix.compiler_cc }}" >> $GITHUB_ENV
echo "CXX=${{ matrix.compiler_cxx }}" >> $GITHUB_ENV
${{ matrix.compiler_cc }} --version
${{ matrix.compiler_cxx }} --version
- uses: ilammy/setup-nasm@v1
- name: Build Linux/macOS
if: startsWith(runner.os, 'Linux') || startsWith(runner.os, 'macOS')
working-directory: amxmodx
run: |
mkdir build
cd build
python3 ../configure.py --enable-optimize --metamod=${{ env.DEPENDENCIES_ROOT }}/metamod-am --hlsdk=${{ env.DEPENDENCIES_ROOT }}/hlsdk --mysql=${{ env.DEPENDENCIES_ROOT }}/mysql-5.5
ambuild
- uses: ilammy/msvc-dev-cmd@v1
with:
arch: x86
- name: Build Windows
if: startsWith(runner.os, 'Windows')
working-directory: amxmodx
shell: cmd
run: |
cl.exe
mkdir build
cd build
python3 ../configure.py --enable-optimize --metamod=${{ env.DEPENDENCIES_ROOT_WIN }}\metamod-am --hlsdk=${{ env.DEPENDENCIES_ROOT_WIN }}\hlsdk --mysql=${{ env.DEPENDENCIES_ROOT_WIN }}\mysql-5.5
ambuild

90
.gitignore vendored Normal file
View File

@ -0,0 +1,90 @@
# Binaries
*.dll
*.exe
*.so
# User-specific files
*.suo
*.user
*.sln.docstates
# Build results
[Dd]ebug/
[Rr]elease/
JITDebug/
JITRelease/
JITDebugBinLog/
JITReleaseBinLog/
x64/
build/
[Bb]in/
[Oo]bj/
build/
obj-*/
# Visual Studio 2015 cache/options directory
.vs/
.vscode/
*_i.c
*_p.c
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.log
*.scc
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Backup & report files from converting an old project file to a newer
# Visual Studio version. Backup files are not needed, because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
# Files generated by Mac OS X Finder
.DS_Store
# Files generated by Windows Explorer
Desktop.ini
Thumbs.db
# AMXX plugin build related files
plugins/compile.dat
plugins/compiled/
*.amx
*.amxx
build_deps/

3
.gitmodules vendored Normal file
View File

@ -0,0 +1,3 @@
[submodule "public/amtl"]
path = public/amtl
url = https://github.com/alliedmodders/amtl

30
.travis.yml Normal file
View File

@ -0,0 +1,30 @@
addons:
apt:
packages:
- clang-3.7
- lib32stdc++6
- lib32z1-dev
- libc6-dev-i386
- linux-libc-dev
- gcc-multilib
- g++-multilib
- nasm
sources:
- llvm-toolchain-precise-3.7
- ubuntu-toolchain-r-test
language: cpp
sudo: false
compiler:
- clang
install:
- pyenv install 3.6.3
- pyenv global 3.6.3
before_script:
- CHECKOUT_DIR=$PWD && cd ..
- chmod a+x $CHECKOUT_DIR/support/checkout-deps.sh
- $CHECKOUT_DIR/support/checkout-deps.sh && cd $CHECKOUT_DIR
script:
- mkdir build && cd build
- PATH="~/.local/bin:$PATH"
- CC=clang-3.7 CXX=clang-3.7 python3 ../configure.py --enable-optimize
- ambuild

514
AMBuildScript Normal file
View File

@ -0,0 +1,514 @@
# vim: set sts=2 ts=8 sw=2 tw=99 et ft=python :
import os
import subprocess
import locale
class AMXXConfig(object):
def __init__(self):
self.binaries = []
self.modules = []
self.plugins = {}
self.libpc300 = None
self.amxxpc = None
self.metamod_path = None
self.hlsdk_path = None
self.mysql_path = None
self.generated_headers = []
self.versionlib = None
self.zlib = None
self.hashing = None
self.utf8rewind = None
self.csx_app = None
self.stdcxx_path = None
self.nasm_path = None
def use_auto_versioning(self):
if builder.backend != 'amb2':
return False
return not getattr(builder.options, 'disable_auto_versioning', False)
def detectProductVersion(self):
builder.AddConfigureFile('product.version')
# For OS X dylib versioning
import re
with open(os.path.join(builder.sourcePath, 'product.version'), 'r') as fp:
productContents = fp.read()
m = re.match('(\d+)\.(\d+)\.(\d+).*', productContents)
if m == None:
self.productVersion = '1.0.0'
else:
major, minor, release = m.groups()
self.productVersion = '{0}.{1}.{2}'.format(major, minor, release)
def detectMetamod(self):
metamod_path = builder.options.metamod_path
if not len(metamod_path):
metamod_path = os.getenv('METAMOD', '')
if len(metamod_path):
self.metamod_path = os.path.join(builder.originalCwd, metamod_path)
if not os.path.exists(os.path.join(self.metamod_path, 'metamod')):
raise Exception('Metamod path does not exist: {0}'.format(metamod_path))
else:
try_paths = [
os.path.join(builder.sourcePath, '..', 'metamod'),
os.path.join(builder.sourcePath, '..', 'metamod-am'),
os.path.join(builder.sourcePath, '..', 'metamod-hl1'),
]
for try_path in try_paths:
if os.path.exists(os.path.join(try_path, 'metamod')):
self.metamod_path = os.path.normpath(try_path)
break
if not self.metamod_path:
raise Exception('Could not find the source code to Metamod! Try passing --metamod to configure.py.')
def detectHlsdk(self):
hlsdk_path = builder.options.hlsdk_path
if not len(hlsdk_path):
hlsdk_path = os.getenv('HLSDK', '')
if len(hlsdk_path):
self.hlsdk_path = os.path.join(builder.originalCwd, hlsdk_path)
if not os.path.exists(self.hlsdk_path):
raise Exception('HLSDK path does not exist: {0}'.format(hlsdk_path))
else:
try_paths = [
os.path.join(builder.sourcePath, '..', 'hlsdk'),
]
for try_path in try_paths:
if os.path.exists(try_path):
self.hlsdk_path = os.path.normpath(try_path)
break
if not self.hlsdk_path:
raise Exception('Could not find the HLSDK! Try passing --hlsdk to configure.py.')
def detectMysql(self):
if builder.options.disable_mysql:
return
mysql_path = builder.options.mysql_path
if not len(mysql_path):
mysql_path = os.getenv('MYSQL55', '')
if len(mysql_path):
self.mysql_path = os.path.join(builder.originalCwd, mysql_path)
if not os.path.exists(self.mysql_path):
raise Exception('MySQL path does not exist: {0}'.format(mysql_path))
else:
try_paths = [
os.path.join(builder.sourcePath, '..', 'mysql-5.5'),
]
for try_path in try_paths:
if os.path.exists(try_path):
self.mysql_path = os.path.normpath(try_path)
break
if not self.mysql_path:
raise Exception('Could not find MySQL! Try passing --mysql to configure.py.')
def detectNASM(self):
import subprocess
nasm_paths = [
getattr(builder.options, 'nasm_path', 'nasm'),
]
if builder.target_platform == 'windows':
nasm_paths += [os.path.join(
builder.sourcePath,
'build_deps',
'nasm',
'nasm.exe')
]
for nasm_path in nasm_paths:
try:
subprocess.check_output([nasm_path, '-v'])
self.nasm_path = nasm_path
break
except:
pass
if self.nasm_path is None:
raise Exception('Could not find a suitable path for nasm')
# Returns list of lines of output from the compiler
@staticmethod
def invokeCompiler(args):
if builder.compiler:
p = subprocess.Popen(builder.compiler.argv + args, stdout=subprocess.PIPE)
output = p.communicate()[0]
if hasattr(output,'encoding') and output.encoding is not None:
encoding = output.encoding
else:
encoding = locale.getpreferredencoding()
return output.decode(encoding, 'replace').split('\n')
return None
def configure(self):
builder.AddConfigureFile('pushbuild.txt')
cxx = builder.DetectCompilers()
if cxx.like('gcc'):
self.configure_gcc(cxx)
elif cxx.like('msvc'):
self.configure_msvc(cxx)
# Optimization
if builder.options.opt == '1':
cxx.defines += ['NDEBUG']
# Debugging
if builder.options.debug == '1':
cxx.defines += ['DEBUG', '_DEBUG']
# Platform-specifics
if builder.target_platform == 'linux':
self.configure_linux(cxx)
elif builder.target_platform == 'mac':
self.configure_mac(cxx)
elif builder.target_platform == 'windows':
self.configure_windows(cxx)
# Finish up.
cxx.defines += [
'AMX_NOPROPLIST',
'PAWN_CELL_SIZE=32',
'AMXMODX_BUILD',
'AMXX_USE_VERSIONLIB',
]
if self.use_auto_versioning():
cxx.defines += ['AMXX_GENERATED_BUILD']
cxx.includes += [os.path.join(builder.buildPath, 'includes')]
cxx.includes += [os.path.join(builder.sourcePath, 'support', 'versionlib')]
cxx.includes += [os.path.join(builder.sourcePath, 'public')]
cxx.includes += [os.path.join(builder.sourcePath, 'public', 'sdk')]
cxx.includes += [os.path.join(builder.sourcePath, 'public', 'amtl')]
cxx.includes += [os.path.join(builder.sourcePath, 'public', 'amtl', 'amtl')]
cxx.includes += [os.path.join(builder.sourcePath, 'public', 'memtools')]
cxx.includes += [os.path.join(builder.sourcePath, 'third_party')]
cxx.includes += [os.path.join(builder.sourcePath, 'third_party', 'hashing')]
cxx.includes += [os.path.join(builder.sourcePath, 'third_party', 'zlib')]
cxx.includes += [os.path.join(builder.sourcePath, 'third_party', 'utf8rewind')]
def configure_gcc(self, cxx):
cxx.cflags += [
'-pipe',
'-fno-strict-aliasing',
'-Wall',
'-Werror',
'-Wno-uninitialized',
'-Wno-unused',
'-Wno-switch',
'-Wno-format',
'-Wno-format-security',
'-m32',
]
cxx.cxxflags += [
'-Wno-invalid-offsetof',
'-std=c++11',
]
cxx.linkflags += ['-m32']
have_gcc = cxx.vendor == 'gcc'
have_clang = cxx.vendor == 'clang'
if have_clang or (have_gcc and cxx.version >= '4'):
cxx.cflags += ['-fvisibility=hidden']
cxx.cxxflags += ['-fvisibility-inlines-hidden']
if have_clang or (have_gcc and cxx.version >= '4.6'):
cxx.cflags += ['-Wno-narrowing']
if (have_gcc and cxx.version >= '4.7') or (have_clang and cxx.version >= '3'):
cxx.cxxflags += ['-Wno-delete-non-virtual-dtor']
if have_gcc and cxx.version >= '4.8':
cxx.cflags += ['-Wno-unused-result', '-Wno-error=sign-compare']
if have_gcc and cxx.version >= '8.0':
cxx.cflags += ['-Wno-stringop-truncation']
if have_gcc and cxx.version >= '9.0':
cxx.cflags += ['-Wno-address-of-packed-member']
if have_clang:
cxx.cxxflags += ['-Wno-implicit-exception-spec-mismatch']
if cxx.version >= '10.0':
cxx.cxxflags += ['-Wno-tautological-compare']
if cxx.version >= 'apple-clang-10.0':
cxx.cxxflags += [
'-Wno-inconsistent-missing-override',
'-Wno-varargs',
]
if cxx.version >= 'apple-clang-5.1' or cxx.version >= 'clang-3.4':
cxx.cxxflags += ['-Wno-deprecated-register']
else:
cxx.cxxflags += ['-Wno-deprecated']
cxx.cflags += ['-Wno-sometimes-uninitialized']
if builder.target_platform == 'linux' and cxx.version >= '3.6':
cxx.cxxflags += ['-Wno-inconsistent-missing-override']
if builder.target_platform == 'linux' and cxx.version >= '3.9':
cxx.cxxflags += ['-Wno-varargs']
if builder.target_platform == 'linux' and cxx.version >= '4.0':
cxx.cxxflags += ['-Wno-address-of-packed-member']
if have_gcc:
cxx.cflags += ['-Wno-parentheses']
cxx.c_only_flags += ['-std=c99']
elif have_clang:
cxx.cflags += ['-Wno-logical-op-parentheses']
cxx.cxxflags += [
'-fno-exceptions',
'-fno-rtti',
]
if builder.options.opt == '1':
cxx.cflags += ['-O2']
def configure_msvc(self, cxx):
if builder.options.debug == '1':
cxx.cflags += ['/MTd']
cxx.linkflags += ['/NODEFAULTLIB:libcmt']
else:
cxx.cflags += ['/MT']
cxx.defines += [
'_CRT_SECURE_NO_DEPRECATE',
'_CRT_SECURE_NO_WARNINGS',
'_CRT_NONSTDC_NO_DEPRECATE',
'_ITERATOR_DEBUG_LEVEL=0',
]
cxx.cflags += [
'/W3',
]
cxx.cxxflags += [
'/EHsc',
'/GR-',
'/TP',
]
cxx.linkflags += [
'/MACHINE:X86',
'/SUBSYSTEM:WINDOWS',
'kernel32.lib',
'user32.lib',
'gdi32.lib',
'winspool.lib',
'comdlg32.lib',
'advapi32.lib',
'shell32.lib',
'ole32.lib',
'oleaut32.lib',
'uuid.lib',
'odbc32.lib',
'odbccp32.lib',
]
if cxx.version >= 1900:
cxx.linkflags += ['legacy_stdio_definitions.lib', 'legacy_stdio_wide_specifiers.lib']
if builder.options.opt == '1':
cxx.cflags += ['/Ox']
cxx.linkflags += ['/OPT:ICF', '/OPT:REF']
if builder.options.debug == '1':
cxx.cflags += ['/Od', '/RTC1']
# This needs to be after our optimization flags which could otherwise disable it.
# Don't omit the frame pointer.
cxx.cflags += ['/Oy-']
def configure_linux(self, cxx):
cxx.defines += ['_LINUX', 'POSIX', 'LINUX']
cxx.linkflags += ['-ldl', '-lm']
if cxx.vendor == 'gcc':
cxx.linkflags += ['-static-libgcc']
elif cxx.vendor == 'clang':
cxx.linkflags += ['-lgcc_eh']
if cxx.like('gcc'):
self.stdcxx_path = self.invokeCompiler(['-m32', '-print-file-name=' + 'libstdc++.a'])[0]
def configure_mac(self, cxx):
cxx.defines += ['OSX', '_OSX', 'POSIX']
cxx.cflags += [
'-mmacosx-version-min=10.7',
'-Wno-address-of-packed-member',
]
cxx.linkflags += [
'-mmacosx-version-min=10.7',
'-arch', 'i386',
'-lstdc++',
'-stdlib=libc++',
'-framework', 'CoreServices',
]
cxx.cxxflags += ['-stdlib=libc++']
def configure_windows(self, cxx):
cxx.defines += ['WIN32', '_WINDOWS']
#
# Low-level compiler and binary construction.
#
def ConfigureForModule(self, context, compiler):
compiler.cxxincludes += [
os.path.join(context.currentSourcePath),
os.path.join(context.currentSourcePath, 'sdk'),
os.path.join(self.metamod_path, 'metamod'),
os.path.join(self.hlsdk_path, 'common'),
os.path.join(self.hlsdk_path, 'dlls'),
os.path.join(self.hlsdk_path, 'engine'),
os.path.join(self.hlsdk_path, 'game_shared'),
os.path.join(self.hlsdk_path, 'public'),
os.path.join(self.hlsdk_path, 'pm_shared'),
]
return compiler
def AddVersioning(self, binary):
if builder.target_platform == 'windows':
binary.compiler.rcdefines += [
'BINARY_NAME="{0}"'.format(binary.outputFile),
'RC_COMPILE',
]
if self.use_auto_versioning():
binary.compiler.rcdefines += ['AMXX_GENERATED_BUILD']
elif builder.target_platform == 'mac':
if binary.type == 'library':
binary.compiler.postlink += [
'-compatibility_version', '1.0.0',
'-current_version', self.productVersion
]
if self.use_auto_versioning():
binary.compiler.linkflags += [self.versionlib]
binary.compiler.sourcedeps += AMXX.generated_headers
return binary
#
# High level job construction for libraries, metamod plugins, modules, and
# executables.
#
def Library(self, context, name):
binary = context.compiler.Library(name)
return self.AddVersioning(binary)
def MetaPlugin(self, context, name):
if builder.target_platform == 'mac' or builder.target_platform == 'windows':
name = name + '_mm'
elif builder.target_platform == 'linux':
name = name + '_mm_i386'
binary = context.compiler.Library(name)
self.ConfigureForModule(context, binary.compiler)
return self.AddVersioning(binary)
def MetaModule(self, context, name):
if builder.target_platform == 'mac' or builder.target_platform == 'windows':
name = name + '_amxx'
elif builder.target_platform == 'linux':
name = name + '_amxx_i386'
binary = context.compiler.Library(name)
self.ConfigureForModule(context, binary.compiler)
return self.AddVersioning(binary)
def Program(self, context, name):
binary = context.compiler.Program(name)
return self.AddVersioning(binary)
def AddAssembly(self, context, binary, input_file, output_file, includes=[], extra_argv=[]):
if builder.target_platform == 'windows':
obj_type = 'win32'
elif builder.target_platform == 'linux':
obj_type = 'elf32'
elif builder.target_platform == 'mac':
obj_type = 'macho32'
input_path = os.path.join(context.currentSourcePath, input_file)
output_path = output_file
argv = [
self.nasm_path,
'-I{0}{1}'.format(context.currentSourcePath, os.sep),
input_path,
'-f', obj_type,
'-o', output_path,
] + extra_argv
extra_includes = []
for include_file in includes:
extra_includes.append(os.path.join(context.currentSourcePath, include_file))
cmd_node, output_nodes = context.AddCommand(
inputs = [input_path] + extra_includes,
argv = argv,
outputs = [output_path])
binary.compiler.linkflags += [output_nodes[0]]
AMXX = AMXXConfig()
AMXX.detectProductVersion()
AMXX.detectMetamod()
AMXX.detectHlsdk()
AMXX.detectMysql()
AMXX.detectNASM()
AMXX.configure()
if AMXX.use_auto_versioning():
AMXX.generated_headers = builder.RunScript(
'support/Versioning',
{ 'AMXX': AMXX }
)
AMXX.versionlib = builder.RunScript(
'support/versionlib/AMBuilder',
{ 'AMXX': AMXX }
)
AMXX.zlib = builder.RunScript(
'third_party/zlib/AMBuilder'
)
AMXX.hashing = builder.RunScript(
'third_party/hashing/AMBuilder'
)
AMXX.utf8rewind = builder.RunScript(
'third_party/utf8rewind/AMBuilder'
)
builder.RunBuildScripts(
[
'amxmodx/AMBuilder',
'compiler/amxxpc/AMBuilder',
'compiler/libpc300/AMBuilder',
'modules/cstrike/cstrike/AMBuilder',
'modules/cstrike/csx/AMBuilder',
'modules/dod/dodfun/AMBuilder',
'modules/dod/dodx/AMBuilder',
'modules/engine/AMBuilder',
'modules/fakemeta/AMBuilder',
'modules/fun/AMBuilder',
'modules/geoip/AMBuilder',
'modules/hamsandwich/AMBuilder',
'modules/json/AMBuilder',
'modules/mysqlx/AMBuilder',
'modules/ns/AMBuilder',
'modules/nvault/AMBuilder',
'modules/regex/AMBuilder',
'modules/sockets/AMBuilder',
'modules/sqlite/AMBuilder',
'modules/tfcx/AMBuilder',
'modules/ts/tsfun/AMBuilder',
'modules/ts/tsx/AMBuilder',
],
{ 'AMXX': AMXX }
)
# The csstats.dat reader is Windows-only.
if builder.target_platform == 'windows':
builder.RunScript('modules/cstrike/csx/WinCSX/AMBuilder', { 'AMXX': AMXX })
if builder.backend == 'amb2':
builder.RunBuildScripts([
'plugins/AMBuilder',
'support/PackageScript',
],
{ 'AMXX': AMXX }
)

22
README.md Normal file
View File

@ -0,0 +1,22 @@
<p align="center">
<img src="https://github.com/alliedmodders/amxmodx/blob/master/editor/studio/AMXXLarge.bmp"/>
</p>
**AMX Mod X** is a [Metamod](https://github.com/jkivilin/metamod-p) plugin for [Half-Life 1](https://github.com/ValveSoftware/halflife). It provides comprehensive scripting for the game engine and its mods. Scripts can intercept network messages, log events, commands, client commands, set cvars, modify entities, and more. AMX Mod X also has a system for extending native scripting through modules, leading to outside support for things like MySQL and Sockets.
General
-------
- [AMXX website](https://amxmodx.org/)
- [Forum](https://forums.alliedmods.net/forumdisplay.php?f=3): Discussion forum including plugin/extension development
- [General documentation](https://wiki.alliedmods.net/Category:Documentation_%28AMX_Mod_X%29): Miscellaneous information about AMXX
- [Latest release](https://amxmodx.org/downloads.php): The latest stable AMXX release
- [Build snapshots](https://www.amxmodx.org/downloads-new.php): Builds of recent development versions
Development
-----------
- [Issue tracker](https://github.com/alliedmodders/amxmodx/issues): Issues that require back and forth communication
- [Issue archive](https://bugs.alliedmods.net/describecomponents.cgi?product=AMX%20Mod%20X): Old issue tracker (read-only)
- [Building AMXX](https://wiki.alliedmods.net/Building_AMX_Mod_X): Instructions on how to build AMXX itself using [AMBuild](https://github.com/alliedmodders/ambuild)
- [AMX Mod X API](https://amxmodx.org/api/): AMX Mod X API reference generated from include files
- [AMXX scripting](https://wiki.alliedmods.net/Category:Scripting_(AMX_Mod_X)): Pawn examples and introduction to the language

101
amxmodx/AMBuilder Normal file
View File

@ -0,0 +1,101 @@
# vim: set sts=2 ts=8 sw=2 tw=99 et ft=python:
import os.path
binary = AMXX.MetaPlugin(builder, 'amxmodx')
binary.compiler.defines += [
'JIT',
'ASM32',
'HAVE_STDINT_H',
]
AMXX.AddAssembly(builder, binary, 'helpers-x86.asm', 'helpers-asm.obj')
AMXX.AddAssembly(builder, binary, 'natives-x86.asm', 'natives-asm.obj')
AMXX.AddAssembly(builder, binary, 'amxexecn.asm', 'amxexecn-asm.obj',
includes=['amxdefn.asm'])
AMXX.AddAssembly(builder, binary, 'amxjitsn.asm', 'amxjitsn-asm.obj',
includes=['amxdefn.asm'],
# Opcode sizes must be maximum width for patching to work.
extra_argv=['-O0'])
if builder.target_platform == 'mac':
binary.compiler.postlink += [
'-Wl,-read_only_relocs,suppress'
]
elif builder.target_platform == 'windows':
binary.compiler.linkflags += [
'/EXPORT:GiveFnptrsToDll=_GiveFnptrsToDll@8,@1',
'/SECTION:.data,RW',
]
elif builder.target_platform == 'linux':
binary.compiler.postlink += [
binary.Dep(AMXX.stdcxx_path),
]
binary.compiler.linkflags += [AMXX.zlib.binary, AMXX.hashing.binary, AMXX.utf8rewind.binary]
binary.sources = [
'meta_api.cpp',
'CVault.cpp',
'vault.cpp',
'float.cpp',
'file.cpp',
'modules.cpp',
'CMisc.cpp',
'CTask.cpp',
'string.cpp',
'amxmodx.cpp',
'CEvent.cpp',
'CCmd.cpp',
'CLogEvent.cpp',
'srvcmd.cpp',
'strptime.cpp',
'amxcore.cpp',
'amxtime.cpp',
'power.cpp',
'amxxlog.cpp',
'fakemeta.cpp',
'amxxfile.cpp',
'CLang.cpp',
'emsg.cpp',
'CForward.cpp',
'CPlugin.cpp',
'CModule.cpp',
'CMenu.cpp',
'util.cpp',
'amx.cpp',
'amxdbg.cpp',
'natives.cpp',
'newmenus.cpp',
'debugger.cpp',
'optimizer.cpp',
'format.cpp',
'messages.cpp',
'libraries.cpp',
'vector.cpp',
'sorting.cpp',
'nongpl_matches.cpp',
'CFlagManager.cpp',
'datastructs.cpp',
'trie_natives.cpp',
'CDataPack.cpp',
'datapacks.cpp',
'stackstructs.cpp',
'CTextParsers.cpp',
'textparse.cpp',
'CvarManager.cpp',
'cvars.cpp',
'../public/memtools/MemoryUtils.cpp',
'../public/memtools/CDetour/detours.cpp',
'../public/memtools/CDetour/asm/asm.c',
'../public/resdk/mod_rehlds_api.cpp',
'CLibrarySys.cpp',
'CGameConfigs.cpp',
'gameconfigs.cpp',
'CoreConfig.cpp',
]
if builder.target_platform == 'windows':
binary.sources += ['version.rc']
AMXX.binaries += [builder.Add(binary)]

View File

@ -1,33 +1,11 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#include "amxmodx.h"
#include "CCmd.h"
@ -52,19 +30,20 @@ CmdMngr::CmdMngr()
}
CmdMngr::Command::Command(CPluginMngr::CPlugin* pplugin, const char* pcmd, const char* pinfo, int pflags,
int pfunc, bool pviewable, CmdMngr* pparent) : commandline(pcmd), info(pinfo)
int pfunc, bool pviewable, bool pinfo_ml, CmdMngr* pparent) : commandline(pcmd), info(pinfo)
{
char szCmd[64], szArg[64];
*szCmd = 0; *szArg = 0;
sscanf(pcmd, "%s %s", szCmd, szArg);
command.assign(szCmd);
argument.assign(szArg);
command = szCmd;
argument = szArg;
plugin = pplugin;
flags = pflags;
cmdtype = 0;
prefix = 0;
function = pfunc;
listable = pviewable;
info_ml = pinfo_ml;
parent = pparent;
id = --uniqueid;
}
@ -74,9 +53,9 @@ CmdMngr::Command::~Command()
++uniqueid;
}
CmdMngr::Command* CmdMngr::registerCommand(CPluginMngr::CPlugin* plugin, int func, char* cmd, char* info, int level, bool listable)
CmdMngr::Command* CmdMngr::registerCommand(CPluginMngr::CPlugin* plugin, int func, const char* cmd, const char* info, int level, bool listable, bool info_ml)
{
Command* b = new Command(plugin, cmd, info, level, func, listable, this);
Command* b = new Command(plugin, cmd, info, level, func, listable, info_ml, this);
if (b == 0) return 0;
setCmdLink(&sortedlists[0], b);
@ -124,8 +103,6 @@ CmdMngr::Command* CmdMngr::getCmd(long int id, int type, int access)
int CmdMngr::getCmdNum(int type, int access)
{
if ((access == buf_access) && (type == buf_type))
return buf_num; // once calculated don't have to be done again
buf_access = access;
buf_type = type;
@ -155,7 +132,7 @@ void CmdMngr::setCmdLink(CmdLink** a, Command* c, bool sorted)
{
int i = strcmp(c->getCommand(), (*a)->cmd->getCommand());
if ((i < 0) || (i == 0) && (strcmp(c->getArgument(), (*a)->cmd->getArgument()) < 0))
if ((i < 0) || ((i == 0) && (strcmp(c->getArgument(), (*a)->cmd->getArgument()) < 0)))
break;
a = &(*a)->next;
@ -224,7 +201,7 @@ bool CmdMngr::registerCmdPrefix(Command* cc)
if (*b)
{
setCmdLink(&(*b)->list, cc, false);
cc->prefix = (*b)->name.size();
cc->prefix = (*b)->name.length();
return true;
}
@ -246,7 +223,7 @@ CmdMngr::CmdPrefix** CmdMngr::findPrefix(const char* nn)
while (*aa)
{
if (!strncmp((*aa)->name.c_str(), nn, (*aa)->name.size()))
if (!strncmp((*aa)->name.chars(), nn, (*aa)->name.length()))
break;
aa = &(*aa)->next;
}

View File

@ -1,33 +1,11 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#ifndef COMMANDS_H
#define COMMANDS_H
@ -55,11 +33,12 @@ public:
CPluginMngr::CPlugin* plugin;
CmdMngr* parent;
String command;
String argument;
String commandline;
String info;
ke::AString command;
ke::AString argument;
ke::AString commandline;
ke::AString info;
bool info_ml;
bool listable;
int function;
int flags;
@ -68,19 +47,20 @@ public:
int prefix;
static int uniqueid;
Command(CPluginMngr::CPlugin* pplugin, const char* pcmd, const char* pinfo, int pflags, int pfunc, bool pviewable, CmdMngr* pparent);
Command(CPluginMngr::CPlugin* pplugin, const char* pcmd, const char* pinfo, int pflags, int pfunc, bool pviewable, bool pinfo_ml, CmdMngr* pparent);
~Command();
public:
inline const char* getCommand() { return command.c_str(); }
inline const char* getArgument() { return argument.c_str(); }
inline const char* getCmdInfo() { return info.c_str(); }
inline const char* getCmdLine() { return commandline.c_str(); }
inline bool matchCommandLine(const char* cmd, const char* arg) { return (!stricmp(command.c_str() + prefix, cmd + prefix) && (argument.empty() || !stricmp(argument.c_str(), arg))); }
inline bool matchCommand(const char* cmd) { return (!strcmp(command.c_str(), cmd)); }
inline const char* getCommand() { return command.chars(); }
inline const char* getArgument() { return argument.chars(); }
inline const char* getCmdInfo() { return info.chars(); }
inline const char* getCmdLine() { return commandline.chars(); }
inline bool matchCommandLine(const char* cmd, const char* arg) {return (!stricmp(command.chars() + prefix, cmd + prefix) && (!argument.length() || !stricmp(argument.chars(), arg)));}
inline bool matchCommand(const char* cmd) { return (!stricmp(command.chars(), cmd)); }
inline int getFunction() const { return function; }
inline bool gotAccess(int f) const { return (!flags || ((flags & f) == flags)); }
inline bool gotAccess(int f) const { return (!flags || ((flags & f) != 0)); }
inline CPluginMngr::CPlugin* getPlugin() { return plugin; }
inline bool isViewable() const { return listable; }
inline bool isInfoML() const { return info_ml; }
inline int getFlags() const { return flags; }
inline long int getId() const { return (long int)id; }
@ -105,7 +85,7 @@ private:
struct CmdPrefix
{
String name;
ke::AString name;
CmdMngr* parent;
CmdLink* list;
CmdPrefix* next;
@ -128,7 +108,7 @@ public:
void registerPrefix(const char* nn);
Command* registerCommand(CPluginMngr::CPlugin* plugin, int func, char* cmd, char* info, int level, bool listable);
Command* registerCommand(CPluginMngr::CPlugin* plugin, int func, const char* cmd, const char* info, int level, bool listable, bool info_ml);
Command* getCmd(long int id, int type, int access);
int getCmdNum(int type, int access);

340
amxmodx/CDataPack.cpp Normal file
View File

@ -0,0 +1,340 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
* =============================================================================
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, version 3.0, as published by the
* Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*/
#include "CDataPack.h"
#define DATAPACK_INITIAL_SIZE 64
CDataPack::CDataPack()
{
m_pBase = (char *)malloc(DATAPACK_INITIAL_SIZE);
m_capacity = DATAPACK_INITIAL_SIZE;
Initialize();
}
CDataPack::~CDataPack()
{
free(m_pBase);
}
void CDataPack::Initialize()
{
m_curptr = m_pBase;
m_size = 0;
}
void CDataPack::CheckSize(size_t typesize)
{
if (m_curptr - m_pBase + typesize <= m_capacity)
{
return;
}
size_t pos = m_curptr - m_pBase;
do
{
m_capacity *= 2;
} while (pos + typesize > m_capacity);
m_pBase = (char *)realloc(m_pBase, m_capacity);
m_curptr = m_pBase + pos;
}
void CDataPack::ResetSize()
{
m_size = 0;
}
size_t CDataPack::CreateMemory(size_t size, void **addr)
{
CheckSize(sizeof(char) + sizeof(size_t) + size);
size_t pos = m_curptr - m_pBase;
*(char *)m_curptr = Raw;
m_curptr += sizeof(char);
*(size_t *)m_curptr = size;
m_curptr += sizeof(size_t);
if (addr)
{
*addr = m_curptr;
}
m_curptr += size;
m_size += sizeof(char) + sizeof(size_t) + size;
return pos;
}
void CDataPack::PackCell(cell cells)
{
CheckSize(sizeof(char) + sizeof(size_t) + sizeof(cell));
*(char *)m_curptr = DataPackType::Cell;
m_curptr += sizeof(char);
*(size_t *)m_curptr = sizeof(cell);
m_curptr += sizeof(size_t);
*(cell *)m_curptr = cells;
m_curptr += sizeof(cell);
m_size += sizeof(char) + sizeof(size_t) + sizeof(cell);
}
void CDataPack::PackFloat(float val)
{
CheckSize(sizeof(char) + sizeof(size_t) + sizeof(float));
*(char *)m_curptr = DataPackType::Float;
m_curptr += sizeof(char);
*(size_t *)m_curptr = sizeof(float);
m_curptr += sizeof(size_t);
*(float *)m_curptr = val;
m_curptr += sizeof(float);
m_size += sizeof(char) + sizeof(size_t) + sizeof(float);
}
void CDataPack::PackString(const char *string)
{
size_t len = strlen(string);
size_t maxsize = sizeof(char) + sizeof(size_t) + len + 1;
CheckSize(maxsize);
*(char *)m_curptr = DataPackType::String;
m_curptr += sizeof(char);
// Pack the string length first for buffer overrun checking.
*(size_t *)m_curptr = len;
m_curptr += sizeof(size_t);
// Now pack the string.
memcpy(m_curptr, string, len);
m_curptr[len] = '\0';
m_curptr += len + 1;
m_size += maxsize;
}
void CDataPack::Reset() const
{
m_curptr = m_pBase;
}
size_t CDataPack::GetPosition() const
{
return static_cast<size_t>(m_curptr - m_pBase);
}
bool CDataPack::SetPosition(size_t pos) const
{
if (pos > m_size-1)
{
return false;
}
m_curptr = m_pBase + pos;
return true;
}
bool CDataPack::CanReadCell() const
{
if (!IsReadable(sizeof(char) + sizeof(size_t) + sizeof(cell)))
{
return false;
}
if (*reinterpret_cast<char *>(m_curptr) != DataPackType::Cell)
{
return false;
}
if (*reinterpret_cast<size_t *>(m_curptr + sizeof(char)) != sizeof(cell))
{
return false;
}
return true;
}
cell CDataPack::ReadCell() const
{
if (!CanReadCell())
{
return 0;
}
m_curptr += sizeof(char);
m_curptr += sizeof(size_t);
cell val = *reinterpret_cast<cell *>(m_curptr);
m_curptr += sizeof(cell);
return val;
}
bool CDataPack::CanReadFloat() const
{
if (!IsReadable(sizeof(char) + sizeof(size_t) + sizeof(float)))
{
return false;
}
if (*reinterpret_cast<char *>(m_curptr) != DataPackType::Float)
{
return false;
}
if (*reinterpret_cast<size_t *>(m_curptr + sizeof(char)) != sizeof(float))
{
return false;
}
return true;
}
float CDataPack::ReadFloat() const
{
if (!CanReadFloat())
{
return 0;
}
m_curptr += sizeof(char);
m_curptr += sizeof(size_t);
float val = *reinterpret_cast<float *>(m_curptr);
m_curptr += sizeof(float);
return val;
}
bool CDataPack::IsReadable(size_t bytes) const
{
return (bytes + (m_curptr - m_pBase) > m_size) ? false : true;
}
bool CDataPack::CanReadString(size_t *len) const
{
if (!IsReadable(sizeof(char) + sizeof(size_t)))
{
return false;
}
if (*reinterpret_cast<char *>(m_curptr) != DataPackType::String)
{
return false;
}
size_t real_len = *(size_t *)(m_curptr + sizeof(char));
char *str = (char *)(m_curptr + sizeof(char) + sizeof(size_t));
if ((strlen(str) != real_len) || !(IsReadable(sizeof(char) + sizeof(size_t) + real_len + 1)))
{
return false;
}
if (len)
{
*len = real_len;
}
return true;
}
const char *CDataPack::ReadString(size_t *len) const
{
size_t real_len;
if (!CanReadString(&real_len))
{
return NULL;
}
m_curptr += sizeof(char);
m_curptr += sizeof(size_t);
char *str = (char *)m_curptr;
m_curptr += real_len + 1;
if (len)
{
*len = real_len;
}
return str;
}
void *CDataPack::GetMemory() const
{
return m_curptr;
}
bool CDataPack::CanReadMemory(size_t *size) const
{
if (!IsReadable(sizeof(char) + sizeof(size_t)))
{
return false;
}
if (*reinterpret_cast<char *>(m_curptr) != DataPackType::Raw)
{
return false;
}
size_t bytecount = *(size_t *)(m_curptr + sizeof(char));
if (!IsReadable(sizeof(char) + sizeof(size_t) + bytecount))
{
return false;
}
if (size)
{
*size = bytecount;
}
return true;
}
void *CDataPack::ReadMemory(size_t *size) const
{
size_t bytecount;
if (!CanReadMemory(&bytecount))
{
return NULL;
}
m_curptr += sizeof(char);
m_curptr += sizeof(size_t);
void *ptr = m_curptr;
m_curptr += bytecount;
if (size)
{
*size = bytecount;
}
return ptr;
}

181
amxmodx/CDataPack.h Normal file
View File

@ -0,0 +1,181 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
* =============================================================================
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, version 3.0, as published by the
* Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*/
#ifndef _INCLUDE_SOURCEMOD_CDATAPACK_H_
#define _INCLUDE_SOURCEMOD_CDATAPACK_H_
#include "amxmodx.h"
#include "natives_handles.h"
/**
* @brief Contains functions for packing data abstractly to/from plugins.
*/
class CDataPack
{
public:
CDataPack();
~CDataPack();
public:
/**
* @brief Resets the position in the data stream to the beginning.
*/
void Reset() const;
/**
* @brief Retrieves the current stream position.
*
* @return Index into the stream.
*/
size_t GetPosition() const;
/**
* @brief Sets the current stream position.
*
* @param pos Index to set the stream at.
* @return True if succeeded, false if out of bounds.
*/
bool SetPosition(size_t pos) const;
/**
* @brief Reads one cell from the data stream.
*
* @return A cell read from the current position.
*/
cell ReadCell() const;
/**
* @brief Reads one float from the data stream.
*
* @return A float read from the current position.
*/
float ReadFloat() const;
/**
* @brief Returns whether or not a specified number of bytes from the current stream
* position to the end can be read.
*
* @param bytes Number of bytes to simulate reading.
* @return True if can be read, false otherwise.
*/
bool IsReadable(size_t bytes) const;
/**
* @brief Reads a string from the data stream.
*
* @param len Optional pointer to store the string length.
* @return Pointer to the string, or NULL if out of bounds.
*/
const char *ReadString(size_t *len) const;
/**
* @brief Reads the current position as a generic address.
*
* @return Pointer to the memory.
*/
void *GetMemory() const;
/**
* @brief Reads the current position as a generic data type.
*
* @param size Optional pointer to store the size of the data type.
* @return Pointer to the data, or NULL if out of bounds.
*/
void *ReadMemory(size_t *size) const;
bool CanReadCell() const;
bool CanReadFloat() const;
bool CanReadString(size_t *len) const;
bool CanReadMemory(size_t *size) const;
public:
/**
* @brief Resets the used size of the stream back to zero.
*/
void ResetSize();
/**
* @brief Packs one cell into the data stream.
*
* @param cell Cell value to write.
*/
void PackCell(cell cells);
/**
* @brief Packs one float into the data stream.
*
* @param val Float value to write.
*/
void PackFloat(float val);
/**
* @brief Packs one string into the data stream.
* The length is recorded as well for buffer overrun protection.
*
* @param string String to write.
*/
void PackString(const char *string);
/**
* @brief Creates a generic block of memory in the stream.
*
* Note that the pointer it returns can be invalidated on further
* writing, since the stream size may grow. You may need to double back
* and fetch the pointer again.
*
* @param size Size of the memory to create in the stream.
* @param addr Optional pointer to store the relocated memory address.
* @return Current position of the stream beforehand.
*/
size_t CreateMemory(size_t size, void **addr);
public:
void Initialize();
private:
void CheckSize(size_t sizetype);
private:
char *m_pBase;
mutable char *m_curptr;
size_t m_capacity;
size_t m_size;
enum DataPackType {
Raw,
Cell,
Float,
String,
};
};
extern NativeHandle<CDataPack> DataPackHandles;
extern AMX_NATIVE_INFO g_DatapackNatives[];
#endif //_INCLUDE_SOURCEMOD_CDATAPACK_H_

View File

@ -1,33 +1,11 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#include "amxmodx.h"
#include "CEvent.h"
@ -36,6 +14,8 @@
// class ClEvent
// *****************************************************
NativeHandle<EventHook> EventHandles;
EventsMngr::ClEvent::ClEvent(CPluginMngr::CPlugin* plugin, int func, int flags)
{
m_Plugin = plugin;
@ -46,7 +26,7 @@ EventsMngr::ClEvent::ClEvent(CPluginMngr::CPlugin* plugin, int func, int flags)
m_FlagDead = true;
m_FlagWorld = (flags & 1) ? true : false; // flag a
m_FlagPlayer = (flags & 2) ? true : false; // flag b
m_FlagClient = (flags & 2) ? true : false; // flag b
m_FlagOnce = (flags & 4) ? true : false; // flag c
if (flags & 24)
@ -55,8 +35,21 @@ EventsMngr::ClEvent::ClEvent(CPluginMngr::CPlugin* plugin, int func, int flags)
m_FlagDead = (flags & 8) ? true : false; // flag d
}
if (m_FlagClient)
{
m_FlagPlayer = true;
m_FlagBot = true;
if (flags & 96)
{
m_FlagPlayer = (flags & 32) ? true : false; // flag f
m_FlagBot = (flags & 64) ? true : false; // flag g
}
}
m_Stamp = 0.0f;
m_Done = false;
m_State = FSTATE_ACTIVE;
m_Conditions = NULL;
}
@ -126,7 +119,11 @@ EventsMngr::EventsMngr()
{
m_ParseVault = NULL;
m_ParseVaultSize = 0;
m_CurrentMsgType = -1;
m_ParseMsgType = -1;
m_ReadVault = NULL;
m_ReadVaultSize = 0;
m_ReadPos = -1;
m_ReadMsgType = -1;
clearEvents();
}
@ -175,7 +172,7 @@ void EventsMngr::ClEvent::registerFilter(char *filter)
tmpCond->paramId = atoi(filter);
// rest of line
tmpCond->sValue.assign(value);
tmpCond->sValue = value;
tmpCond->fValue = static_cast<float>(atof(value));
tmpCond->iValue = atoi(value);
@ -194,20 +191,31 @@ void EventsMngr::ClEvent::registerFilter(char *filter)
m_Conditions = tmpCond;
}
EventsMngr::ClEvent* EventsMngr::registerEvent(CPluginMngr::CPlugin* plugin, int func, int flags, int msgid)
void EventsMngr::ClEvent::setForwardState(ForwardState state)
{
m_State = state;
}
int EventsMngr::registerEvent(CPluginMngr::CPlugin* plugin, int func, int flags, int msgid)
{
// validate parameter
if (msgid < 0 || msgid >= MAX_AMX_REG_MSG)
return NULL;
{
return 0;
}
ClEvent *event = new ClEvent(plugin, func, flags);
auto event = ke::AutoPtr<ClEvent>(new ClEvent(plugin, func, flags));
if (!event)
return NULL;
int handle = EventHandles.create(event.get());
m_Events[msgid].put(event);
if (!handle)
{
return 0;
}
return event;
m_Events[msgid].append(ke::Move(event));
return handle;
}
void EventsMngr::parserInit(int msg_type, float* timer, CPlayer* pPlayer, int index)
@ -215,43 +223,43 @@ void EventsMngr::parserInit(int msg_type, float* timer, CPlayer* pPlayer, int in
if (msg_type < 0 || msg_type > MAX_AMX_REG_MSG)
return;
m_CurrentMsgType = msg_type;
m_ParseNotDone = false;
m_Timer = timer;
// don't parse if nothing to do
if (!m_Events[msg_type].size())
if (!m_Events[msg_type].length())
return;
for (ClEventVecIter iter = m_Events[msg_type].begin(); iter; ++iter)
m_ParseMsgType = msg_type;
m_Timer = timer;
for (auto &event : m_Events[msg_type])
{
if ((*iter).m_Done)
if (event->m_Done)
continue;
if (!(*iter).m_Plugin->isExecutable((*iter).m_Func))
if (!event->m_Plugin->isExecutable(event->m_Func))
{
(*iter).m_Done = true;
event->m_Done = true;
continue;
}
if (pPlayer)
{
if (!(*iter).m_FlagPlayer || (pPlayer->IsAlive() ? !(*iter).m_FlagAlive : !(*iter).m_FlagDead))
if (!event->m_FlagClient || (pPlayer->IsBot() ? !event->m_FlagBot : !event->m_FlagPlayer) || (pPlayer->IsAlive() ? !event->m_FlagAlive : !event->m_FlagDead))
{
(*iter).m_Done = true;
event->m_Done = true;
continue;
}
}
else if (!(*iter).m_FlagWorld)
else if (!event->m_FlagWorld)
{
(*iter).m_Done = true;
event->m_Done = true;
continue;
}
if ((*iter).m_FlagOnce && (*iter).m_Stamp == (float)(*timer))
if (event->m_FlagOnce && event->m_Stamp == *timer)
{
(*iter).m_Done = true;
event->m_Done = true;
continue;
}
@ -284,16 +292,16 @@ void EventsMngr::parseValue(int iValue)
// loop through the registered funcs, and decide whether they have to be called or not
// if they shouldnt, their m_Done is set to true
for (ClEventVecIter iter = m_ParseFun->begin(); iter; ++iter)
for (auto &event : *m_ParseFun)
{
if ((*iter).m_Done)
if (event->m_Done)
continue; // already skipped; don't bother with parsing
// loop through conditions
bool execute = false;
bool anyConditions = false;
for (ClEvent::cond_t *condIter = (*iter).m_Conditions; condIter; condIter = condIter->next)
for (auto condIter = event->m_Conditions; condIter; condIter = condIter->next)
{
if (condIter->paramId == m_ParsePos)
{
@ -312,7 +320,7 @@ void EventsMngr::parseValue(int iValue)
}
if (anyConditions && !execute)
(*iter).m_Done = true; // don't execute
event->m_Done = true; // don't execute
}
}
@ -331,16 +339,16 @@ void EventsMngr::parseValue(float fValue)
// loop through the registered funcs, and decide whether they have to be called or not
// if they shouldnt, their m_Done is set to true
for (ClEventVecIter iter = m_ParseFun->begin(); iter; ++iter)
for (auto &event : *m_ParseFun)
{
if ((*iter).m_Done)
if (event->m_Done)
continue; // already skipped; don't bother with parsing
// loop through conditions
bool execute = false;
bool anyConditions = false;
for (ClEvent::cond_t *condIter = (*iter).m_Conditions; condIter; condIter = condIter->next)
for (auto condIter = event->m_Conditions; condIter; condIter = condIter->next)
{
if (condIter->paramId == m_ParsePos)
{
@ -359,7 +367,7 @@ void EventsMngr::parseValue(float fValue)
}
if (anyConditions && !execute)
(*iter).m_Done = true; // don't execute
event->m_Done = true; // don't execute
}
}
@ -378,25 +386,25 @@ void EventsMngr::parseValue(const char *sz)
// loop through the registered funcs, and decide whether they have to be called or not
// if they shouldnt, their m_Done is set to true
for (ClEventVecIter iter = m_ParseFun->begin(); iter; ++iter)
for (auto &event : *m_ParseFun)
{
if ((*iter).m_Done)
if (event->m_Done)
continue; // already skipped; don't bother with parsing
// loop through conditions
bool execute = false;
bool anyConditions = false;
for (ClEvent::cond_t *condIter = (*iter).m_Conditions; condIter; condIter = condIter->next)
for (auto condIter = event->m_Conditions; condIter; condIter = condIter->next)
{
if (condIter->paramId == m_ParsePos)
{
anyConditions = true;
switch (condIter->type)
{
case '=': if (!strcmp(sz, condIter->sValue.c_str())) execute = true; break;
case '!': if (strcmp(sz, condIter->sValue.c_str())) execute = true; break;
case '&': if (strstr(sz, condIter->sValue.c_str())) execute = true; break;
case '=': if (!strcmp(sz, condIter->sValue.chars())) execute = true; break;
case '!': if (strcmp(sz, condIter->sValue.chars())) execute = true; break;
case '&': if (strstr(sz, condIter->sValue.chars())) execute = true; break;
}
if (execute)
@ -405,87 +413,134 @@ void EventsMngr::parseValue(const char *sz)
}
if (anyConditions && !execute)
(*iter).m_Done = true; // don't execute
event->m_Done = true; // don't execute
}
}
void EventsMngr::executeEvents()
{
static unsigned int reentrant = 0;
if (!m_ParseFun)
{
return;
}
for (ClEventVecIter iter = m_ParseFun->begin(); iter; ++iter)
// Store old read data, which are either default values or previous event data
int oldMsgType = m_ReadMsgType, oldReadPos = m_ReadPos;
MsgDataEntry *oldReadVault = m_ReadVault, *readVault = NULL;
// We have a re-entrant call
if (reentrant++)
{
if ((*iter).m_Done)
// Create temporary read vault
readVault = new MsgDataEntry[m_ParsePos + 1];
m_ReadVault = readVault;
} else if (m_ReadVaultSize != m_ParseVaultSize) {
// Extend read vault size if necessary
delete [] m_ReadVault;
m_ReadVault = new MsgDataEntry[m_ParseVaultSize];
m_ReadVaultSize = m_ParseVaultSize;
// Update old read vault so we don't restore to a wrong pointer
oldReadVault = m_ReadVault;
}
// Copy data over to readvault
m_ReadPos = m_ParsePos;
m_ReadMsgType = m_ParseMsgType;
if (m_ParseVault)
{
memcpy(m_ReadVault, m_ParseVault, (m_ParsePos + 1) * sizeof(MsgDataEntry));
}
// Reset this here so we don't trigger re-entrancy for unregistered messages
auto parseFun = m_ParseFun;
m_ParseFun = nullptr;
auto lastSize = parseFun->length();
for(auto i = 0u; i < lastSize; i++)
{
auto &event = parseFun->at(i);
if (event->m_Done)
{
(*iter).m_Done = false;
event->m_Done = false;
continue;
}
(*iter).m_Stamp = (float)*m_Timer;
executeForwards((*iter).m_Func, static_cast<cell>(m_ParseVault ? m_ParseVault[0].iValue : 0));
event->m_Stamp = *m_Timer;
if (event->m_State == FSTATE_ACTIVE)
{
executeForwards(event->m_Func, static_cast<cell>(m_ReadVault ? m_ReadVault[0].iValue : 0));
}
}
m_CurrentMsgType = -1;
m_ParseFun = NULL;
// Restore old read data, either resetting to default or to previous event data
m_ReadMsgType = oldMsgType;
m_ReadPos = oldReadPos;
m_ReadVault = oldReadVault;
delete [] readVault;
--reentrant;
}
int EventsMngr::getArgNum() const
{
return m_ParsePos + 1;
return m_ReadPos + 1;
}
const char* EventsMngr::getArgString(int a) const
{
if (a < 0 || a > m_ParsePos)
if (a < 0 || a > m_ReadPos)
return "";
static char var[32];
switch (m_ParseVault[a].type)
switch (m_ReadVault[a].type)
{
case MSG_INTEGER:
sprintf(var, "%d", m_ParseVault[a].iValue);
sprintf(var, "%d", m_ReadVault[a].iValue);
return var;
case MSG_STRING:
return m_ParseVault[a].sValue;
return m_ReadVault[a].sValue;
default:
sprintf(var, "%g", m_ParseVault[a].fValue);
sprintf(var, "%g", m_ReadVault[a].fValue);
return var;
}
}
int EventsMngr::getArgInteger(int a) const
{
if (a < 0 || a > m_ParsePos)
if (a < 0 || a > m_ReadPos)
return 0;
switch (m_ParseVault[a].type)
switch (m_ReadVault[a].type)
{
case MSG_INTEGER:
return m_ParseVault[a].iValue;
return m_ReadVault[a].iValue;
case MSG_STRING:
return atoi(m_ParseVault[a].sValue);
return atoi(m_ReadVault[a].sValue);
default:
return (int)m_ParseVault[a].fValue;
return (int)m_ReadVault[a].fValue;
}
}
float EventsMngr::getArgFloat(int a) const
{
if (a < 0 || a > m_ParsePos)
if (a < 0 || a > m_ReadPos)
return 0.0f;
switch (m_ParseVault[a].type)
switch (m_ReadVault[a].type)
{
case MSG_INTEGER:
return static_cast<float>(m_ParseVault[a].iValue);
return static_cast<float>(m_ReadVault[a].iValue);
case MSG_STRING:
return static_cast<float>(atof(m_ParseVault[a].sValue));
return static_cast<float>(atof(m_ReadVault[a].sValue));
default:
return m_ParseVault[a].fValue;
return m_ReadVault[a].fValue;
}
}
@ -496,6 +551,8 @@ void EventsMngr::clearEvents(void)
m_Events[i].clear();
}
EventHandles.clear();
// delete parsevault
if (m_ParseVault)
{
@ -503,6 +560,14 @@ void EventsMngr::clearEvents(void)
m_ParseVault = NULL;
m_ParseVaultSize = 0;
}
if (m_ReadVault)
{
delete [] m_ReadVault;
m_ReadVault = NULL;
m_ReadVaultSize = 0;
m_ReadPos = -1;
}
}
int EventsMngr::getEventId(const char* msg)
@ -538,5 +603,5 @@ int EventsMngr::getEventId(const char* msg)
int EventsMngr::getCurrentMsgType()
{
return m_CurrentMsgType;
return m_ReadMsgType;
}

View File

@ -1,37 +1,17 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#ifndef __CEVENTS_H__
#define __CEVENTS_H__
#include "natives_handles.h"
#define MAX_AMX_REG_MSG MAX_REG_MSGS + 16
enum
@ -74,22 +54,25 @@ public:
CPluginMngr::CPlugin *m_Plugin; // the plugin this ClEvent class is assigned to
// flags
bool m_FlagPlayer;
bool m_FlagClient;
bool m_FlagWorld;
bool m_FlagOnce;
bool m_FlagDead;
bool m_FlagAlive;
bool m_FlagPlayer;
bool m_FlagBot;
float m_Stamp; // for 'once' flag
bool m_Done;
ForwardState m_State;
// conditions
struct cond_t
{
int paramId; // the message parameter id
String sValue; // value (string)
ke::AString sValue; // value (string)
float fValue; // value (float)
int iValue; // value (int)
int type; // type (can be int, float, string)
@ -107,6 +90,7 @@ public:
inline CPluginMngr::CPlugin* getPlugin();
inline int getFunction();
void registerFilter(char* filter); // add a condition
void setForwardState(ForwardState value);
};
private:
@ -119,29 +103,30 @@ private:
};
MsgDataEntry *m_ParseVault;
MsgDataEntry *m_ReadVault;
int m_ParseVaultSize;
int m_ReadVaultSize;
void NextParam(); // make sure a new parameter can be added
typedef CList<ClEvent> ClEventVec;
typedef ClEventVec::iterator ClEventVecIter;
ClEventVec m_Events[MAX_AMX_REG_MSG];
ClEventVec *m_ParseFun; // current Event vector
ke::Vector<ke::AutoPtr<ClEvent>> m_Events[MAX_AMX_REG_MSG];
ke::Vector<ke::AutoPtr<ClEvent>> *m_ParseFun; // current Event vector
bool m_ParseNotDone;
int m_ParsePos; // is args. num. - 1
int m_ReadPos;
float* m_Timer;
ClEvent* getValidEvent(ClEvent* a);
int m_CurrentMsgType;
int m_ParseMsgType;
int m_ReadMsgType;
public:
EventsMngr();
~EventsMngr();
// Interface
ClEvent* registerEvent(CPluginMngr::CPlugin* plugin, int func, int flags, int msgid);
int registerEvent(CPluginMngr::CPlugin* plugin, int func, int flags, int msgid);
void parserInit(int msg_type, float* timer, CPlayer* pPlayer, int index);
void parseValue(int iValue);
@ -158,4 +143,12 @@ public:
int getCurrentMsgType();
};
struct EventHook
{
explicit EventHook(EventsMngr::ClEvent *event) : m_event(event) {}
EventsMngr::ClEvent *m_event;
};
extern NativeHandle<EventHook> EventHandles;
#endif //__CEVENTS_H__

View File

@ -1,126 +0,0 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
#include <ctype.h>
#include "amxmodx.h"
#include "CFile.h"
// *****************************************************
// class File
// *****************************************************
File::File(const char* n, const char* m)
{
fp = fopen(n, m);
}
File::~File()
{
if (fp)
fclose(fp);
}
File::operator bool () const
{
return fp && !feof(fp);
}
File& operator<<(File& f, const String& n)
{
if (f) fputs(n.c_str(), f.fp);
return f;
}
File& operator<<(File& f, const char* n)
{
if (f) fputs(n, f.fp);
return f;
}
File& operator<<(File& f, int n)
{
if (f) fprintf(f.fp, "%d", n);
return f;
}
File& operator<<(File& f, const char& c)
{
if (f) fputc(c, f.fp);
return f;
}
File& operator>>(File& f, String& n)
{
if (!f) return f;
char temp[1024];
fscanf(f.fp, "%s", temp);
n.assign(temp);
return f;
}
File& operator>>(File& f, char* n)
{
if (f) fscanf(f.fp, "%s", n);
return f;
}
int File::getline(char* buf, int sz)
{
int a = sz;
char *origBuf = buf;
if (*this)
{
int c;
while (sz-- && (c = getc((*this).fp)) && c != EOF && c != '\n')
*buf++ = c;
*buf = 0;
}
// trim 0x0a and 0x0d characters at the end
while (buf != origBuf)
{
if (*buf == 0x0a || *buf == 0x0d)
*buf = 0;
--buf;
}
return a - sz;
}
File& File::skipWs()
{
if (!*this) return *this;
int c;
while (isspace(c = getc(fp))) {};
ungetc(c, fp);
return *this;
}

View File

@ -1,59 +0,0 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
#include <stdio.h>
#include "CString.h"
// *****************************************************
// class File
// *****************************************************
class File
{
FILE* fp;
public:
File(const char* n, const char* m);
~File();
operator bool () const;
friend File& operator<<(File& f, const String& n);
friend File& operator<<(File& f, const char* n);
friend File& operator<<(File& f, const char& c);
friend File& operator<<(File& f, int n);
friend File& operator>>(File& f, String& n);
friend File& operator>>(File& f, char* n);
int getline(char* buf, int sz);
File& skipWs();
};

255
amxmodx/CFileSystem.h Normal file
View File

@ -0,0 +1,255 @@
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#ifndef _INCLUDE_CFILESYSTEM_H_
#define _INCLUDE_CFILESYSTEM_H_
#include <FileSystem.h> // IFileSystem, FileSystemSeek_t, FileHandle_t (HLSDK)
#include <stdio.h> // FILE*
extern IFileSystem* g_FileSystem;
class ValveFile;
class SystemFile;
class FileObject
{
public:
virtual ~FileObject() {};
virtual size_t Read(void* pOut, size_t size) = 0;
virtual char* ReadLine(char* pOut, size_t size) = 0;
virtual size_t Write(const void* pData, size_t size) = 0;
virtual bool Seek(int pos, int seek_type) = 0;
virtual int Tell() = 0;
virtual int Flush() = 0;
virtual bool HasError() = 0;
virtual bool EndOfFile() = 0;
virtual void Close() = 0;
virtual ValveFile *AsValveFile()
{
return nullptr;
}
virtual SystemFile *AsSystemFile()
{
return nullptr;
}
};
class ValveFile : public FileObject
{
public:
ValveFile(FileHandle_t handle) : handle_(handle) {}
~ValveFile()
{
Close();
}
static bool Exists(const char* file)
{
return g_FileSystem->FileExists(file);
}
static ValveFile* Open(const char* filename, const char* mode, const char* pathID)
{
FileHandle_t handle = g_FileSystem->OpenFromCacheForRead(filename, mode, pathID);
if (!handle)
{
return nullptr;
}
return new ValveFile(handle);
}
static bool Delete(const char* filename, const char* pathID)
{
if (!Exists(filename))
{
return false;
}
g_FileSystem->RemoveFile(filename, pathID);
if (Exists(filename))
{
return false;
}
return true;
}
size_t Read(void* pOut, size_t size) override
{
return static_cast<size_t>(g_FileSystem->Read(pOut, size, handle_));
}
char* ReadLine(char* pOut, size_t size) override
{
return g_FileSystem->ReadLine(pOut, size, handle_);
}
size_t Write(const void* pData, size_t size) override
{
return static_cast<size_t>(g_FileSystem->Write(pData, size, handle_));
}
bool Seek(int pos, int seek_type) override
{
g_FileSystem->Seek(handle_, pos, static_cast<FileSystemSeek_t>(seek_type));
return !HasError();
}
int Tell() override
{
return g_FileSystem->Tell(handle_);
}
bool HasError() override
{
return !handle_ || !g_FileSystem->IsOk(handle_);
}
int Flush() override
{
g_FileSystem->Flush(handle_);
return 0;
}
bool EndOfFile() override
{
return g_FileSystem->EndOfFile(handle_);
}
void Close() override
{
if (handle_)
{
g_FileSystem->Close(handle_);
handle_ = nullptr;;
}
}
virtual ValveFile* AsValveFile()
{
return this;
}
FileHandle_t handle() const
{
return handle_;
}
private:
FileHandle_t handle_;
};
class SystemFile : public FileObject
{
public:
SystemFile(FILE* fp) : fp_(fp) {}
~SystemFile()
{
Close();
}
static SystemFile* Open(const char* path, const char* mode)
{
FILE* fp = fopen(path, mode);
if (!fp)
{
return nullptr;
}
return new SystemFile(fp);
}
static bool Delete(const char* path)
{
return unlink(path) == 0;
}
size_t Read(void* pOut, size_t size) override
{
return fread(pOut, 1, size, fp_);
}
char* ReadLine(char* pOut, size_t size) override
{
return fgets(pOut, size, fp_);
}
size_t Write(const void* pData, size_t size) override
{
return fwrite(pData, 1, size, fp_);
}
bool Seek(int pos, int seek_type) override
{
return fseek(fp_, pos, seek_type) == 0;
}
int Tell() override
{
return ftell(fp_);
}
bool HasError() override
{
return ferror(fp_) != 0;
}
int Flush() override
{
return fflush(fp_);
}
bool EndOfFile() override
{
return feof(fp_) != 0;
}
void Close() override
{
if (fp_)
{
fclose(fp_);
fp_ = nullptr;
}
}
virtual SystemFile* AsSystemFile()
{
return this;
}
FILE* handle() const
{
return fp_;
}
private:
FILE* fp_;
};
#endif // _INCLUDE_CFILESYSTEM_H_

410
amxmodx/CFlagManager.cpp Normal file
View File

@ -0,0 +1,410 @@
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "sh_list.h"
#include "amxmodx.h"
#include "CFlagManager.h"
void CFlagManager::SetFile(const char *Filename)
{
m_strConfigFile = build_pathname("%s/%s", get_localinfo("amxx_configsdir", "addons/amxmodx/configs"), Filename);
CreateIfNotExist();
}
const int CFlagManager::LoadFile(const int force)
{
CheckIfDisabled();
// If we're disabled get the hell out. now.
if (m_iDisabled)
{
return 0;
}
// if we're not forcing this, and NeedToLoad says we dont have to
// then just stop
if (!force && !NeedToLoad())
{
return 0;
}
this->Clear();
// We need to load the file
FILE *File;
File=fopen(GetFile(),"r");
if (!File)
{
AMXXLOG_Log("[AMXX] FlagManager: Cannot open file \"%s\" (FILE pointer null!)", GetFile());
return -1;
}
// Trying to copy this almost exactly as other configs are read...
char Line[512];
char TempLine[512];
char Command[256];
char Flags[256];
while (!feof(File) && fgets(Line, sizeof(Line), File))
{
char *nonconst= Line;
// Strip out comments
while (*nonconst)
{
if (*nonconst==';') // End the line at comments
{
*nonconst='\0';
}
else
{
nonconst++;
}
}
Command[0]='\0';
Flags[0]='\0';
// Extract the command
strncopy(TempLine, Line, sizeof(TempLine));
nonconst = TempLine;
char *start=NULL;
char *end=NULL;
// move up line until the first ", mark this down as the start
// then find the second " and mark it down as the end
while (*nonconst!='\0')
{
if (*nonconst=='"')
{
if (start==NULL)
{
start=nonconst+1;
}
else
{
end=nonconst;
goto done_with_command;
}
}
nonconst++;
}
done_with_command:
// invalid line?
if (start==NULL || end==NULL)
{
// TODO: maybe warn for an invalid non-commented line?
continue;
}
*end='\0';
strncpy(Command,start,sizeof(Command)-1);
// Now do the same thing for the flags
nonconst=++end;
start=NULL;
end=NULL;
// move up line until the first ", mark this down as the start
// then find the second " and mark it down as the end
while (*nonconst!='\0')
{
if (*nonconst=='"')
{
if (start==NULL)
{
start=nonconst+1;
}
else
{
end=nonconst;
goto done_with_flags;
}
}
nonconst++;
}
done_with_flags:
// invalid line?
if (start==NULL || end==NULL)
{
// TODO: maybe warn for an invalid non-commented line?
continue;
}
*end='\0';
strncpy(Flags,start,sizeof(Flags)-1);
//if (!isalnum(*Command))
if (*Command == '"' || *Command == '\0')
{
continue;
}
// Done sucking the command and flags out of the line
// now insert this command into the linked list
AddFromFile(const_cast<const char*>(&Command[0]),&Flags[0]);
nonconst = Line;
*nonconst = '\0';
}
fclose(File);
return 1;
}
/**
* This gets called from LoadFile
* Do NOT flag the entries as NeedToWrite
* No comment is passed from the file because
* this should never get written
*/
void CFlagManager::AddFromFile(const char *Command, const char *Flags)
{
CFlagEntry *Entry=new CFlagEntry;
Entry->SetName(Command);
Entry->SetFlags(Flags);
// Link it
m_FlagList.push_back(Entry);
}
void CFlagManager::LookupOrAdd(const char *Command, int &Flags, AMX *Plugin)
{
if (m_iDisabled) // if disabled in core.ini stop
{
return;
}
int TempFlags=Flags;
if (TempFlags==-1)
{
TempFlags=0;
}
List<CFlagEntry *>::iterator iter;
List<CFlagEntry *>::iterator end;
iter=m_FlagList.begin();
end=m_FlagList.end();
while (iter!=end)
{
if (strcmp((*iter)->GetName()->chars(),Command)==0)
{
CFlagEntry *Entry=(*iter);
if (Entry->IsHidden()) // "!" flag, exclude this function
{
return;
}
// Found, byref the new flags
Flags=Entry->Flags();
// Move it to the back of the list for faster lookup for the rest
m_FlagList.erase(iter);
m_FlagList.push_back(Entry);
return;
}
iter++;
}
// was not found, add it
CFlagEntry *Entry=new CFlagEntry;
Entry->SetName(Command);
Entry->SetFlags(TempFlags);
if (Plugin)
{
CPluginMngr::CPlugin* a = g_plugins.findPluginFast(Plugin);
if (a)
{
Entry->SetComment(a->getName());
}
}
// This entry was added from a register_* native
// it needs to be written during map change
Entry->SetNeedWritten(1);
// Link it
m_FlagList.push_back(Entry);
}
void CFlagManager::WriteCommands(void)
{
if (m_iDisabled)
{
return;
}
List<CFlagEntry *>::iterator iter;
List<CFlagEntry *>::iterator end;
FILE *File;
int NeedToRead=0;
// First off check the modified time of this file
// if it matches the stored modified time, then update
// after we write so we do not re-read next map
struct stat TempStat;
stat(GetFile(), &TempStat);
if (TempStat.st_mtime != m_Stat.st_mtime)
{
NeedToRead=1;
};
File = fopen(GetFile(), "a");
if (!File)
{
return;
}
iter=m_FlagList.begin();
end=m_FlagList.end();
while (iter!=end)
{
if ((*iter)->NeedWritten())
{
if ((*iter)->GetComment()->length())
{
fprintf(File,"\"%s\" \t\"%s\" ; %s\n",(*iter)->GetName()->chars(),(*iter)->GetFlags()->chars(),(*iter)->GetComment()->chars());
}
else
{
fprintf(File,"\"%s\" \t\"%s\"\n",(*iter)->GetName()->chars(),(*iter)->GetFlags()->chars());
}
(*iter)->SetNeedWritten(0);
}
++iter;
}
fclose(File);
// If NeedToRead was 0, then update the timestamp
// that was saved so we do not re-read this file
// next map
if (!NeedToRead)
{
stat(GetFile(), &TempStat);
m_Stat.st_mtime=TempStat.st_mtime;
}
}
int CFlagManager::ShouldIAddThisCommand(const AMX *amx, const cell *params, const char *cmdname) const
{
// If flagmanager is disabled then ignore this
if (m_iDisabled)
{
return 0;
}
// If 5th param exists it was compiled after this change was made
// if it does not exist, try our logic at the end of this function
// 5th param being > 0 means explicit yes
// < 0 means auto detect (default is -1), treat it like there was no 5th param
// 0 means explicit no
if ((params[0] / sizeof(cell)) >= 5)
{
if (params[5]>0) // This command was explicitly told to be included
{
return 1;
}
else if (params[5]==0) // this command was explicitly told to NOT be used
{
return 0;
}
}
// auto detect if we should use this command
// if command access is -1 (default, not set to ADMIN_ALL or any other access), then no
if (params[3]==-1)
{
return 0;
}
// if command is (or starts with) "say", then no
if (strncmp(cmdname,"say",3)==0)
{
return 0;
}
// else use it
return 1;
}
void CFlagManager::Clear(void)
{
List<CFlagEntry *>::iterator iter;
List<CFlagEntry *>::iterator end;
iter=m_FlagList.begin();
end=m_FlagList.end();
while (iter!=end)
{
delete (*iter);
++iter;
}
m_FlagList.clear();
}
void CFlagManager::CheckIfDisabled(void)
{
if (atoi(get_localinfo("disableflagman","0"))==0)
{
m_iDisabled=0;
}
else
{
m_iDisabled=1;
}
}

231
amxmodx/CFlagManager.h Normal file
View File

@ -0,0 +1,231 @@
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#ifndef CFLAGMANAGER_H
#define CFLAGMANAGER_H
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "sh_list.h"
#include "amxmodx.h"
#include "CLibrarySys.h"
class CFlagEntry
{
private:
ke::AString m_strName; // command name ("amx_slap")
ke::AString m_strFlags; // string flags ("a","b")
ke::AString m_strComment; // comment to write ("; admincmd.amxx")
int m_iFlags; // bitmask flags
int m_iNeedWritten; // write this command on map change?
int m_iHidden; // set to 1 when the command is set to "!" access in
// the .ini file: this means do not process this command
public:
CFlagEntry()
{
m_iNeedWritten=0;
m_iFlags=0;
m_iHidden=0;
};
const int NeedWritten(void) const
{
return m_iNeedWritten;
};
void SetNeedWritten(const int i=1)
{
m_iNeedWritten=i;
};
const ke::AString *GetName(void) const
{
return &m_strName;
};
const ke::AString *GetFlags(void) const
{
return &m_strFlags;
};
const ke::AString *GetComment(void) const
{
return &m_strComment;
};
const int Flags(void) const
{
return m_iFlags;
};
void SetName(const char *data)
{
m_strName = data;
};
void SetFlags(const char *flags)
{
// If this is a "!" entry then stop
if (flags && flags[0]=='!')
{
SetHidden(1);
return;
}
m_strFlags = flags;
m_iFlags=UTIL_ReadFlags(flags);
};
void SetFlags(const int flags)
{
m_iFlags=flags;
char FlagsString[32];
UTIL_GetFlags(FlagsString, flags);
m_strFlags = FlagsString;
};
void SetComment(const char *comment)
{
m_strComment = comment;
};
void SetHidden(int i=1)
{
m_iHidden=i;
};
int IsHidden(void) const
{
return m_iHidden;
};
};
class CFlagManager
{
private:
List<CFlagEntry *> m_FlagList;
ke::AString m_strConfigFile;
struct stat m_Stat;
int m_iForceRead;
int m_iDisabled;
void CreateIfNotExist(void) const
{
FILE *fp;
fp = fopen(GetFile(), "r");
if (!fp)
{
// File does not exist, create the header
fp = fopen(GetFile(), "a");
if (fp)
{
fprintf(fp,"; This file will store the commands used by plugins, and their access level\n");
fprintf(fp,"; To change the access of a command, edit the flags beside it and then\n");
fprintf(fp,"; change the server's map.\n;\n");
fprintf(fp,"; Example: If I wanted to change the amx_slap access to require\n");
fprintf(fp,"; RCON access (flag \"l\") I would change this:\n");
fprintf(fp,"; \"amx_slap\" \"e\" ; admincmd.amxx\n");
fprintf(fp,"; To this:\n");
fprintf(fp,"; \"amx_slap\" \"l\" ; admincmd.amxx\n;\n");
fprintf(fp,"; To disable a specific command from being used with the command manager\n");
fprintf(fp,"; and to only use the plugin-specified access set the flag to \"!\"\n;\n");
fprintf(fp,"; NOTE: The plugin name at the end is just for reference to what plugin\n");
fprintf(fp,"; uses what commands. It is ignored.\n\n");
fclose(fp);
};
}
else
{
fclose(fp);
}
};
/**
* Returns 1 if the timestamp for the file is different than the one we have loaded
* 0 otherwise
*/
inline int NeedToLoad(void)
{
struct stat TempStat;
stat(GetFile(), &TempStat);
// If the modified timestamp does not match the stored
// timestamp than we need to re-read this file.
// Otherwise, ignore the file.
if (TempStat.st_mtime != m_Stat.st_mtime)
{
// Save down the modified timestamp
m_Stat.st_mtime=TempStat.st_mtime;
return 1;
};
return 0;
};
public:
CFlagManager()
{
memset(&m_Stat,0x0,sizeof(struct stat));
m_iDisabled=0;
m_iForceRead=0;
};
~CFlagManager()
{
};
/**
* Sets the filename in relation to amxmodx/configs
*/
void SetFile(const char *Filename="cmdaccess.ini");
const char *GetFile(void) const { return m_strConfigFile.chars(); };
/**
* Parse the file, and load all entries
* Returns 1 on success, 0 on refusal (no need to), and -1 on error
*/
const int LoadFile(const int force=0);
/**
* Checks if the command exists in the list
* If it does, it byrefs the flags for it
* If it does not, it adds it to the list
* These are added from register_*cmd calls
*/
void LookupOrAdd(const char *Command, int &Flags, AMX *Plugin);
/**
* Write the commands back to the file
*/
void WriteCommands(void);
/**
* Add this straight from the cmdaccess.ini file
*/
void AddFromFile(const char *Command, const char *Flags);
/**
* Checks if this command should be added to flagman or not
* This is only checked when adding commands from the register_* natives
* If an admin manually adds a command to cmdaccess.ini it will be used
* regardless of whatever this function would say should be done with it
*/
int ShouldIAddThisCommand(const AMX *amx, const cell *params, const char *cmdname) const;
void Clear(void);
void CheckIfDisabled(void);
};
#endif // CFLAGMANAGER_H

View File

@ -1,33 +1,11 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#include "amxmodx.h"
#include "debugger.h"
@ -52,11 +30,11 @@ CForward::CForward(const char *name, ForwardExecType et, int numParams, const Fo
AMXForward tmp;
tmp.pPlugin = &(*iter);
tmp.func = func;
m_Funcs.push_back(tmp);
m_Funcs.append(tmp);
}
}
m_Name.assign(name);
m_Name = name;
}
cell CForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
@ -68,20 +46,20 @@ cell CForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
cell globRetVal = 0;
AMXForwardList::iterator iter;
for (iter = m_Funcs.begin(); iter != m_Funcs.end(); iter++)
for (size_t i = 0; i < m_Funcs.length(); ++i)
{
auto iter = &m_Funcs[i];
if (iter->pPlugin->isExecutable(iter->func))
{
// Get debug info
AMX *amx = (*iter).pPlugin->getAMX();
AMX *amx = iter->pPlugin->getAMX();
Debugger *pDebugger = (Debugger *)amx->userdata[UD_DEBUGGER];
if (pDebugger)
pDebugger->BeginExec();
// handle strings & arrays
// handle strings & arrays & values by reference
int i;
for (i = 0; i < m_NumParams; ++i)
@ -92,7 +70,7 @@ cell CForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
cell *tmp;
if (!str)
str = "";
amx_Allot(iter->pPlugin->getAMX(), (m_ParamTypes[i] == FP_STRING) ? strlen(str) + 1 : STRINGEX_MAXLENGTH, &realParams[i], &tmp);
amx_Allot(amx, (m_ParamTypes[i] == FP_STRING) ? strlen(str) + 1 : STRINGEX_MAXLENGTH, &realParams[i], &tmp);
amx_SetStringOld(tmp, str, 0, 0);
physAddrs[i] = tmp;
}
@ -111,7 +89,24 @@ cell CForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
for (unsigned int j = 0; j < preparedArrays[params[i]].size; ++j)
*tmp++ = (static_cast<cell>(*data++)) & 0xFF;
}
} else {
}
else if (m_ParamTypes[i] == FP_CELL_BYREF || m_ParamTypes[i] == FP_FLOAT_BYREF)
{
cell *tmp;
amx_Allot(amx, 1, &realParams[i], &tmp);
physAddrs[i] = tmp;
if (m_ParamTypes[i] == FP_CELL_BYREF)
{
memcpy(tmp, reinterpret_cast<cell *>(params[i]), sizeof(cell));
}
else
{
memcpy(tmp, reinterpret_cast<REAL *>(params[i]), sizeof(REAL));
}
}
else
{
realParams[i] = params[i];
}
}
@ -123,12 +118,12 @@ cell CForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
}
// exec
cell retVal;
cell retVal = 0;
#if defined BINLOG_ENABLED
g_BinLog.WriteOp(BinLog_CallPubFunc, (*iter).pPlugin->getId(), iter->func);
g_BinLog.WriteOp(BinLog_CallPubFunc, iter->pPlugin->getId(), iter->func);
#endif
int err = amx_Exec(amx, &retVal, iter->func);
int err = amx_ExecPerf(amx, &retVal, iter->func);
// log runtime error, if any
if (err != AMX_ERR_NONE)
{
@ -149,18 +144,18 @@ cell CForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
if (pDebugger)
pDebugger->EndExec();
// cleanup strings & arrays
// cleanup strings & arrays & values by reference
for (i = 0; i < m_NumParams; ++i)
{
if (m_ParamTypes[i] == FP_STRING)
{
amx_Release(iter->pPlugin->getAMX(), realParams[i]);
amx_Release(amx, realParams[i]);
}
else if (m_ParamTypes[i] == FP_STRINGEX)
{
// copy back
amx_GetStringOld(reinterpret_cast<char*>(params[i]), physAddrs[i], 0);
amx_Release(iter->pPlugin->getAMX(), realParams[i]);
amx_Release(amx, realParams[i]);
}
else if (m_ParamTypes[i] == FP_ARRAY)
{
@ -178,7 +173,21 @@ cell CForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
*data++ = static_cast<char>(*tmp++ & 0xFF);
}
}
amx_Release(iter->pPlugin->getAMX(), realParams[i]);
amx_Release(amx, realParams[i]);
}
else if (m_ParamTypes[i] == FP_CELL_BYREF || m_ParamTypes[i] == FP_FLOAT_BYREF)
{
//copy back
cell *tmp = physAddrs[i];
if (m_ParamTypes[i] == FP_CELL_BYREF)
{
memcpy(reinterpret_cast<cell *>(params[i]), tmp, sizeof(cell));
}
else
{
memcpy(reinterpret_cast<REAL *>(params[i]), tmp, sizeof(REAL));
}
amx_Release(amx, realParams[i]);
}
}
@ -218,7 +227,9 @@ void CSPForward::Set(int func, AMX *amx, int numParams, const ForwardParam *para
isFree = false;
name[0] = '\0';
amx_GetPublic(amx, func, name);
m_Name.assign(name);
m_Name = name;
m_ToDelete = false;
m_InExec = false;
}
void CSPForward::Set(const char *funcName, AMX *amx, int numParams, const ForwardParam *paramTypes)
@ -228,7 +239,9 @@ void CSPForward::Set(const char *funcName, AMX *amx, int numParams, const Forwar
memcpy((void *)m_ParamTypes, paramTypes, numParams * sizeof(ForwardParam));
m_HasFunc = (amx_FindPublic(amx, funcName, &m_Func) == AMX_ERR_NONE);
isFree = false;
m_Name.assign(funcName);
m_Name = funcName;
m_ToDelete = false;
m_InExec = false;
}
cell CSPForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
@ -241,18 +254,20 @@ cell CSPForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
cell realParams[FORWARD_MAX_PARAMS];
cell *physAddrs[FORWARD_MAX_PARAMS];
if (!m_HasFunc)
if (!m_HasFunc || m_ToDelete)
return 0;
CPluginMngr::CPlugin *pPlugin = g_plugins.findPluginFast(m_Amx);
if (!pPlugin->isExecutable(m_Func))
return 0;
m_InExec = true;
Debugger *pDebugger = (Debugger *)m_Amx->userdata[UD_DEBUGGER];
if (pDebugger)
pDebugger->BeginExec();
// handle strings & arrays
// handle strings & arrays & values by reference
int i;
for (i = 0; i < m_NumParams; ++i)
@ -282,7 +297,24 @@ cell CSPForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
for (unsigned int j = 0; j < preparedArrays[params[i]].size; ++j)
*tmp++ = (static_cast<cell>(*data++)) & 0xFF;
}
} else {
}
else if (m_ParamTypes[i] == FP_CELL_BYREF || m_ParamTypes[i] == FP_FLOAT_BYREF)
{
cell *tmp;
amx_Allot(m_Amx, 1, &realParams[i], &tmp);
physAddrs[i] = tmp;
if (m_ParamTypes[i] == FP_CELL_BYREF)
{
memcpy(tmp, reinterpret_cast<cell *>(params[i]), sizeof(cell));
}
else
{
memcpy(tmp, reinterpret_cast<REAL *>(params[i]), sizeof(REAL));
}
}
else
{
realParams[i] = params[i];
}
}
@ -291,12 +323,11 @@ cell CSPForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
amx_Push(m_Amx, realParams[i]);
// exec
cell retVal;
cell retVal = 0;
#if defined BINLOG_ENABLED
g_BinLog.WriteOp(BinLog_CallPubFunc, pPlugin->getId(), m_Func);
#endif
int err = amx_Exec(m_Amx, &retVal, m_Func);
int err = amx_ExecPerf(m_Amx, &retVal, m_Func);
if (err != AMX_ERR_NONE)
{
//Did something else set an error?
@ -316,7 +347,7 @@ cell CSPForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
m_Amx->error = AMX_ERR_NONE;
// cleanup strings & arrays
// cleanup strings & arrays & values by reference
for (i = 0; i < m_NumParams; ++i)
{
if (m_ParamTypes[i] == FP_STRING)
@ -347,20 +378,38 @@ cell CSPForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
}
amx_Release(m_Amx, realParams[i]);
}
else if (m_ParamTypes[i] == FP_CELL_BYREF || m_ParamTypes[i] == FP_FLOAT_BYREF)
{
//copy back
cell *tmp = physAddrs[i];
if (m_ParamTypes[i] == FP_CELL_BYREF)
{
memcpy(reinterpret_cast<cell *>(params[i]), tmp, sizeof(cell));
}
else
{
memcpy(reinterpret_cast<REAL *>(params[i]), tmp, sizeof(REAL));
}
amx_Release(m_Amx, realParams[i]);
}
}
m_InExec = false;
return retVal;
}
int CForwardMngr::registerForward(const char *funcName, ForwardExecType et, int numParams, const ForwardParam * paramTypes)
{
int retVal = m_Forwards.size() << 1;
int retVal = m_Forwards.length() << 1;
CForward *tmp = new CForward(funcName, et, numParams, paramTypes);
if (!tmp)
{
return -1; // should be invalid
}
m_Forwards.push_back(tmp);
m_Forwards.append(tmp);
return retVal;
}
@ -381,7 +430,7 @@ int CForwardMngr::registerSPForward(int func, AMX *amx, int numParams, const For
m_FreeSPForwards.pop();
} else {
retVal = (m_SPForwards.size() << 1) | 1;
retVal = (m_SPForwards.length() << 1) | 1;
pForward = new CSPForward();
if (!pForward)
@ -391,11 +440,11 @@ int CForwardMngr::registerSPForward(int func, AMX *amx, int numParams, const For
if (pForward->getFuncsNum() == 0)
{
return -1;
delete pForward;
return -1;
}
m_SPForwards.push_back(pForward);
m_SPForwards.append(pForward);
}
return retVal;
@ -403,7 +452,7 @@ int CForwardMngr::registerSPForward(int func, AMX *amx, int numParams, const For
int CForwardMngr::registerSPForward(const char *funcName, AMX *amx, int numParams, const ForwardParam *paramTypes)
{
int retVal = (m_SPForwards.size() << 1) | 1;
int retVal = (m_SPForwards.length() << 1) | 1;
CSPForward *pForward;
if (!m_FreeSPForwards.empty())
@ -430,7 +479,7 @@ int CForwardMngr::registerSPForward(const char *funcName, AMX *amx, int numParam
return -1;
}
m_SPForwards.push_back(pForward);
m_SPForwards.append(pForward);
}
return retVal;
@ -438,12 +487,25 @@ int CForwardMngr::registerSPForward(const char *funcName, AMX *amx, int numParam
bool CForwardMngr::isIdValid(int id) const
{
return (id >= 0) && ((id & 1) ? (static_cast<size_t>(id >> 1) < m_SPForwards.size()) : (static_cast<size_t>(id >> 1) < m_Forwards.size()));
return (id >= 0) && ((id & 1) ? (static_cast<size_t>(id >> 1) < m_SPForwards.length()) : (static_cast<size_t>(id >> 1) < m_Forwards.length()));
}
cell CForwardMngr::executeForwards(int id, cell *params)
{
int retVal = (id & 1) ? m_SPForwards[id >> 1]->execute(params, m_TmpArrays) : m_Forwards[id >> 1]->execute(params, m_TmpArrays);
int retVal;
if (id & 1)
{
CSPForward *fwd = m_SPForwards[id >> 1];
retVal = fwd->execute(params, m_TmpArrays);
if (fwd->m_ToDelete)
{
fwd->m_ToDelete = false;
unregisterSPForward(id);
}
} else {
retVal = m_Forwards[id >> 1]->execute(params, m_TmpArrays);
}
m_TmpArraysNum = 0;
return retVal;
@ -483,23 +545,25 @@ ForwardParam CForwardMngr::getParamType(int id, int paramNum) const
void CForwardMngr::clear()
{
for (ForwardVec::iterator iter = m_Forwards.begin(); iter != m_Forwards.end(); ++iter)
size_t i;
for (i = 0; i < m_Forwards.length(); ++i)
{
delete *iter;
delete m_Forwards[i];
}
SPForwardVec::iterator spIter;
for (spIter = m_SPForwards.begin(); spIter != m_SPForwards.end(); ++spIter)
for (i = 0; i < m_SPForwards.length(); ++i)
{
delete (*spIter);
delete m_SPForwards[i];
}
m_Forwards.clear();
m_SPForwards.clear();
while (!m_FreeSPForwards.empty())
{
m_FreeSPForwards.pop();
}
m_TmpArraysNum = 0;
}
@ -513,10 +577,51 @@ void CForwardMngr::unregisterSPForward(int id)
{
//make sure the id is valid
if (!isIdValid(id) || m_SPForwards.at(id >> 1)->isFree)
{
return;
}
m_SPForwards.at(id >> 1)->isFree = true;
m_FreeSPForwards.push(id);
CSPForward *fwd = m_SPForwards.at(id >> 1);
if (fwd->m_InExec)
{
fwd->m_ToDelete = true;
} else {
fwd->isFree = true;
m_FreeSPForwards.push(id);
}
}
int CForwardMngr::duplicateSPForward(int id)
{
if (!isIdValid(id) || m_SPForwards.at(id >> 1)->isFree)
{
return -1;
}
CSPForward *fwd = m_SPForwards.at(id >> 1);
return registerSPForward(fwd->m_Func, fwd->m_Amx, fwd->m_NumParams, fwd->m_ParamTypes);
}
int CForwardMngr::isSameSPForward(int id1, int id2)
{
if (!isIdValid(id1) || !isIdValid(id2))
{
return false;
}
CSPForward *fwd1 = m_SPForwards.at(id1 >> 1);
CSPForward *fwd2 = m_SPForwards.at(id2 >> 1);
if (fwd1->isFree || fwd2->isFree)
{
return false;
}
return ((fwd1->m_Amx == fwd2->m_Amx)
&& (fwd1->m_Func == fwd2->m_Func)
&& (fwd1->m_NumParams == fwd2->m_NumParams));
}
int registerForwardC(const char *funcName, ForwardExecType et, cell *list, size_t num)
@ -524,7 +629,9 @@ int registerForwardC(const char *funcName, ForwardExecType et, cell *list, size_
ForwardParam params[FORWARD_MAX_PARAMS];
for (size_t i=0; i<num; i++)
{
params[i] = static_cast<ForwardParam>(list[i]);
}
return g_forwards.registerForward(funcName, et, num, params);
}
@ -638,12 +745,25 @@ cell executeForwards(int id, ...)
va_list argptr;
va_start(argptr, id);
ForwardParam param_type;
for (int i = 0; i < paramsNum && i < FORWARD_MAX_PARAMS; ++i)
{
if (g_forwards.getParamType(id, i) == FP_FLOAT)
param_type = g_forwards.getParamType(id, i);
if (param_type == FP_FLOAT)
{
REAL tmp = (REAL)va_arg(argptr, double); // floats get converted to doubles
params[i] = *(cell*)&tmp;
params[i] = amx_ftoc(tmp);
}
else if(param_type == FP_FLOAT_BYREF)
{
REAL *tmp = reinterpret_cast<REAL *>(va_arg(argptr, double*));
params[i] = reinterpret_cast<cell>(tmp);
}
else if(param_type == FP_CELL_BYREF)
{
cell *tmp = reinterpret_cast<cell *>(va_arg(argptr, cell*));
params[i] = reinterpret_cast<cell>(tmp);
}
else
params[i] = (cell)va_arg(argptr, cell);

View File

@ -1,33 +1,11 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
/*
CForward.h
@ -68,6 +46,8 @@ enum ForwardParam
FP_STRING, // string
FP_STRINGEX, // string; will be updated to the last function's value
FP_ARRAY, // array; use the return value of prepareArray.
FP_CELL_BYREF, // cell; pass by reference
FP_FLOAT_BYREF, // float; pass by reference
};
// for prepareArray
@ -93,7 +73,7 @@ class CForward
const char *m_FuncName;
ForwardExecType m_ExecType;
int m_NumParams;
String m_Name;
ke::AString m_Name;
struct AMXForward
{
@ -101,7 +81,7 @@ class CForward
int func;
};
typedef CVector<AMXForward> AMXForwardList;
typedef ke::Vector<AMXForward> AMXForwardList;
AMXForwardList m_Funcs;
ForwardParam m_ParamTypes[FORWARD_MAX_PARAMS];
@ -119,12 +99,12 @@ public:
int getFuncsNum() const
{
return m_Funcs.size();
return m_Funcs.length();
}
const char *getFuncName() const
{
return m_Name.c_str();
return m_Name.chars();
}
ForwardParam getParamType(int paramId) const
@ -139,7 +119,7 @@ public:
// Single plugin forward
class CSPForward
{
const char *m_FuncName;
friend class CForwardMngr;
int m_NumParams;
ForwardParam m_ParamTypes[FORWARD_MAX_PARAMS];
@ -147,7 +127,9 @@ class CSPForward
int m_Func;
bool m_HasFunc;
String m_Name;
ke::AString m_Name;
bool m_InExec;
bool m_ToDelete;
public:
bool isFree;
@ -170,7 +152,7 @@ public:
const char *getFuncName() const
{
return m_Name.c_str();
return m_Name.chars();
}
ForwardParam getParamType(int paramId) const
@ -184,8 +166,8 @@ public:
class CForwardMngr
{
typedef CVector<CForward*> ForwardVec;
typedef CVector<CSPForward*> SPForwardVec;
typedef ke::Vector<CForward*> ForwardVec;
typedef ke::Vector<CSPForward*> SPForwardVec;
typedef CStack<int> FreeSPVec; // Free SP Forwards
ForwardVec m_Forwards;
@ -210,6 +192,8 @@ public:
// Unregister single plugin forward
void unregisterSPForward(int id);
int duplicateSPForward(int id);
int isSameSPForward(int id1, int id2);
// execute forward
cell executeForwards(int id, cell *params);

61
amxmodx/CFrameAction.h Normal file
View File

@ -0,0 +1,61 @@
#ifndef FRAMEACTION_H
#define FRAMEACTION_H
#include "amxmodx.h"
#include <amtl/am-deque.h>
#include <amtl/am-autoptr.h>
class CFrameActionMngr
{
public:
class CFrameAction
{
public:
CFrameAction(int callbackForward, cell callbackData) :
m_callbackForward(callbackForward),
m_callbackData(callbackData)
{
}
~CFrameAction()
{
unregisterSPForward(m_callbackForward);
}
void Execute()
{
executeForwards(m_callbackForward, m_callbackData);
}
public:
int m_callbackForward;
cell m_callbackData;
};
public:
void AddFrameAction(int callbackForward, cell callbackData)
{
m_requestedFrames.append(new CFrameAction(callbackForward, callbackData));
}
void ExecuteFrameCallbacks()
{
// In case a frame callback requests another frame, newly added frames won't be executed this way
int callbacksToRun = m_requestedFrames.length();
while (callbacksToRun--)
{
ke::AutoPtr<CFrameAction> action = ke::Move(m_requestedFrames.front());
m_requestedFrames.popFront();
action->Execute();
}
}
private:
ke::Deque<ke::AutoPtr<CFrameAction>> m_requestedFrames;
};
#endif // FRAMEACTION_H

1050
amxmodx/CGameConfigs.cpp Normal file

File diff suppressed because it is too large Load Diff

198
amxmodx/CGameConfigs.h Normal file
View File

@ -0,0 +1,198 @@
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#ifndef _INCLUDE_GAMECONFIG_H_
#define _INCLUDE_GAMECONFIG_H_
#include <IGameConfigs.h>
#include "CLibrarySys.h"
#include <amtl/am-autoptr.h>
#include <amtl/am-vector.h>
#include <amtl/am-string.h>
#include <amtl/am-refcounting.h>
#include <sm_stringhashmap.h>
#include <sm_namehashset.h>
class CGameConfig
:
public ITextListener_SMC,
public IGameConfig,
public ke::Refcounted <CGameConfig>
{
friend class CGameConfigManager;
public:
CGameConfig(const char *file);
~CGameConfig();
public:
bool Reparse(char *error, size_t maxlength);
bool EnterFile(const char *file, char *error, size_t maxlength);
public: // ITextListener_SMC
SMCResult ReadSMC_NewSection(const SMCStates *states, const char *name);
SMCResult ReadSMC_KeyValue(const SMCStates *states, const char *key, const char *value);
SMCResult ReadSMC_LeavingSection(const SMCStates *states);
public: // IGameConfig
const char* GetKeyValue(const char *key);
bool GetOffset(const char *key, TypeDescription *value);
bool GetOffsetByClass(const char *classname, const char *key, TypeDescription *value);
bool GetMemSig(const char *key, void **addr);
bool GetAddress(const char *key, void **addr);
public: // NameHashSet
static inline bool matches(const char *key, const CGameConfig *value)
{
return strcmp(key, value->m_File) == 0;
}
private:
struct OffsetClass
{
StringHashMap<TypeDescription> list;
};
typedef StringHashMap<ke::AutoPtr<OffsetClass>> OffsetClassMap;
typedef StringHashMap<TypeDescription> OffsetMap;
char m_File[PLATFORM_MAX_PATH];
char m_CurrentPath[PLATFORM_MAX_PATH];
OffsetMap m_Offsets;
OffsetClassMap m_OffsetsByClass;
StringHashMap<ke::AString> m_Keys;
StringHashMap<void*> m_Sigs;
int m_ParseState;
unsigned int m_IgnoreLevel;
char m_Class[64];
char m_Offset[64];
char m_Game[256];
bool m_FoundOffset;
bool m_MatchedClasses;
bool m_ShouldBeReadingDefault;
bool m_HadGame;
bool m_MatchedGame;
bool m_HadEngine;
bool m_MatchedEngine;
bool m_MatchedPlatform;
unsigned int m_CustomLevel;
ITextListener_SMC* m_CustomHandler;
struct AddressConf
{
char m_SignatureName[64];
size_t m_ReadCount;
int m_ReadBytes[8];
AddressConf(const char *sigName, size_t sigLength, size_t readCount, int *read);
AddressConf() {}
};
char m_Address[64];
char m_AddressSignature[64];
int m_AddressReadCount;
int m_AddressRead[8];
StringHashMap<AddressConf> m_Addresses;
char m_pEngine[64];
};
class CGameMasterReader : public ITextListener_SMC
{
public:
void ReadSMC_ParseStart();
SMCResult ReadSMC_NewSection(const SMCStates *states, const char *name);
SMCResult ReadSMC_KeyValue(const SMCStates *states, const char *key, const char *value);
SMCResult ReadSMC_LeavingSection(const SMCStates *states);
public:
ke::Vector<ke::AString>* m_FileList;
unsigned int m_State;
unsigned int m_IgnoreLevel;
char m_CurrentPath[PLATFORM_MAX_PATH];
bool m_HadEngine;
bool m_MatchedEngine;
bool m_HadGame;
bool m_MatchedGame;
};
class CGameConfigManager : public IGameConfigManager
{
public:
CGameConfigManager();
~CGameConfigManager();
public: // IGameConfigManager
bool LoadGameConfigFile(const char *file, IGameConfig **pConfig, char *error, size_t maxlength);
void CloseGameConfigFile(IGameConfig *cfg);
void AddUserConfigHook(const char *sectionname, ITextListener_SMC *listener);
void RemoveUserConfigHook(const char *sectionname, ITextListener_SMC *listener);
public:
void OnAmxxStartup();
void RemoveCachedConfig(CGameConfig *config);
private:
NameHashSet<CGameConfig*> m_Lookup;
public:
StringHashMap<ITextListener_SMC*> m_customHandlers;
};
#define GET_OFFSET(classname, member) \
static int member = -1; \
if (member == -1) \
{ \
TypeDescription type; \
if (!CommonConfig->GetOffsetByClass(classname, #member, &type) || type.fieldOffset < 0)\
{ \
LogError(amx, AMX_ERR_NATIVE, "Invalid %s offset. Native %s is disabled", #member, __FUNCTION__);\
return 0; \
} \
member = type.fieldOffset; \
}
#define GET_OFFSET_NO_ERROR(classname, member) \
static int member = -1; \
if (member == -1) \
{ \
TypeDescription type; \
if (!CommonConfig->GetOffsetByClass(classname, #member, &type) || type.fieldOffset < 0)\
{ \
return; \
} \
member = type.fieldOffset; \
}
extern CGameConfigManager ConfigManager;
extern IGameConfig *CommonConfig;
#endif // _INCLUDE_GAMECONFIG_H_

View File

@ -1,43 +1,17 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#include <stdarg.h>
#include "amxmodx.h"
#include "CLang.h"
#include "format.h"
#include "amxmod_compat.h"
#ifdef __linux__
#define _snprintf snprintf
#endif
#include "ITextParsers.h"
#define LITIDX_NONE 0
#define LITIDX_BRACKET 1
@ -49,22 +23,27 @@
#define INSERT_NEWLINE 4
template<>
int Compare<String>(const String &k1, const String &k2)
int Compare<ke::AString>(const ke::AString &k1, const ke::AString &k2)
{
return k1.compare(k2.c_str());
return k1.compare(k2);
}
template<>
int CompareAlt<char const *, String>(char const * const &k1, String const &k2)
int CompareAlt<char const *, ke::AString>(char const * const &k1, ke::AString const &k2)
{
return strcmp(k1, k2.c_str());
return k2.compare(k1);
}
template<>
int CompareAlt<ke::AString, ke::AString>(ke::AString const &k1, ke::AString const &k2)
{
return k1.compare(k2);
}
template<>
int HashFunction<String>(const String &k)
int HashFunction<ke::AString>(const ke::AString &k)
{
unsigned long hash = 5381;
register const char *str = k.c_str();
register const char *str = k.chars();
register char c;
while ((c = *str++))
{
@ -86,6 +65,20 @@ int HashAlt<const char *>(char const * const &k)
return hash;
}
template<>
int HashAlt<ke::AString>(ke::AString const &k)
{
unsigned long hash = 5381;
register const char *str = k.chars();
register char c;
while ((c = *str++))
{
hash = ((hash << 5) + hash) + c; // hash*33 + c
}
return hash;
}
template<>
int HashFunction<int>(const int &k)
{
@ -95,7 +88,7 @@ int HashFunction<int>(const int &k)
template<>
int Compare<int>(const int &k1, const int &k2)
{
return (k1-k2);
return (k1 - k2);
}
// strip the whitespaces at the beginning and the end of a string
@ -108,7 +101,7 @@ size_t CLangMngr::strip(char *str, char *newstr, bool makelower)
int flag = 0;
size_t strln = strlen(str);
for (i = strln - 1; i >= 0; i--)
for (i = strln - 1; i < strln; i--)
{
if (str[i] == '\n' || str[i] == ' ' || str[i] == '\t')
{
@ -167,7 +160,7 @@ void CLangMngr::CLang::AddEntry(int key, const char *definition)
m_entries++;
}
d.definition = new String(definition);
d.definition = new ke::AString(definition);
}
CLangMngr::CLang::~CLang()
@ -190,21 +183,21 @@ void CLangMngr::CLang::Clear()
m_entries = 0;
}
void CLangMngr::CLang::MergeDefinitions(CQueue<sKeyDef> &vec)
void CLangMngr::CLang::MergeDefinitions(ke::Vector<sKeyDef> &vec)
{
String *pDef;
ke::AutoString *pDef;
int key = -1;
while (!vec.empty())
{
key = vec.front().key;
pDef = vec.front().definition;
auto keydef = vec.popCopy();
AddEntry(key, pDef->c_str());
key = keydef.key;
pDef = keydef.definition;
delete vec.front().definition;
AddEntry(key, pDef->ptr());
vec.pop();
delete pDef;
}
}
@ -218,7 +211,8 @@ const char * CLangMngr::CLang::GetDef(int key, int &status)
return NULL;
}
return def.definition->c_str();
status = 0;
return def.definition->chars();
}
int CLangMngr::CLang::Entries()
@ -228,15 +222,6 @@ int CLangMngr::CLang::Entries()
/******** CLangMngr *********/
inline String &make_string(const char *str)
{
static String g_temp;
g_temp.assign(str);
return g_temp;
}
CLangMngr::CLangMngr()
{
Clear();
@ -244,15 +229,15 @@ CLangMngr::CLangMngr()
const char * CLangMngr::GetKey(int key)
{
if (key < 0 || key >= (int)KeyList.size())
if (key < 0 || key >= (int)KeyList.length())
return NULL;
return KeyList[key]->c_str();
return KeyList[key]->chars();
}
int CLangMngr::GetKeyEntry(const char *key)
{
keytbl_val &val = KeyTable[key];
keytbl_val &val = KeyTable[ke::AString(key)];
return val.index;
}
@ -260,22 +245,21 @@ int CLangMngr::GetKeyEntry(const char *key)
int CLangMngr::AddKeyEntry(const char *key)
{
keytbl_val val;
val.index = static_cast<int>(KeyList.size());
val.index = static_cast<int>(KeyList.length());
String *pString = new String(key);
KeyList.push_back(pString);
KeyList.append(new ke::AString(key));
KeyTable[key] = val;
KeyTable[ke::AString(key)] = val;
return val.index;
}
int CLangMngr::AddKeyEntry(String &key)
int CLangMngr::AddKeyEntry(ke::AString &key)
{
return AddKeyEntry(key.c_str());
return AddKeyEntry(key.chars());
}
int CLangMngr::GetKeyEntry(String &key)
int CLangMngr::GetKeyEntry(ke::AString &key)
{
keytbl_val &val = KeyTable[key];
@ -288,232 +272,271 @@ char * CLangMngr::FormatAmxString(AMX *amx, cell *params, int parm, int &len)
static char outbuf[4096];
cell *addr = get_amxaddr(amx, params[parm++]);
if (amx->flags & AMX_FLAG_OLDFILE)
{
if (*addr & BCOMPAT_TRANSLATE_BITS)
{
const char *key, *def;
if (!translate_bcompat(amx, addr, &key, &def))
{
goto normal_string;
}
len = atcprintf(outbuf, sizeof(outbuf)-1, def, amx, params, &parm);
} else {
goto normal_string;
}
} else {
normal_string:
len = atcprintf(outbuf, sizeof(outbuf)-1, addr, amx, params, &parm);
}
len = atcprintf(outbuf, sizeof(outbuf)-1, addr, amx, params, &parm);
return outbuf;
}
void CLangMngr::MergeDefinitions(const char *lang, CQueue<sKeyDef> &tmpVec)
void CLangMngr::MergeDefinitions(const char *lang, ke::Vector<sKeyDef> &tmpVec)
{
CLang * language = GetLang(lang);
if (language)
language->MergeDefinitions(tmpVec);
}
void reparse_newlines_and_color(char* def)
{
size_t len = strlen(def);
int offs = 0;
int c;
if (!len)
return;
for (size_t i = 0; i < len; i++)
{
c = def[i];
if (c == '^' && (i != len - 1))
{
c = def[++i];
if (c == 'n' || c == 't' || (c >= '1' && c <= '4'))
{
switch (c)
{
case '1': c = '\x01'; break;
case '2': c = '\x02'; break;
case '3': c = '\x03'; break;
case '4': c = '\x04'; break;
case 'n': c = '\n'; break;
case 't': c = '\t'; break;
}
if (!g_bmod_cstrike && (c >= '1' && c <= '4')) // remove completely these two characters if not under CS
{
offs += 2;
continue;
}
offs++;
}
}
def[i - offs] = c;
}
def[len-offs] = '\0';
}
struct LangFileData
{
void reset()
{
multiLine = false;
*language = '\0';
*valueBuffer = '\0';
clearEntry();
}
void clearEntry()
{
entry.key = -1;
entry.definition = nullptr;
}
bool multiLine;
char language[3];
char valueBuffer[512];
ke::AString currentFile;
ke::AString lastKey;
ke::Vector<sKeyDef> defsQueue;
sKeyDef entry;
} Data;
void CLangMngr::ReadINI_ParseStart()
{
Data.reset();
}
bool CLangMngr::ReadINI_NewSection(const char *section, bool invalid_tokens, bool close_bracket, bool extra_tokens, unsigned int *curtok)
{
if (Data.multiLine)
{
AMXXLOG_Log("New section, unterminated block (file \"%s\" key \"%s\" lang \"%s\")", Data.currentFile.chars(), Data.lastKey.chars(), Data.language);
Data.clearEntry();
}
if (!Data.defsQueue.empty())
{
MergeDefinitions(Data.language, Data.defsQueue);
}
Data.reset();
Data.language[0] = section[0];
Data.language[1] = section[1];
Data.language[2] = '\0';
return true;
}
bool CLangMngr::ReadINI_KeyValue(const char *key, const char *value, bool invalid_tokens, bool equal_token, bool quotes, unsigned int *curtok)
{
bool colons_token = (key[strlen(key) - 1] == ':');
if (!Data.multiLine)
{
Data.lastKey = key;
if (colons_token || equal_token)
{
int iKey = GetKeyEntry(key);
if (iKey == -1)
{
iKey = AddKeyEntry(key);
}
if (equal_token)
{
if(value == nullptr) // Support empty value
Data.valueBuffer[0] = '\0';
else
strncopy(Data.valueBuffer, value, sizeof(Data.valueBuffer));
reparse_newlines_and_color(Data.valueBuffer);
Data.entry.key = iKey;
Data.entry.definition = new ke::AutoString;
*Data.entry.definition = Data.valueBuffer;
Data.defsQueue.append(Data.entry);
Data.clearEntry();
}
else if (!value && colons_token)
{
Data.entry.key = iKey;
Data.entry.definition = new ke::AutoString;
Data.multiLine = true;
}
}
else
{
AMXXLOG_Log("Invalid multi-lingual line (file \"%s\" key \"%s\" lang \"%s\")", Data.currentFile.chars(), Data.lastKey.chars(), Data.language);
}
}
else
{
if (!value && colons_token)
{
strncopy(Data.valueBuffer, Data.entry.definition->ptr(), sizeof(Data.valueBuffer));
reparse_newlines_and_color(Data.valueBuffer);
*Data.entry.definition = Data.valueBuffer;
Data.defsQueue.append(Data.entry);
Data.clearEntry();
Data.multiLine = false;
}
else
{
if (!Data.entry.definition)
{
Data.entry.definition = new ke::AutoString();
}
*Data.entry.definition = *Data.entry.definition + key;
}
}
return true;
}
void CLangMngr::ReadINI_ParseEnd(bool halted)
{
if (!Data.defsQueue.empty())
{
MergeDefinitions(Data.language, Data.defsQueue);
}
}
//this is the file parser for dictionary text files
// -- BAILOPAN
int CLangMngr::MergeDefinitionFile(const char *file)
{
FILE *fp = fopen(file, "rt");
if (!fp)
/** Tries to open the file. */
struct stat fileStat;
if (stat(file, &fileStat))
{
CVector<md5Pair *>::iterator iter;
for (iter = FileList.begin(); iter != FileList.end(); ++iter)
{
if ((*iter)->file.compare(file) == 0)
{
char buf[33] = {0};
(*iter)->val.assign(buf);
break;
}
}
FileList.remove(file);
AMXXLOG_Log("[AMXX] Failed to open dictionary file: %s", file);
return 0;
}
MD5 md5;
md5.update(fp); // closes for us
md5.finalize();
char md5buffer[33];
md5.hex_digest(md5buffer);
bool foundFlag = false;
CVector<md5Pair *>::iterator iter;
for (iter = FileList.begin(); iter != FileList.end(); ++iter)
/** Checks if there is an existing entry with same time stamp. */
time_t timeStamp;
if (FileList.retrieve(file, &timeStamp) && fileStat.st_mtime == timeStamp)
{
if ((*iter)->file.compare(file) == 0)
{
if ((*iter)->val.compare(md5buffer) == 0)
{
return -1;
} else {
(*iter)->val.assign(md5buffer);
break;
}
foundFlag = true;
}
return -1;
}
if (!foundFlag)
{
md5Pair *p = new md5Pair;
p->file.assign(file);
p->val.assign(md5buffer);
FileList.push_back(p);
}
/** If yes, it either means that the entry doesn't exist or the existing entry needs to be updated. */
FileList.replace(file, fileStat.st_mtime);
fp = fopen(file, "rt");
if (!fp)
Data.currentFile = file;
unsigned int line, col;
bool result = textparsers->ParseFile_INI(file, static_cast<ITextListener_INI*>(this), &line, &col, false);
if (!result)
{
AMXXLOG_Log("[AMXX] Failed to re-open dictionary file: %s", file);
return 0;
}
// Allocate enough memory to store everything
bool multiline = 0;
int pos = 0, line = 0;
CQueue<sKeyDef> Defq;
String buf;
char language[3];
sKeyDef tmpEntry = {NULL, 0};
while (!feof(fp))
{
line++;
buf._fread(fp);
buf.trim();
if (buf[0] == 0)
continue;
if ((buf[0] == ';') || (buf[0] == '/' && buf[1] == '/'))
continue;
if (buf[0] == '[' && buf.size() >= 3)
{
if (multiline)
{
AMXXLOG_Log("New section, multiline unterminated (file \"%s\" line %d)", file, line);
tmpEntry.key = -1;
tmpEntry.definition = NULL;
}
if (!Defq.empty())
{
MergeDefinitions(language, Defq);
}
language[0] = buf[1];
language[1] = buf[2];
language[2] = 0;
} else {
if (!multiline)
{
pos = buf.find('=');
if (pos > String::npos)
{
String key;
key.assign(buf.substr(0, pos).c_str());
String def;
def.assign(buf.substr(pos + 1).c_str());
key.trim();
key.toLower();
int iKey = GetKeyEntry(key);
if (iKey == -1)
iKey = AddKeyEntry(key);
tmpEntry.key = iKey;
tmpEntry.definition = new String;
tmpEntry.definition->assign(def.c_str());
tmpEntry.definition->trim();
tmpEntry.definition->reparse_newlines();
Defq.push(tmpEntry);
tmpEntry.key = -1;
tmpEntry.definition = NULL;
} else {
pos = buf.find(':');
if (pos > String::npos)
{
String key;
key.assign(buf.substr(0, pos).c_str());;
key.trim();
key.toLower();
int iKey = GetKeyEntry(key);
if (iKey == -1)
iKey = AddKeyEntry(key);
tmpEntry.key = iKey;
tmpEntry.definition = new String;
multiline = true;
} else {
//user typed a line with no directives
AMXXLOG_Log("Invalid multi-lingual line (file \"%s\" line %d)", file, line);
}
}
} else {
if (buf[0] == ':')
{
tmpEntry.definition->reparse_newlines();
Defq.push(tmpEntry);
tmpEntry.key = -1;
tmpEntry.definition = NULL;
multiline = false;
} else {
if (!tmpEntry.definition)
tmpEntry.definition = new String();
tmpEntry.definition->append(buf);
}
} // if !multiline
} //if - main
}
// merge last section
if (!Defq.empty())
{
MergeDefinitions(language, Defq);
}
fclose(fp);
return 1;
}
// Find a CLang by name, if not found, add it
CLangMngr::CLang * CLangMngr::GetLang(const char *name)
{
LangVecIter iter;
for (iter = m_Languages.begin(); iter != m_Languages.end(); ++iter)
for (size_t iter = 0; iter < m_Languages.length(); ++iter)
{
if (strcmp((*iter)->GetName(), name) == 0)
return (*iter);
if (strcmp(m_Languages[iter]->GetName(), name) == 0)
return m_Languages[iter];
}
CLang *p = new CLang(name);
p->SetMngr(this);
m_Languages.push_back(p);
m_Languages.append(p);
return p;
}
// Find a CLang by name, if not found, return NULL
CLangMngr::CLang * CLangMngr::GetLangR(const char *name)
{
LangVecIter iter;
for (iter = m_Languages.begin(); iter != m_Languages.end(); ++iter)
for (size_t iter = 0; iter < m_Languages.length(); ++iter)
{
if (strcmp((*iter)->GetName(), name) == 0)
return (*iter);
if (strcmp(m_Languages[iter]->GetName(), name) == 0)
return m_Languages[iter];
}
return NULL;
return nullptr;
}
const char *CLangMngr::GetDef(const char *langName, const char *key, int &status)
{
CLang *lang = GetLangR(langName);
keytbl_val &val = KeyTable.AltFindOrInsert(key); //KeyTable[make_string(key)];
keytbl_val &val = KeyTable.AltFindOrInsert(ke::AString(key)); //KeyTable[make_string(key)];
if (lang == NULL)
{
status = ERR_BADLANG;
@ -522,18 +545,13 @@ const char *CLangMngr::GetDef(const char *langName, const char *key, int &status
status = ERR_BADKEY;
return NULL;
} else {
status = 0;
return lang->GetDef(val.index, status);
}
}
void CLangMngr::InvalidateCache()
{
for (size_t i = 0; i < FileList.size(); i++)
{
if (FileList[i])
delete FileList[i];
}
FileList.clear();
}
@ -548,19 +566,13 @@ void CLangMngr::Clear()
KeyTable.clear();
for (i = 0; i < m_Languages.size(); i++)
for (i = 0; i < m_Languages.length(); i++)
{
if (m_Languages[i])
delete m_Languages[i];
}
for (i = 0; i < FileList.size(); i++)
{
if (FileList[i])
delete FileList[i];
}
for (i = 0; i < KeyList.size(); i++)
for (i = 0; i < KeyList.length(); i++)
{
if (KeyList[i])
delete KeyList[i];
@ -573,21 +585,17 @@ void CLangMngr::Clear()
int CLangMngr::GetLangsNum()
{
return m_Languages.size();
return m_Languages.length();
}
const char *CLangMngr::GetLangName(int langId)
{
int i = 0;
LangVecIter iter;
for (iter = m_Languages.begin(); iter != m_Languages.end(); ++iter)
for (size_t iter = 0; iter < m_Languages.length(); ++iter)
{
if (i == langId)
if ((int)iter == langId)
{
return (*iter)->GetName();
return m_Languages[iter]->GetName();
}
i++;
}
return "";
@ -604,14 +612,13 @@ bool CLangMngr::LangExists(const char *langName)
break;
}
LangVecIter iter;
for (iter = m_Languages.begin(); iter != m_Languages.end(); ++iter)
for (size_t iter = 0; iter < m_Languages.length(); ++iter)
{
if (strcmp((*iter)->GetName(), buf) == 0)
if (strcmp(m_Languages[iter]->GetName(), buf) == 0)
{
return true;
}
}
return false;
}

View File

@ -1,38 +1,18 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#ifndef _INCLUDE_CLANG_H
#define _INCLUDE_CLANG_H
#include "sh_tinyhash.h"
#include "sm_stringhashmap.h"
#include <ITextParsers.h>
#define LANG_SERVER 0
#define LANG_PLAYER -1
@ -40,15 +20,9 @@
#define ERR_BADKEY 1 // Lang key not found
#define ERR_BADLANG 2 // Invalid lang
struct md5Pair
{
String file;
String val;
};
struct sKeyDef
{
String *definition;
ke::AutoString* definition;
int key;
};
@ -73,7 +47,7 @@ public:
~defentry()
{
}
String *definition;
ke::AString *definition;
};
struct keytbl_val
@ -84,7 +58,7 @@ struct keytbl_val
int index;
};
class CLangMngr
class CLangMngr : public ITextListener_INI
{
class CLang
{
@ -99,7 +73,7 @@ class CLangMngr
// Get the definition
const char *GetDef(int key, int &status);
// Add definitions to this language
void MergeDefinitions(CQueue <sKeyDef> & vec);
void MergeDefinitions(ke::Vector <sKeyDef> & vec);
// Reset this language
void Clear();
@ -129,20 +103,25 @@ class CLangMngr
};
public:
// Merge definitions into a language
void MergeDefinitions(const char *lang, CQueue <sKeyDef> &tmpVec);
void MergeDefinitions(const char *lang, ke::Vector <sKeyDef> &tmpVec);
public: // ITextListener_INI
void ReadINI_ParseStart();
void ReadINI_ParseEnd(bool halted);
bool ReadINI_NewSection(const char *section, bool invalid_tokens, bool close_bracket, bool extra_tokens, unsigned int *curtok);
bool ReadINI_KeyValue(const char *key, const char *value, bool invalid_tokens, bool equal_token, bool quotes, unsigned int *curtok);
private:
// strip lowercase; make lower if needed
static size_t strip(char *str, char *newstr, bool makelower = false);
typedef CVector<CLang*> LangVec;
typedef CVector<CLang*>::iterator LangVecIter;
typedef ke::Vector<CLang*> LangVec;
LangVec m_Languages;
CVector<md5Pair *> FileList;
CVector<String *> KeyList;
THash<String, keytbl_val> KeyTable;
StringHashMap<time_t> FileList;
ke::Vector<ke::AString *> KeyList;
THash<ke::AString, keytbl_val> KeyTable;
// Get a lang object (construct if needed)
CLang * GetLang(const char *name);
@ -160,12 +139,12 @@ public:
char *FormatAmxString(AMX *amx, cell *params, int parm, int &len);
void InvalidateCache();
// Get index
int GetKeyEntry(String &key);
int GetKeyEntry(ke::AString &key);
int GetKeyEntry(const char *key);
// Get key from index
const char *GetKey(int key);
// Add key
int AddKeyEntry(String &key);
int AddKeyEntry(ke::AString &key);
int AddKeyEntry(const char *key);
// Get the number of languages

388
amxmodx/CLibrarySys.cpp Normal file
View File

@ -0,0 +1,388 @@
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#include "CLibrarySys.h"
#include <amxmodx.h>
#include <amtl/os/am-fsutil.h>
#include <amtl/os/am-path.h>
#include <amtl/os/am-system-errors.h>
LibrarySystem g_LibSys;
/******************/
/* Directory Code */
/******************/
CDirectory::CDirectory(const char *path)
{
#if defined PLATFORM_WINDOWS
char newpath[PLATFORM_MAX_PATH];
ke::SafeSprintf(newpath, sizeof(newpath), "%s\\*.*", path);
m_dir = FindFirstFile(newpath, &m_fd);
if (!IsValid())
{
m_fd.cFileName[0] = '\0';
}
#elif defined PLATFORM_POSIX
m_dir = opendir(path);
if (IsValid())
{
m_ep = readdir(m_dir); // TODO: we need to read past "." and ".."!
ke::SafeSprintf(m_origpath, sizeof(m_origpath), "%s", path);
}
else
{
m_ep = nullptr;
}
#endif
}
CDirectory::~CDirectory()
{
if (IsValid())
{
#if defined PLATFORM_WINDOWS
FindClose(m_dir);
#elif defined PLATFORM_POSIX
closedir(m_dir);
#endif
}
}
DirHandle CDirectory::GetHandle()
{
return m_dir;
}
void CDirectory::NextEntry()
{
#if defined PLATFORM_WINDOWS
if (FindNextFile(m_dir, &m_fd) == 0)
{
FindClose(m_dir);
m_dir = INVALID_HANDLE_VALUE;
}
#elif defined PLATFORM_POSIX
if (!(m_ep = readdir(m_dir)))
{
closedir(m_dir);
m_dir = nullptr;
}
#endif
}
bool CDirectory::IsEntryValid()
{
return IsValid();
}
bool CDirectory::IsEntryDirectory()
{
#if defined PLATFORM_WINDOWS
return ((m_fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY);
#elif defined PLATFORM_POSIX
char temppath[PLATFORM_MAX_PATH];
ke::SafeSprintf(temppath, sizeof(temppath), "%s/%s", m_origpath, GetEntryName());
return ke::file::IsDirectory(temppath);
#endif
}
bool CDirectory::IsEntryFile()
{
#if defined PLATFORM_WINDOWS
return !(m_fd.dwFileAttributes & (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_DEVICE));
#elif defined PLATFORM_POSIX
char temppath[PLATFORM_MAX_PATH];
ke::SafeSprintf(temppath, sizeof(temppath), "%s/%s", m_origpath, GetEntryName());
return ke::file::IsFile(temppath);
#endif
}
const char* CDirectory::GetEntryName()
{
#if defined PLATFORM_WINDOWS
return m_fd.cFileName;
#elif defined PLATFORM_POSIX
return m_ep ? m_ep->d_name : "";
#endif
}
bool CDirectory::MoreFiles()
{
return IsValid();
}
bool CDirectory::IsValid()
{
#if defined PLATFORM_WINDOWS
return (m_dir != INVALID_HANDLE_VALUE);
#elif defined PLATFORM_POSIX
return (m_dir != nullptr);
#endif
}
/****************/
/* Library Code */
/****************/
CLibrary::CLibrary(ke::RefPtr<ke::SharedLib> lib) : lib_(lib)
{}
void CLibrary::CloseLibrary()
{
delete this;
}
void *CLibrary::GetSymbolAddress(const char* symname)
{
return lib_->lookup(symname);
}
/***********************/
/* Library System Code */
/***********************/
bool LibrarySystem::PathExists(const char *path)
{
return ke::file::PathExists(path);
}
bool LibrarySystem::IsPathFile(const char* path)
{
return ke::file::IsFile(path);
}
bool LibrarySystem::IsPathDirectory(const char* path)
{
return ke::file::IsDirectory(path);
}
CDirectory *LibrarySystem::OpenDirectory(const char* path)
{
CDirectory* dir = new CDirectory(path);
if (!dir->IsValid())
{
delete dir;
return nullptr;
}
return dir;
}
CLibrary* LibrarySystem::OpenLibrary(const char* path, char* error, size_t maxlength)
{
ke::RefPtr<ke::SharedLib> lib = ke::SharedLib::Open(path, error, maxlength);
if (!lib)
{
return nullptr;
}
return new CLibrary(lib);
}
void LibrarySystem::GetPlatformError(char* error, size_t maxlength)
{
#if defined PLATFORM_WINDOWS
return GetPlatformErrorEx(GetLastError(), error, maxlength);
#elif defined PLATFORM_POSIX
return GetPlatformErrorEx(errno, error, maxlength);
#endif
}
void LibrarySystem::GetPlatformErrorEx(int code, char* error, size_t maxlength)
{
if (error && maxlength)
{
ke::FormatSystemErrorCode(code, error, maxlength);
}
}
void LibrarySystem::GetLoaderError(char* buffer, size_t maxlength)
{
ke::FormatSystemError(buffer, maxlength);
}
void LibrarySystem::CloseDirectory(CDirectory *dir)
{
delete dir;
}
size_t LibrarySystem::PathFormat(char* buffer, size_t len, const char* fmt, ...)
{
va_list ap;
va_start(ap, fmt);
size_t mylen = ke::path::FormatVa(buffer, len, fmt, ap);
va_end(ap);
return mylen;
}
char* LibrarySystem::PathFormat(const char* fmt, ...)
{
static char buffer[PLATFORM_MAX_PATH];
va_list ap;
va_start(ap, fmt);
ke::path::FormatVa(buffer, sizeof(buffer), fmt, ap);
va_end(ap);
return buffer;
}
const char* LibrarySystem::GetFileExtension(const char* filename)
{
size_t len, end;
len = strlen(filename);
/* Minimum string length for filename with ext would be 3; example: a.a */
if (len < 3)
{
return nullptr;
}
end = len - 1;
for (size_t i = end; i <= end; i--)
{
if (filename[i] == PLATFORM_SEP_CHAR || filename[i] == PLATFORM_SEP_ALTCHAR)
{
break;
}
if (filename[i] == '.' && i != end && i != 0)
{
return &filename[++i];
}
}
return nullptr;
}
bool LibrarySystem::CreateFolder(const char* path)
{
return ke::file::CreateDirectory(path, 0775);
}
size_t LibrarySystem::GetFileFromPath(char* buffer, size_t maxlength, const char* path)
{
size_t length = strlen(path);
for (size_t i = length - 1; i <= length - 1; i--)
{
if (path[i] == '/'
#if defined PLATFORM_WINDOWS
|| path[i] == '\\'
#endif
)
{
return ke::SafeSprintf(buffer, maxlength, "%s", &path[i + 1]);
}
}
/* We scanned and found no path separator */
return ke::SafeSprintf(buffer, maxlength, "%s", path);
}
bool LibrarySystem::FileTime(const char* path, FileTimeType type, time_t* pTime)
{
struct stat s;
if (stat(path, &s) != 0)
{
return false;
}
switch (type)
{
case FileTime_LastAccess:
{
*pTime = s.st_atime;
break;
}
case FileTime_Created:
{
*pTime = s.st_ctime;
break;
}
case FileTime_LastChange:
{
*pTime = s.st_mtime;
break;
}
default:
{
return false;
}
}
return true;
}
bool LibrarySystem::DoesPlatformMatch(const char *platform)
{
return strcmp(platform, PLATFORM_NAME) == 0;
}
bool LibrarySystem::IsPlatformCompatible(const char *platform, bool *hadPrimaryMatch)
{
if (DoesPlatformMatch(platform))
{
#if defined PLATFORM_COMPAT_ALT
*hadPrimaryMatch = true;
#endif
return true;
}
#if defined PLATFORM_COMPAT_ALT
/* If entry hasn't been found for the primary platform name, check for compatible alternate */
if (!*hadPrimaryMatch)
{
return strcmp(platform, PLATFORM_COMPAT_ALT) == 0;
}
#endif
return false;
}

107
amxmodx/CLibrarySys.h Normal file
View File

@ -0,0 +1,107 @@
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#ifndef _INCLUDE_LIBRARY_SYS_H_
#define _INCLUDE_LIBRARY_SYS_H_
#include "amx.h" // cell
#include <platform_helpers.h>
#include <amtl/os/am-shared-library.h>
enum FileTimeType
{
FileTime_LastAccess = 0, /* Last access (not available on FAT) */
FileTime_Created = 1, /* Creation (not available on FAT) */
FileTime_LastChange = 2, /* Last modification */
};
class CDirectory
{
public:
CDirectory(const char* path);
~CDirectory();
public:
bool MoreFiles();
void NextEntry();
const char* GetEntryName();
bool IsEntryDirectory();
bool IsEntryFile();
bool IsEntryValid();
public:
bool IsValid();
DirHandle GetHandle();
private:
#if defined PLATFORM_WINDOWS
HANDLE m_dir;
WIN32_FIND_DATAA m_fd;
#elif defined PLATFORM_POSIX
DIR* m_dir;
struct dirent* m_ep;
char m_origpath[PLATFORM_MAX_PATH];
#endif
};
class CLibrary
{
public:
CLibrary(ke::RefPtr<ke::SharedLib> lib);
public:
void CloseLibrary();
void *GetSymbolAddress(const char* symname);
private:
ke::RefPtr<ke::SharedLib> lib_;
};
class LibrarySystem
{
public:
CLibrary* OpenLibrary(const char* path, char* error = nullptr, size_t maxlength = 0);
CDirectory* OpenDirectory(const char* path);
void CloseDirectory(CDirectory *dir);
bool PathExists(const char* path);
bool IsPathFile(const char* path);
bool IsPathDirectory(const char* path);
void GetPlatformError(char* error, size_t maxlength);
void GetPlatformErrorEx(int code, char* error, size_t maxlength);
size_t PathFormat(char* buffer, size_t len, const char* fmt, ...);
char* PathFormat(const char* fmt, ...);
const char* GetFileExtension(const char* filename);
bool CreateFolder(const char* path);
size_t GetFileFromPath(char* buffer, size_t maxlength, const char* path);
bool FileTime(const char* path, FileTimeType type, time_t* pTime);
void GetLoaderError(char* buffer, size_t maxlength);
bool DoesPlatformMatch(const char* platform);
bool IsPlatformCompatible(const char *platform, bool *hadPrimaryMatch);
};
extern LibrarySystem g_LibSys;
#endif // _INCLUDE_LIBRARY_SYS_H_

View File

@ -1,329 +0,0 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
#ifndef CLIST_H
#define CLIST_H
// *****************************************************
// class CList
// *****************************************************
// Linked list
template <typename T, typename F = char* >
class CList
{
private:
// One list element
class CElement
{
T *m_pObject; // pointer to the object
CElement *m_pNext; // pointer to the next element
CElement *m_pPrev; // pointer to the previous element
public:
// dereference operator
T& operator* ()
{
return *m_pObject;
}
// constructor
CElement(T *pObj)
{
m_pObject = pObj;
m_pNext = NULL;
m_pPrev = NULL;
}
// destructor
~CElement()
{
delete m_pObject;
if (m_pNext)
m_pNext->m_pPrev = m_pPrev;
if (m_pPrev)
m_pPrev->m_pNext = m_pNext;
}
// returns object pointer
T *GetObj()
{
return m_pObject;
}
// returns next element pointer
CElement *GetNext()
{
return m_pNext;
}
// sets next element
void SetNext(CElement *newNext)
{
m_pNext = newNext;
}
// returns previous element pointer
CElement *GetPrev()
{
return m_pPrev;
}
// sets previous element
void SetPrev(CElement *newPrev)
{
m_pPrev = newPrev;
}
};
// CList<T, F> class
CElement *m_pHead; // head of the linked list
CElement *m_pTail; // tail of the linked list
public:
// iterator class
class iterator
{
friend class CList<T, F>;
CList<T, F> *m_pList; // The list that created this iterator
CElement *m_CurPos; // Current position in the list
public:
iterator()
{
m_pList = NULL;
m_CurPos = NULL;
}
// constructor based on list, element
iterator(CList<T, F> *pList, CElement *startPos)
{
m_pList = pList;
m_CurPos = startPos;
}
// constructor based on other iterator
iterator(const iterator &other)
{
m_pList = other.m_pList;
m_CurPos = other.m_CurPos;
}
// dereference operator
T & operator* () const
{
return *m_CurPos->GetObj();
}
T * operator-> () const
{
return m_CurPos->GetObj();
}
// validity check operator
inline operator bool () const
{
return m_pList != NULL && m_CurPos != NULL && m_CurPos->GetObj() != NULL;
}
// pre increment operator
inline iterator& operator ++ ()
{
m_CurPos = m_CurPos->GetNext();
return *this;
}
// post increment operator
inline iterator operator++(int)
{
iterator tmp(*this);
m_CurPos = m_CurPos->next;
return tmp;
}
// returns iterator that points to next element
iterator GetNext()
{
iterator tmp(*this);
return ++tmp;
}
iterator remove()
{
return m_pList->remove(*this);
}
iterator put(T *obj)
{
return m_pList->put(obj, *this);
}
};
CList<T, F>()
{
m_pHead = NULL;
m_pTail = NULL;
}
~CList<T, F>()
{
clear();
}
// removes the object referenced by where
// sets where to the next object
// returns an iterator pointing to the next object
iterator remove(iterator &where)
{
iterator tmp(where.GetNext());
if (where.m_CurPos == m_pHead)
m_pHead = where.m_CurPos->GetNext();
if (where.m_CurPos == m_pTail)
m_pTail = where.m_CurPos->GetPrev();
delete where.m_CurPos;
where = tmp;
return tmp;
}
// puts an element to the end of the list
// returns an iterator pointing to it
iterator put_back(T *pObj)
{
CElement *pTmp = new CElement(pObj);
if (!m_pHead)
{
m_pHead = pTmp;
m_pTail = pTmp;
} else {
pTmp->SetNext(NULL);
pTmp->SetPrev(m_pTail);
m_pTail->SetNext(pTmp);
m_pTail = pTmp;
}
return iterator(this, pTmp);
}
iterator put_front(T *pObj)
{
CElement *pTmp = new CElement(pObj);
if (!m_pHead)
{
m_pHead = pTmp;
m_pTail = pTmp;
} else {
pTmp->SetNext(m_pHead);
pTmp->SetPrev(NULL);
m_pHead->SetPrev(pTmp);
m_pHead = pTmp;
}
return iterator(this, pTmp);
}
// alias for put_back
iterator put(T *pObj)
{
return put_back(pObj);
}
// puts an element after where
// alters where to point to the new element
// returns an iterator pointing to the new element
iterator put(T *pObj, iterator &where)
{
CElement *pTmp = new CElement(pObj);
if (where.m_CurPos->GetNext())
where.m_CurPos->GetNext()->SetPrev(pTmp);
else // where = tail
m_pTail = pTmp;
pTmp->SetPrev(where.m_CurPos);
pTmp->SetNext(where.m_CurPos->GetNext());
where.m_CurPos->SetNext(pTmp);
return ++where;
}
iterator begin()
{
return iterator(this, m_pHead);
}
void clear()
{
iterator iter = begin();
while (iter) iter.remove();
}
iterator find(iterator startOn, const F &desc)
{
iterator iter = startOn;
while (iter)
{
if (*iter == desc)
break;
++iter;
}
return iter;
}
iterator find(const F &desc)
{
return find(begin(), desc);
}
int size()
{
iterator iter = begin();
int i = 0;
while (iter)
{
++i;
++iter;
}
return i;
}
};
#endif //CLIST_H

View File

@ -1,37 +1,17 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#include "amxmodx.h"
#include "CLogEvent.h"
NativeHandle<LogEventHook> LogEventHandles;
// *****************************************************
// class LogEventsMngr
// *****************************************************
@ -57,9 +37,9 @@ int LogEventsMngr::CLogCmp::compareCondition(const char* string)
logid = parent->logCounter;
if (in)
return result = strstr(string, text.c_str()) ? 0 : 1;
return result = strstr(string, text.chars()) ? 0 : 1;
return result = strcmp(string,text.c_str());
return result = strcmp(string,text.chars());
}
LogEventsMngr::CLogCmp* LogEventsMngr::registerCondition(char* filter)
@ -81,7 +61,7 @@ LogEventsMngr::CLogCmp* LogEventsMngr::registerCondition(char* filter)
while (c)
{
if ((c->pos == pos) && (c->in == in) && !strcmp(c->text.c_str(), filter))
if ((c->pos == pos) && (c->in == in) && !strcmp(c->text.chars(), filter))
return c;
c = c->next;
}
@ -111,7 +91,7 @@ void LogEventsMngr::CLogEvent::registerFilter(char* filter)
filters = new LogCond(cmp->pos, aa, filters);
}
void LogEventsMngr::setLogString(char* frmt, va_list& vaptr)
void LogEventsMngr::setLogString(const char* frmt, va_list& vaptr)
{
++logCounter;
int len = vsnprintf(logString, 255, frmt, vaptr);
@ -128,7 +108,7 @@ void LogEventsMngr::setLogString(char* frmt, va_list& vaptr)
logArgc = 0;
}
void LogEventsMngr::setLogString(char* frmt, ...)
void LogEventsMngr::setLogString(const char* frmt, ...)
{
++logCounter;
va_list logArgPtr;
@ -186,18 +166,37 @@ void LogEventsMngr::parseLogString()
}
}
LogEventsMngr::CLogEvent* LogEventsMngr::registerLogEvent(CPluginMngr::CPlugin* plugin, int func, int pos)
void LogEventsMngr::CLogEvent::setForwardState(ForwardState state)
{
m_State = state;
}
int LogEventsMngr::registerLogEvent(CPluginMngr::CPlugin* plugin, int func, int pos)
{
if (pos < 1 || pos > MAX_LOGARGS)
{
return 0;
}
arelogevents = true;
CLogEvent** d = &logevents[pos];
auto d = &logevents[pos];
while (*d)
{
d = &(*d)->next;
}
return *d = new CLogEvent(plugin, func, this);
auto logevent = new CLogEvent(plugin, func, this);
auto handle = LogEventHandles.create(logevent);
if (!handle)
{
return 0;
}
*d = logevent;
return handle;
}
void LogEventsMngr::executeLogEvents()
@ -206,6 +205,11 @@ void LogEventsMngr::executeLogEvents()
for (CLogEvent* a = logevents[logArgc]; a; a = a->next)
{
if (a->m_State != FSTATE_ACTIVE)
{
continue;
}
valid = true;
for (CLogEvent::LogCond* b = a->filters; b; b = b->next)
@ -249,6 +253,8 @@ void LogEventsMngr::clearLogEvents()
}
clearConditions();
LogEventHandles.clear();
}
void LogEventsMngr::clearConditions()

View File

@ -1,33 +1,11 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#ifndef LOGEVENTS_H
#define LOGEVENTS_H
@ -35,6 +13,7 @@
#define MAX_LOGARGS 12
#include <stdarg.h>
#include "natives_handles.h"
// *****************************************************
// class LogEventsMngr
@ -63,7 +42,7 @@ public:
friend class CLogEvent;
LogEventsMngr* parent;
String text;
ke::AString text;
int logid;
int pos;
@ -118,12 +97,15 @@ public:
LogCond *filters;
LogEventsMngr* parent;
ForwardState m_State;
CLogEvent *next;
CLogEvent(CPluginMngr::CPlugin *p, int f, LogEventsMngr* ppp) : plugin(p), func(f), filters(0), parent(ppp), next(0) {}
CLogEvent(CPluginMngr::CPlugin *p, int f, LogEventsMngr* ppp) : plugin(p), func(f), filters(nullptr), parent(ppp), m_State(FSTATE_ACTIVE), next(nullptr) {}
~CLogEvent();
public:
inline CPluginMngr::CPlugin *getPlugin() { return plugin; }
void registerFilter(char* filter);
void setForwardState(ForwardState value);
inline int getFunction() { return func; }
};
@ -138,11 +120,11 @@ public:
~LogEventsMngr();
// Interface
CLogEvent* registerLogEvent(CPluginMngr::CPlugin* plugin, int func, int pos);
int registerLogEvent(CPluginMngr::CPlugin* plugin, int func, int pos);
inline bool logEventsExist() { return arelogevents; }
void setLogString(char* frmt, va_list& vaptr);
void setLogString(char* frmt, ...);
void setLogString(const char* frmt, va_list& vaptr);
void setLogString(const char* frmt, ...);
void parseLogString();
void executeLogEvents();
@ -175,4 +157,12 @@ public:
inline iterator end() { return iterator(0, this); }
};
struct LogEventHook
{
explicit LogEventHook(LogEventsMngr::CLogEvent *logevent) : m_logevent(logevent) {}
LogEventsMngr::CLogEvent *m_logevent;
};
extern NativeHandle<LogEventHook> LogEventHandles;
#endif //LOGEVENTS_H

View File

@ -1,33 +1,11 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#include "amxmodx.h"
#include "CMenu.h"
@ -35,13 +13,15 @@
// *****************************************************
// class MenuMngr
// *****************************************************
MenuMngr::MenuCommand::MenuCommand(CPluginMngr::CPlugin *a, int mi, int k, int f)
MenuMngr::MenuCommand::MenuCommand(CPluginMngr::CPlugin *a, int mi, int k, int f, bool new_menu)
{
plugin = a;
keys = k;
menuid = mi;
function = f;
next = 0;
is_new_menu = new_menu;
function = f;
}
MenuMngr::~MenuMngr()
@ -54,73 +34,54 @@ int MenuMngr::findMenuId(const char* name, AMX* amx)
{
for (MenuIdEle* b = headid; b; b = b->next)
{
if ((!amx || !b->amx || amx == b->amx) && strstr(name,b->name.c_str()))
if ((!amx || !b->amx || amx == b->amx) && strstr(name,b->name.chars()))
return b->id;
}
return 0;
}
void MenuMngr::removeMenuId(int id)
{
MenuIdEle *n = headid;
MenuIdEle *l = NULL;
while (n)
{
if (n->id == id)
{
if (l)
l->next = n->next;
else
headid = n->next;
delete n;
break;
}
l = n;
n = n->next;
}
MenuCommand *c = headcmd;
MenuCommand *lc = NULL;
MenuCommand *tmp;
while (c)
{
if (c->menuid == id)
{
if (lc)
lc->next = c->next;
else
headcmd = c->next;
tmp = c->next;
delete c;
c = tmp;
} else {
lc = c;
c = c->next;
}
}
}
int MenuMngr::registerMenuId(const char* n, AMX* a)
{
int id = findMenuId(n, a);
if (id)
{
return id;
}
headid = new MenuIdEle(n, a, headid);
if (!headid)
return 0; // :TODO: Better error report
return headid->id;
}
void MenuMngr::registerMenuCmd(CPluginMngr::CPlugin *a, int mi, int k, int f)
void MenuMngr::registerMenuCmd(CPluginMngr::CPlugin *a, int mi, int k, int f, bool from_new_menu)
{
MenuCommand** temp = &headcmd;
while (*temp) temp = &(*temp)->next;
*temp = new MenuCommand(a, mi, k, f);
MenuCommand **temp = &headcmd;
if (from_new_menu)
{
MenuCommand *ptr;
while (*temp)
{
ptr = *temp;
if (ptr->is_new_menu
&& ptr->plugin == a
&& ptr->menuid == mi)
{
if (g_forwards.isSameSPForward(ptr->function, f))
{
return;
}
}
temp = &(*temp)->next;
}
} else {
while (*temp)
{
temp = &(*temp)->next;
}
}
*temp = new MenuCommand(a, mi, k, f, from_new_menu);
}
void MenuMngr::clear()
@ -140,4 +101,13 @@ void MenuMngr::clear()
}
}
MenuMngr::iterator MenuMngr::SetWatchIter(MenuMngr::iterator iter)
{
MenuMngr::iterator old = m_watch_iter;
m_watch_iter = iter;
return old;
}
int MenuMngr::MenuIdEle::uniqueid = 0;

View File

@ -1,33 +1,11 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#ifndef MENUS_H
#define MENUS_H
@ -40,7 +18,7 @@ class MenuMngr
{
struct MenuIdEle
{
String name;
ke::AString name;
AMX* amx;
MenuIdEle* next;
@ -66,29 +44,34 @@ private:
int menuid;
int keys;
int function;
int is_new_menu;
MenuCommand* next;
MenuCommand(CPluginMngr::CPlugin *a, int mi, int k, int f);
MenuCommand(CPluginMngr::CPlugin *a, int mi, int k, int f, bool new_menu=false);
public:
inline int getFunction() { return function; }
inline CPluginMngr::CPlugin* getPlugin() { return plugin; }
inline bool matchCommand(int m, int k) { return ((m == menuid) && (keys & k)); }
inline bool matchCommand(int m, int k)
{
return ((m == menuid) && (keys & k));
}
} *headcmd;
public:
MenuMngr() { headid = 0; headcmd = 0; }
MenuMngr() : m_watch_iter(end())
{ headid = NULL; headcmd = NULL; }
~MenuMngr();
// Interface
int findMenuId(const char* name, AMX* a = 0);
int registerMenuId(const char* n, AMX* a);
void removeMenuId(int id);
void registerMenuCmd(CPluginMngr::CPlugin *a, int mi, int k, int f);
void registerMenuCmd(CPluginMngr::CPlugin *a, int mi, int k, int f, bool from_new_menu=false);
void clear();
class iterator
{
friend class MenuMngr;
MenuCommand* a;
public:
iterator(MenuCommand*aa) : a(aa) {}
@ -101,6 +84,13 @@ public:
inline iterator begin() const { return iterator(headcmd); }
inline iterator end() const { return iterator(0); }
MenuMngr::iterator SetWatchIter(MenuMngr::iterator iter);
inline MenuMngr::iterator GetWatchIter() { return m_watch_iter; }
private:
MenuMngr::iterator m_watch_iter;
};
extern MenuMngr g_menucmds;
#endif //MENUS_H

View File

@ -1,33 +1,12 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#include "amxmodx.h"
#include "newmenus.h"
// *****************************************************
@ -40,9 +19,9 @@ void CPlayer::Init(edict_t* e, int i)
pEdict = e;
initialized = false;
ingame = false;
bot_value = false;
bot_cached = false;
authorized = false;
disconnecting = false;
teamIdsInitialized = false;
current = 0;
teamId = -1;
@ -53,10 +32,10 @@ void CPlayer::Init(edict_t* e, int i)
menuexpire = 0.0;
newmenu = -1;
death_weapon.clear();
name.clear();
ip.clear();
team.clear();
death_weapon = nullptr;
name = nullptr;
ip = nullptr;
team = nullptr;
}
void CPlayer::Disconnect()
@ -64,21 +43,11 @@ void CPlayer::Disconnect()
ingame = false;
initialized = false;
authorized = false;
disconnecting = false;
teamIdsInitialized = false;
if (newmenu != -1)
{
Menu *pMenu = g_NewMenus[newmenu];
if (pMenu)
{
//prevent recursion
newmenu = -1;
menu = 0;
executeForwards(pMenu->func,
static_cast<cell>(ENTINDEX(pEdict)),
static_cast<cell>(pMenu->thisId),
static_cast<cell>(MENU_EXIT));
}
}
if (Menu *pMenu = get_menu_by_id(newmenu))
pMenu->Close(index);
List<ClientCvarQuery_Info *>::iterator iter, end=queries.end();
for (iter=queries.begin(); iter!=end; iter++)
@ -89,8 +58,6 @@ void CPlayer::Disconnect()
}
queries.clear();
bot_value = false;
bot_cached = false;
menu = 0;
newmenu = -1;
}
@ -116,10 +83,8 @@ int CPlayer::NextHUDChannel()
bool CPlayer::Connect(const char* connectname, const char* ipaddress)
{
bot_value = false;
bot_cached = false;
name.assign(connectname);
ip.assign(ipaddress);
name = connectname;
ip = ipaddress;
time = gpGlobals->time;
death_killer = 0;
menu = 0;
@ -276,7 +241,7 @@ void TeamIds::registerTeam(const char* n, int s)
while (*a)
{
if (strcmp((*a)->name.c_str(),n) == 0)
if (strcmp((*a)->name.chars(),n) == 0)
{
if (s != -1)
{
@ -303,7 +268,7 @@ int TeamIds::findTeamId(const char* n)
while (a)
{
if (!stricmp(a->name.c_str(), n))
if (!stricmp(a->name.chars(), n))
return a->id;
a = a->next;
}
@ -317,7 +282,7 @@ int TeamIds::findTeamIdCase(const char* n)
while (a)
{
if (!strcmp(a->name.c_str(), n))
if (!strcmp(a->name.chars(), n))
return a->id;
a = a->next;
}

View File

@ -1,66 +1,17 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#ifndef CMISC_H
#define CMISC_H
#include "CList.h"
#include "sh_list.h"
// *****************************************************
// class CCVar
// *****************************************************
class CCVar
{
cvar_t cvar;
String name;
String plugin;
public:
CCVar(const char* pname, const char* pplugin, int pflags, float pvalue) : name(pname), plugin(pplugin)
{
cvar.name = (char*)name.c_str();
cvar.flags = pflags;
cvar.string = "";
cvar.value = pvalue;
}
inline cvar_t* getCvar() { return &cvar; }
inline const char* getPluginName() { return plugin.c_str(); }
inline const char* getName() { return name.c_str(); }
inline bool operator == (const char* string) { return (strcmp(name.c_str(), string) == 0); }
int plugin_id;
};
// *****************************************************
// class CPlayer
// *****************************************************
@ -78,16 +29,16 @@ class CPlayer
public:
edict_t* pEdict;
String name;
String ip;
String team;
ke::AString name;
ke::AString ip;
ke::AString team;
bool initialized;
bool ingame;
bool bot_cached;
bool bot_value;
bool authorized;
bool disconnecting;
bool vgui;
bool teamIdsInitialized;
float time;
float playtime;
@ -112,7 +63,7 @@ public:
int death_killer;
int death_victim;
bool death_tk;
String death_weapon;
ke::AString death_weapon;
int newmenu;
int page;
@ -120,7 +71,6 @@ public:
cell hudmap[5];
Vector lastTrace;
Vector thisTrace;
Vector lastHit;
List<ClientCvarQuery_Info *> queries;
@ -133,24 +83,8 @@ public:
inline bool IsBot()
{
if (!bot_cached)
{
bot_value = false;
if (pEdict->v.flags & FL_FAKECLIENT)
{
bot_value = true;
bot_cached = true;
} else {
const char *auth = GETPLAYERAUTHID(pEdict);
if (auth && (strcmp(auth, "BOT") == 0))
{
bot_value = true;
bot_cached = true;
}
}
}
return bot_value;
const char *auth = GETPLAYERAUTHID(pEdict);
return auth && !strcmp(auth, "BOT");
}
inline bool IsAlive()
@ -194,7 +128,7 @@ public:
class ForceObject
{
String filename;
ke::AString filename;
FORCE_TYPE type;
Vector mins;
Vector maxs;
@ -202,7 +136,7 @@ class ForceObject
public:
ForceObject(const char* n, FORCE_TYPE c, Vector& mi, Vector& ma, AMX* a) : filename(n), type(c), mins(mi), maxs(ma), amx(a) {}
inline const char* getFilename() { return filename.c_str(); }
inline const char* getFilename() { return filename.chars(); }
inline AMX* getAMX() { return amx; }
Vector& getMin() { return mins; }
@ -257,17 +191,16 @@ public:
// class CScript
// *****************************************************
class CScript
class CScript : public ke::InlineListNode<CScript>
{
String filename;
ke::AString filename;
AMX* amx;
void* code;
public:
CScript(AMX* aa, void* cc, const char* ff) : filename(ff), amx(aa), code(cc) {}
inline AMX* getAMX() { return amx; }
inline const char* getName() { return filename.c_str(); }
inline bool operator==(void* a) { return (amx == (AMX*)a); }
inline const char* getName() { return filename.chars(); }
inline void* getCode() { return code; }
};
@ -279,7 +212,7 @@ class TeamIds
{
struct TeamEle
{
String name;
ke::AString name;
int id;
char tid;
static char uid;
@ -305,4 +238,87 @@ public:
inline bool isNewTeam() { return newTeam ? true : false; }
};
class CAdminData
{
private:
cell m_AuthData[44];
cell m_Password[32];
cell m_Flags;
cell m_Access;
public:
CAdminData()
{
m_AuthData[0]=0;
m_Password[0]=0;
m_Flags=0;
m_Access=0;
};
void SetAccess(cell Access)
{
m_Access=Access;
};
cell GetAccess(void) const
{
return m_Access;
};
void SetFlags(cell Flags)
{
m_Flags=Flags;
};
cell GetFlags(void) const
{
return m_Flags;
};
void SetAuthID(const cell *Input)
{
unsigned int i=0;
while (i<sizeof(m_AuthData)-1)
{
if ((m_AuthData[i++]=*Input++)==0)
{
return;
}
}
m_AuthData[arraysize(m_AuthData)-1]=0;
};
const cell *GetAuthID(void) const
{
return &m_AuthData[0];
};
void SetPass(const cell *Input)
{
unsigned int i=0;
while (i<sizeof(m_Password)-1)
{
if ((m_Password[i++]=*Input++)==0)
{
return;
}
}
m_Password[arraysize(m_Password)-1]=0;
};
const cell *GetPass(void) const
{
return &m_Password[0];
};
CAdminData & operator = (const CAdminData &src)
{
this->SetAccess(src.GetAccess());
this->SetFlags(src.GetFlags());
this->SetAuthID(src.GetAuthID());
this->SetPass(src.GetPass());
return *this;
}
};
#endif //CMISC_H

View File

@ -1,33 +1,11 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#include "amxmodx.h"
#include "libraries.h"
@ -39,6 +17,7 @@
// New
typedef void* (*PFN_REQ_FNPTR)(const char * /*name*/);
typedef int (FAR *QUERYMOD_NEW)(int * /*ifvers*/, amxx_module_info_s * /*modInfo*/);
typedef int (FAR *CHECKGAME_NEW)(const char *);
typedef int (FAR *ATTACHMOD_NEW)(PFN_REQ_FNPTR /*reqFnptrFunc*/);
typedef int (FAR *DETACHMOD_NEW)(void);
typedef void (FAR *PLUGINSLOADED_NEW)(void);
@ -51,7 +30,7 @@ typedef void (*PLUGINSUNLOADING_NEW)(void);
CModule::CModule(const char* fname)
{
m_Filename.assign(fname);
m_Filename = fname;
clear(false);
}
@ -72,17 +51,18 @@ void CModule::clear(bool clearFilename)
m_Status = MODULE_NONE;
if (clearFilename)
m_Filename.assign("unknown");
{
m_Filename = "unknown";
}
// new
m_Amxx = false;
m_InfoNew.author = "unknown";
m_InfoNew.name = "unknown";
m_InfoNew.version = "unknown";
m_InfoNew.reload = 0;
m_MissingFunc = NULL;
for (size_t i=0; i<m_DestroyableIndexes.size(); i++)
for (size_t i=0; i<m_DestroyableIndexes.length(); i++)
{
delete [] m_Natives[m_DestroyableIndexes[i]];
}
@ -117,12 +97,12 @@ bool CModule::attachMetamod(const char *mmfile, PLUG_LOADTIME now)
void CModule::rewriteNativeLists(AMX_NATIVE_INFO *list)
{
AMX_NATIVE_INFO *curlist;
for (size_t i=0; i<m_Natives.size(); i++)
for (size_t i=0; i<m_Natives.length(); i++)
{
curlist = m_Natives[i];
bool changed = false;
bool found = false;
CVector<size_t> newlist;
ke::Vector<size_t> newlist;
for (size_t j=0; curlist[j].func != NULL; j++)
{
found = false;
@ -139,22 +119,22 @@ void CModule::rewriteNativeLists(AMX_NATIVE_INFO *list)
changed = true;
//don't break, we have to search it all
} else {
newlist.push_back(j);
newlist.append(j);
}
}
if (changed)
{
//now build the new list
AMX_NATIVE_INFO *rlist = new AMX_NATIVE_INFO[newlist.size()+1];
for (size_t j=0; j<newlist.size(); j++)
AMX_NATIVE_INFO *rlist = new AMX_NATIVE_INFO[newlist.length()+1];
for (size_t j=0; j<newlist.length(); j++)
{
rlist[j].func = curlist[newlist[j]].func;
rlist[j].name = curlist[newlist[j]].name;
}
rlist[newlist.size()].func = NULL;
rlist[newlist.size()].name = NULL;
rlist[newlist.length()].func = NULL;
rlist[newlist.length()].name = NULL;
m_Natives[i] = rlist;
m_DestroyableIndexes.push_back(i);
m_DestroyableIndexes.append(i);
}
}
}
@ -165,40 +145,34 @@ bool CModule::attachModule()
if (m_Status != MODULE_QUERY || !m_Handle)
return false;
if (m_Amxx)
ATTACHMOD_NEW AttachFunc_New = (ATTACHMOD_NEW)DLPROC(m_Handle, "AMXX_Attach");
if (!AttachFunc_New)
return false;
g_ModuleCallReason = ModuleCall_Attach;
g_CurrentlyCalledModule = this;
int retVal = (*AttachFunc_New)(Module_ReqFnptr);
g_CurrentlyCalledModule = NULL;
g_ModuleCallReason = ModuleCall_NotCalled;
switch (retVal)
{
// new
ATTACHMOD_NEW AttachFunc_New = (ATTACHMOD_NEW)DLPROC(m_Handle, "AMXX_Attach");
if (!AttachFunc_New)
case AMXX_OK:
m_Status = MODULE_LOADED;
break;
case AMXX_PARAM:
AMXXLOG_Log("[AMXX] Internal Error: Module \"%s\" (version \"%s\") returned \"Invalid parameter\" from Attach func.", m_Filename.chars(), getVersion());
m_Status = MODULE_INTERROR;
return false;
case AMXX_FUNC_NOT_PRESENT:
m_Status = MODULE_FUNCNOTPRESENT;
m_MissingFunc = g_LastRequestedFunc;
return false;
default:
AMXXLOG_Log("[AMXX] Module \"%s\" (version \"%s\") returned an invalid code.", m_Filename.chars(), getVersion());
m_Status = MODULE_BADLOAD;
return false;
g_ModuleCallReason = ModuleCall_Attach;
g_CurrentlyCalledModule = this;
int retVal = (*AttachFunc_New)(Module_ReqFnptr);
g_CurrentlyCalledModule = NULL;
g_ModuleCallReason = ModuleCall_NotCalled;
switch (retVal)
{
case AMXX_OK:
m_Status = MODULE_LOADED;
break;
case AMXX_PARAM:
AMXXLOG_Log("[AMXX] Internal Error: Module \"%s\" (version \"%s\") retured \"Invalid parameter\" from Attach func.", m_Filename.c_str(), getVersion());
m_Status = MODULE_INTERROR;
return false;
case AMXX_FUNC_NOT_PRESENT:
m_Status = MODULE_FUNCNOTPRESENT;
m_MissingFunc = g_LastRequestedFunc;
return false;
default:
AMXXLOG_Log("[AMXX] Module \"%s\" (version \"%s\") returned an invalid code.", m_Filename.c_str(), getVersion());
m_Status = MODULE_BADLOAD;
return false;
}
} else {
m_Status = MODULE_BADLOAD;
}
if (m_Status == MODULE_LOADED)
@ -216,9 +190,12 @@ bool CModule::queryModule()
if (m_Status != MODULE_NONE) // don't check if already queried
return false;
m_Handle = DLLOAD(m_Filename.c_str()); // load file
m_Handle = DLLOAD(m_Filename.chars()); // load file
if (!m_Handle)
{
#if defined(__linux__) || defined(__APPLE__)
AMXXLOG_Log("[AMXX] Module \"%s\" failed to load (%s)", m_Filename.chars(), dlerror());
#endif
m_Status = MODULE_BADLOAD;
return false;
}
@ -232,7 +209,6 @@ bool CModule::queryModule()
if (queryFunc_New)
{
m_Amxx = true;
int ifVers = AMXX_INTERFACE_VERSION;
g_ModuleCallReason = ModuleCall_Query;
g_CurrentlyCalledModule = this;
@ -243,7 +219,7 @@ bool CModule::queryModule()
switch (retVal)
{
case AMXX_PARAM:
AMXXLOG_Log("[AMXX] Internal Error: Module \"%s\" (version \"%s\") retured \"Invalid parameter\" from Attach func.", m_Filename.c_str(), getVersion());
AMXXLOG_Log("[AMXX] Internal Error: Module \"%s\" (version \"%s\") returned \"Invalid parameter\" from Attach func.", m_Filename.chars(), getVersion());
m_Status = MODULE_INTERROR;
return false;
case AMXX_IFVERS:
@ -255,7 +231,7 @@ bool CModule::queryModule()
g_ModuleCallReason = ModuleCall_Query;
g_CurrentlyCalledModule = this;
retVal = (*queryFunc_New)(&ifVers, &m_InfoNew);
g_CurrentlyCalledModule = NULL;
g_CurrentlyCalledModule = NULL;
g_ModuleCallReason = ModuleCall_NotCalled;
if (retVal == AMXX_OK)
{
@ -281,7 +257,7 @@ bool CModule::queryModule()
case AMXX_OK:
break;
default:
AMXXLOG_Log("[AMXX] Module \"%s\" (version \"%s\") returned an invalid code.", m_Filename.c_str(), getVersion());
AMXXLOG_Log("[AMXX] Module \"%s\" (version \"%s\") returned an invalid code.", m_Filename.chars(), getVersion());
m_Status = MODULE_BADLOAD;
return false;
}
@ -293,11 +269,37 @@ bool CModule::queryModule()
return false;
}
// Lastly, check to see if this module is able to load on this game mod
CHECKGAME_NEW checkGame_New = (CHECKGAME_NEW)DLPROC(m_Handle, "AMXX_CheckGame");
if (checkGame_New)
{
// This is an optional check; do not fail modules that do not have it
int ret = checkGame_New(g_mod_name.chars());
if (ret != AMXX_GAME_OK)
{
switch (ret)
{
case AMXX_GAME_BAD:
AMXXLOG_Log("[AMXX] Module \"%s\" (version \"%s\") reported that it cannot load on game \"%s\"", m_Filename.chars(), getVersion(), g_mod_name.chars());
m_Status = MODULE_BADGAME;
break;
default:
AMXXLOG_Log("[AMXX] Module \"%s\" (version \"%s\") returned an unknown CheckGame code (value: %d)", m_Filename.chars(), getVersion(), ret);
m_Status = MODULE_BADLOAD;
break;
}
return false;
}
}
m_Status = MODULE_QUERY;
return true;
} else {
m_Status = MODULE_NOQUERY;
m_Amxx = false;
return false;
}
}
@ -309,26 +311,21 @@ bool CModule::detachModule()
RemoveLibraries(this);
if (m_Amxx)
{
DETACHMOD_NEW detachFunc_New = (DETACHMOD_NEW)DLPROC(m_Handle, "AMXX_Detach");
DETACHMOD_NEW detachFunc_New = (DETACHMOD_NEW)DLPROC(m_Handle, "AMXX_Detach");
if (detachFunc_New)
{
g_ModuleCallReason = ModuleCall_Detach;
g_CurrentlyCalledModule = this;
(*detachFunc_New)();
g_CurrentlyCalledModule = NULL;
g_ModuleCallReason = ModuleCall_NotCalled;
}
if (detachFunc_New)
{
g_ModuleCallReason = ModuleCall_Detach;
g_CurrentlyCalledModule = this;
(*detachFunc_New)();
g_CurrentlyCalledModule = NULL;
g_ModuleCallReason = ModuleCall_NotCalled;
}
#ifndef FAKEMETA
if (IsMetamod())
{
UnloadMetamodPlugin(m_Handle);
}
#endif
DLFREE(m_Handle);
clear();
@ -400,6 +397,7 @@ const char* CModule::getStatus() const
case MODULE_NEWER: return "newer";
case MODULE_INTERROR: return "internal err";
case MODULE_NOT64BIT: return "not 64bit";
case MODULE_BADGAME: return "bad game";
default: break;
}

View File

@ -1,33 +1,11 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
// *****************************************************
// class CModule
@ -49,7 +27,8 @@ enum MODULE_STATUS
MODULE_NEWER, // newer interface
MODULE_INTERROR, // Internal error
MODULE_FUNCNOTPRESENT, // Function not present
MODULE_NOT64BIT // Not 64 bit compatible
MODULE_NOT64BIT, // Not 64 bit compatible
MODULE_BADGAME, // Module cannot load on the current game mod
};
struct amxx_module_info_s
@ -68,14 +47,16 @@ struct amxx_module_info_s
#define AMXX_PARAM 2 /* Invalid parameter */
#define AMXX_FUNC_NOT_PRESENT 3 /* Function not present */
#define AMXX_GAME_OK 0 /* Module can load on this game. */
#define AMXX_GAME_BAD 1 /* Module cannot load on this game. */
#define AMXX_INTERFACE_VERSION 4
class CModule
class CModule : public ke::InlineListNode<CModule>
{
String m_Filename; // Filename
ke::AString m_Filename; // Filename
bool m_Metamod; // Using metamod?
bool m_Amxx; // Using new module interface?
amxx_module_info_s m_InfoNew; // module info (new module interface)
DLHANDLE m_Handle; // handle
@ -94,31 +75,27 @@ public:
bool detachModule();
void rewriteNativeLists(AMX_NATIVE_INFO *list);
#ifndef FAKEMETA
bool attachMetamod(const char *mmfile, PLUG_LOADTIME now);
#endif
const char* getStatus() const;
inline const char* getType() const { return m_Amxx ? "amxx" : (m_Metamod ? "amx&mm" : "amx"); }
inline const char* getType() const { return m_Metamod ? "amxx&mm" : "amxx"; }
inline const char* getAuthor() const { return m_InfoNew.author; }
inline const char* getVersion() const { return m_InfoNew.version; }
inline const char* getName() const { return m_InfoNew.name; }
inline const amxx_module_info_s* getInfoNew() const { return &m_InfoNew; } // new
inline int getStatusValue() { return m_Status; }
inline bool operator==(const char* fname) { return !strcmp(m_Filename.c_str(), fname); }
inline bool isReloadable() { return ((m_Status == MODULE_LOADED) && (m_InfoNew.reload != 0)); }
inline bool isAmxx() const { return m_Amxx; }
inline const char *getMissingFunc() const { return m_MissingFunc; }
inline const char *getFilename() { return m_Filename.c_str(); }
inline const char *getFilename() { return m_Filename.chars(); }
inline bool IsMetamod() { return m_Metamod; }
void CallPluginsLoaded();
void CallPluginsUnloaded();
void CallPluginsUnloading();
CVector<AMX_NATIVE_INFO*> m_Natives;
CVector<AMX_NATIVE_INFO*> m_NewNatives; // Natives for new (AMXX, not AMX) plugins only
CVector<size_t> m_DestroyableIndexes;
ke::Vector<AMX_NATIVE_INFO*> m_Natives;
ke::Vector<AMX_NATIVE_INFO*> m_NewNatives; // Natives for new (AMXX, not AMX) plugins only
ke::Vector<size_t> m_DestroyableIndexes;
};
#endif //CMODULE_H

View File

@ -1,340 +0,0 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the 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 Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Library General
Public License instead of this License.

View File

@ -1,53 +1,32 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#include "amxmodx.h"
#include "CPlugin.h"
#include "CForward.h"
#include "CFile.h"
#include "amx.h"
#include "natives.h"
#include "debugger.h"
#include "libraries.h"
#include <amxmodx_version.h>
#include "engine_strucs.h"
extern const char *no_function;
CPluginMngr::CPlugin* CPluginMngr::loadPlugin(const char* path, const char* name, char* error, int debug)
CPluginMngr::CPlugin* CPluginMngr::loadPlugin(const char* path, const char* name, char* error, size_t maxLength, int debug)
{
CPlugin** a = &head;
while (*a)
a = &(*a)->next;
*a = new CPlugin(pCounter++, path, name, error, debug);
*a = new CPlugin(pCounter++, path, name, error, maxLength, debug);
return (*a);
}
@ -83,14 +62,14 @@ void CPluginMngr::Finalize()
int CPluginMngr::loadPluginsFromFile(const char* filename, bool warn)
{
char file[256];
FILE *fp = fopen(build_pathname_r(file, sizeof(file) - 1, "%s", filename), "rt");
char file[PLATFORM_MAX_PATH];
FILE *fp = fopen(build_pathname_r(file, sizeof(file), "%s", filename), "rt");
if (!fp)
{
if (warn)
{
AMXXLOG_Log("[AMXX] Plugins list not found (file \"%s\")", filename);
AMXXLOG_Error("[AMXX] Plugins list not found (file \"%s\")", filename);
}
return 1;
}
@ -100,9 +79,9 @@ int CPluginMngr::loadPluginsFromFile(const char* filename, bool warn)
int debugFlag = 0;
const char *pluginsDir = get_localinfo("amxx_pluginsdir", "addons/amxmodx/plugins");
String line;
char line[512];
List<String *>::iterator block_iter;
List<ke::AString *>::iterator block_iter;
while (!feof(fp))
{
@ -111,10 +90,11 @@ int CPluginMngr::loadPluginsFromFile(const char* filename, bool warn)
debug[0] = '\0';
debugFlag = 0;
line.clear();
line._fread(fp);
line[0] = '\0';
fgets(line, sizeof(line), fp);
/** quick hack */
char *ptr = const_cast<char *>(line.c_str());
char *ptr = line;
while (*ptr)
{
if (*ptr == ';')
@ -124,7 +104,7 @@ int CPluginMngr::loadPluginsFromFile(const char* filename, bool warn)
ptr++;
}
}
sscanf(line.c_str(), "%s %s", pluginName, debug);
sscanf(line, "%s %s", pluginName, debug);
if (!isalnum(*pluginName))
{
@ -153,14 +133,68 @@ int CPluginMngr::loadPluginsFromFile(const char* filename, bool warn)
continue;
}
CPlugin* plugin = loadPlugin(pluginsDir, pluginName, error, debugFlag);
if (findPlugin(pluginName) != NULL)
{
continue;
}
CPlugin* plugin = loadPlugin(pluginsDir, pluginName, error, sizeof(error), debugFlag);
if (plugin->getStatusCode() == ps_bad_load)
{
char errorMsg[255];
sprintf(errorMsg, "%s (plugin \"%s\")", error, pluginName);
plugin->setError(errorMsg);
AMXXLOG_Log("[AMXX] %s", plugin->getError());
AMXXLOG_Error("[AMXX] %s", plugin->getError());
}
else
{
cell addr;
if (amx_FindPubVar(plugin->getAMX(), "MaxClients", &addr) != AMX_ERR_NOTFOUND)
{
*get_amxaddr(plugin->getAMX(), addr) = gpGlobals->maxClients;
}
if (amx_FindPubVar(plugin->getAMX(), "MapName", &addr) != AMX_ERR_NOTFOUND)
{
set_amxstring(plugin->getAMX(), addr, STRING(gpGlobals->mapname), MAX_MAPNAME_LENGTH - 1);
}
auto length = 0;
if (amx_FindPubVar(plugin->getAMX(), "PluginName", &addr) != AMX_ERR_NOTFOUND)
{
plugin->setTitle(get_amxstring(plugin->getAMX(), addr, 0, length));
}
if (amx_FindPubVar(plugin->getAMX(), "PluginVersion", &addr) != AMX_ERR_NOTFOUND)
{
plugin->setVersion(get_amxstring(plugin->getAMX(), addr, 0, length));
}
if (amx_FindPubVar(plugin->getAMX(), "PluginAuthor", &addr) != AMX_ERR_NOTFOUND)
{
plugin->setAuthor(get_amxstring(plugin->getAMX(), addr, 0, length));
}
if (amx_FindPubVar(plugin->getAMX(), "PluginURL", &addr) != AMX_ERR_NOTFOUND)
{
plugin->setUrl(get_amxstring(plugin->getAMX(), addr, 0, length));
}
if (amx_FindPubVar(plugin->getAMX(), "PluginDescription", &addr) != AMX_ERR_NOTFOUND)
{
plugin->setDescription(get_amxstring(plugin->getAMX(), addr, 0, length));
}
if (amx_FindPubVar(plugin->getAMX(), "NULL_STRING", &addr) != AMX_ERR_NOTFOUND)
{
plugin->m_pNullStringOfs = get_amxaddr(plugin->getAMX(), addr);
}
if (amx_FindPubVar(plugin->getAMX(), "NULL_VECTOR", &addr) != AMX_ERR_NOTFOUND)
{
plugin->m_pNullVectorOfs = get_amxaddr(plugin->getAMX(), addr);
}
}
}
@ -184,7 +218,7 @@ void CPluginMngr::clear()
pNatives = NULL;
}
List<String *>::iterator iter = m_BlockList.begin();
List<ke::AString *>::iterator iter = m_BlockList.begin();
while (iter != m_BlockList.end())
{
delete (*iter);
@ -225,12 +259,23 @@ CPluginMngr::CPlugin* CPluginMngr::findPlugin(const char* name)
CPlugin*a = head;
while (a && strncmp(a->name.c_str(), name, len))
while (a && strncmp(a->name.chars(), name, len))
a = a->next;
return a;
}
void CPluginMngr::CPlugin::AddToFailCounter(unsigned int i)
{
failcounter += i;
if ((failcounter >= 3)
&& (status ))
{
errorMsg = "This plugin is non-GPL which violates AMX Mod X's license.";
status = ps_bad_load;
}
}
const char* CPluginMngr::CPlugin::getStatus() const
{
switch (status)
@ -254,19 +299,21 @@ const char* CPluginMngr::CPlugin::getStatus() const
return "error";
}
CPluginMngr::CPlugin::CPlugin(int i, const char* p, const char* n, char* e, int d) : name(n), title(n)
CPluginMngr::CPlugin::CPlugin(int i, const char* p, const char* n, char* e, size_t m, int d) : name(n), title(n), m_pNullStringOfs(nullptr), m_pNullVectorOfs(nullptr)
{
const char* unk = "unknown";
title.assign(unk);
author.assign(unk);
version.assign(unk);
failcounter = 0;
title = unk;
author = unk;
version = unk;
url = unk;
char file[256];
char* path = build_pathname_r(file, sizeof(file) - 1, "%s/%s", p, n);
char file[PLATFORM_MAX_PATH];
char* path = build_pathname_r(file, sizeof(file), "%s/%s", p, n);
code = 0;
memset(&amx, 0, sizeof(AMX));
int err = load_amxscript(&amx, &code, path, e, d);
int err = load_amxscript_ex(&amx, &code, path, e, m, d);
if (err == AMX_ERR_NONE)
{
@ -369,7 +416,7 @@ void CPluginMngr::CPlugin::Finalize()
{
status = ps_bad_load;
sprintf(buffer, "Plugin uses an unknown function (name \"%s\") - check your modules.ini.", no_function);
errorMsg.assign(buffer);
errorMsg = buffer;
amx.error = AMX_ERR_NOTFOUND;
} else {
amx_RegisterToAny(&amx, invalid_native);
@ -377,13 +424,13 @@ void CPluginMngr::CPlugin::Finalize()
}
} else {
status = ps_bad_load;
errorMsg.assign(buffer);
errorMsg = buffer;
amx.error = AMX_ERR_NOTFOUND;
}
if (old_status != status)
{
AMXXLOG_Log("[AMXX] Plugin \"%s\" failed to load: %s", name.c_str(), errorMsg.c_str());
AMXXLOG_Log("[AMXX] Plugin \"%s\" failed to load: %s", name.chars(), errorMsg.chars());
}
}
@ -417,17 +464,62 @@ void CPluginMngr::CPlugin::pausePlugin()
// Unpause a plugin
void CPluginMngr::CPlugin::unpausePlugin()
{
if (isValid())
if (isValid() && (getStatusCode() != ps_stopped))
{
// set status first so the function will be marked executable
setStatus(ps_running);
// call plugin_unpause if provided
if (m_UnpauseFwd != -1)
{
executeForwards(m_UnpauseFwd);
}
}
}
void CPluginMngr::CPlugin::AddConfig(bool create, const char *name, const char *folder)
{
// Do a check for duplicates to prevent double-execution
for (size_t i = 0; i < m_configs.length(); ++i)
{
AutoConfig *config = m_configs[i];
if (config->autocfg.compare(name) == 0 && config->folder.compare(folder) == 0)
{
if (!config->create)
{
config->create = create;
}
return;
}
}
auto c = new AutoConfig;
c->autocfg = name;
c->folder = folder;
c->create = create;
m_configs.append(c);
}
size_t CPluginMngr::CPlugin::GetConfigCount()
{
return m_configs.length();
}
AutoConfig *CPluginMngr::CPlugin::GetConfig(size_t i)
{
if (i >= GetConfigCount())
{
return nullptr;
}
return m_configs[i];
}
char *CPluginMngr::ReadIntoOrFromCache(const char *file, size_t &bufsize)
{
List<plcache_entry *>::iterator iter;
@ -447,8 +539,7 @@ char *CPluginMngr::ReadIntoOrFromCache(const char *file, size_t &bufsize)
pl->file = new CAmxxReader(file, sizeof(cell));
pl->buffer = NULL;
if (pl->file->GetStatus() != CAmxxReader::Err_None ||
pl->file->IsOldFile())
if (pl->file->GetStatus() != CAmxxReader::Err_None)
{
delete pl->file;
delete pl;
@ -470,7 +561,7 @@ char *CPluginMngr::ReadIntoOrFromCache(const char *file, size_t &bufsize)
return NULL;
}
pl->path.assign(file);
pl->path = file;
bufsize = pl->bufsize;
@ -581,8 +672,8 @@ void CPluginMngr::CacheAndLoadModules(const char *plugin)
cell tag_id;
amx_NumTags(&amx, &num);
CVector<LibDecoder *> expects;
CVector<LibDecoder *> defaults;
ke::Vector<LibDecoder *> expects;
ke::Vector<LibDecoder *> defaults;
CStack<LibDecoder *> delstack;
for (int i=0; i<num; i++)
{
@ -599,19 +690,19 @@ void CPluginMngr::CacheAndLoadModules(const char *plugin)
} else if ( (dc->cmd == LibCmd_ExpectClass) ||
(dc->cmd == LibCmd_ExpectLib) )
{
expects.push_back(dc);
expects.append(dc);
} else if (dc->cmd == LibCmd_DefaultLib) {
defaults.push_back(dc);
defaults.append(dc);
}
}
}
}
for (size_t i=0; i<expects.size(); i++)
for (size_t i=0; i<expects.length(); i++)
{
RunLibCommand(expects[i]);
}
for (size_t i=0; i<defaults.size(); i++)
for (size_t i=0; i<defaults.length(); i++)
{
RunLibCommand(defaults[i]);
}
@ -630,8 +721,8 @@ void CPluginMngr::CacheAndLoadModules(const char *plugin)
void CPluginMngr::CALMFromFile(const char *file)
{
char filename[256];
FILE *fp = fopen(build_pathname_r(filename, sizeof(filename) - 1, "%s", file), "rt");
char filename[PLATFORM_MAX_PATH];
FILE *fp = fopen(build_pathname_r(filename, sizeof(filename), "%s", file), "rt");
if (!fp)
{
@ -641,7 +732,7 @@ void CPluginMngr::CALMFromFile(const char *file)
// Find now folder
char pluginName[256];
char line[256];
String rline;
char rline[256];
while (!feof(fp))
{
@ -663,24 +754,26 @@ void CPluginMngr::CALMFromFile(const char *file)
}
}
rline.assign(line);
rline.trim();
strncopy(rline, line, sizeof(rline));
UTIL_TrimLeft(rline);
UTIL_TrimRight(rline);
pluginName[0] = '\0';
sscanf(rline.c_str(), "%s", pluginName);
sscanf(rline, "%s", pluginName);
/* HACK: see if there's a 'disabled' coming up
* new block for scopying flexibility
*/
if (1)
{
const char *_ptr = rline.c_str() + strlen(pluginName);
const char *_ptr = rline + strlen(pluginName);
while (*_ptr != '\0' && isspace(*_ptr))
{
_ptr++;
}
if ((*_ptr != '\0') && !strcmp(_ptr, "disabled"))
{
String *pString = new String(pluginName);
ke::AString *pString = new ke::AString(pluginName);
m_BlockList.push_back(pString);
continue;
}
@ -691,7 +784,7 @@ void CPluginMngr::CALMFromFile(const char *file)
continue;
}
build_pathname_r(filename, sizeof(filename)-1, "%s/%s", get_localinfo("amxx_pluginsdir", "addons/amxmodx/plugins"), pluginName);
build_pathname_r(filename, sizeof(filename), "%s/%s", get_localinfo("amxx_pluginsdir", "addons/amxmodx/plugins"), pluginName);
CacheAndLoadModules(filename);
}

View File

@ -1,41 +1,21 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#ifndef PLUGIN_H
#define PLUGIN_H
#include "CString.h"
#include "sh_list.h"
#include "amx.h"
#include "amxxfile.h"
#include <amtl/am-string.h>
#include <amtl/am-vector.h>
#include <amtl/am-autoptr.h>
// *****************************************************
// class CPluginMngr
@ -51,6 +31,13 @@ enum
ps_running, //Plugin is running
};
struct AutoConfig
{
ke::AString autocfg;
ke::AString folder;
bool create;
};
class CPluginMngr
{
public:
@ -65,12 +52,15 @@ public:
AMX amx;
void* code;
String name;
String version;
String title;
String author;
String errorMsg;
ke::AString name;
ke::AString version;
ke::AString title;
ke::AString author;
ke::AString url;
ke::AString description;
ke::AString errorMsg;
unsigned int failcounter;
int m_PauseFwd;
int m_UnpauseFwd;
int paused_fun;
@ -78,29 +68,38 @@ public:
CPlugin* next;
int id;
CPlugin(int i, const char* p, const char* n, char* e, int d);
CPlugin(int i, const char* p, const char* n, char* e, size_t m, int d);
~CPlugin();
bool m_Debug;
cell* m_pNullStringOfs;
cell* m_pNullVectorOfs;
ke::Vector<ke::AutoPtr<AutoConfig>> m_configs;
public:
inline const char* getName() { return name.c_str();}
inline const char* getVersion() { return version.c_str();}
inline const char* getTitle() { return title.c_str();}
inline const char* getAuthor() { return author.c_str();}
inline const char* getError() { return errorMsg.c_str();}
inline const char* getName() { return name.chars();}
inline const char* getVersion() { return version.chars();}
inline const char* getTitle() { return title.chars();}
inline const char* getAuthor() { return author.chars();}
inline const char* getUrl() { return url.chars(); }
inline const char* getDescription() { return description.chars(); }
inline const char* getError() { return errorMsg.chars();}
inline int getStatusCode() { return status; }
inline int getId() const { return id; }
inline AMX* getAMX() { return &amx; }
inline const AMX* getAMX() const { return &amx; }
inline void setTitle(const char* n) { title.assign(n); }
inline void setAuthor(const char* n) { author.assign(n); }
inline void setVersion(const char* n) { version.assign(n); }
inline void setError(const char* n) { errorMsg.assign(n); }
inline void setTitle(const char* n) { title = n; }
inline void setAuthor(const char* n) { author =n; }
inline void setVersion(const char* n) { version = n; }
inline void setUrl(const char* n) { url = n; }
inline void setDescription(const char* n) { description = n; }
inline void setError(const char* n) { errorMsg = n; }
inline bool isValid() const { return (status >= ps_paused); }
inline bool isPaused() const { return ((status == ps_paused) || (status == ps_stopped)); }
inline bool isStopped() const { return (status == ps_stopped); }
inline bool isExecutable(int id) const { return (isValid() && !isPaused()); }
void Finalize();
void AddToFailCounter(unsigned int i);
void pausePlugin();
void unpausePlugin();
void pauseFunction(int id);
@ -109,6 +108,12 @@ public:
const char* getStatus() const;
inline bool isDebug() const { return m_Debug; }
inline cell* getNullStringOfs() const { return m_pNullStringOfs; }
inline cell* getNullVectorOfs() const { return m_pNullVectorOfs; }
public:
void AddConfig(bool create, const char *name, const char *folder);
size_t GetConfigCount();
AutoConfig *GetConfig(size_t index);
};
private:
@ -123,7 +128,7 @@ public:
// Interface
CPlugin* loadPlugin(const char* path, const char* name, char* error, int debug);
CPlugin* loadPlugin(const char* path, const char* name, char* error, size_t maxLength, int debug);
void unloadPlugin(CPlugin** a);
int loadPluginsFromFile(const char* filename, bool warn=true);
@ -156,7 +161,7 @@ public:
CAmxxReader *file;
size_t bufsize;
char *buffer;
String path;
ke::AString path;
};
char *ReadIntoOrFromCache(const char *file, size_t &bufsize);
void InvalidateCache();
@ -165,7 +170,7 @@ public:
void CALMFromFile(const char *file);
private:
List<plcache_entry *> m_plcache;
List<String *> m_BlockList;
List<ke::AString *> m_BlockList;
};
#endif //PLUGIN_H

View File

@ -1,129 +0,0 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
//by David "BAILOPAN" Anderson
#ifndef _INCLUDE_CQUEUE_H
#define _INCLUDE_CQUEUE_H
template <class T>
class CQueue
{
public:
class CQueueItem
{
public:
CQueueItem(const T &i, CQueueItem *n)
{
item = i;
next = n;
}
CQueueItem *GetNext()
{
return next;
}
T & GetItem()
{
return item;
}
void SetNext(CQueueItem *n)
{
next = n;
}
private:
T item;
CQueueItem *next;
};
public:
CQueue()
{
mSize = 0;
mFirst = NULL;
mLast = NULL;
}
bool empty()
{
return ((mSize == 0) ? true : false);
}
void push(const T &v)
{
CQueueItem *p = new CQueueItem(v, NULL);
if (empty())
{
mFirst = p;
} else {
mLast->SetNext(p);
}
mLast = p;
mSize++;
}
void pop()
{
if (mFirst == mLast)
{
delete mFirst;
mFirst = NULL;
mLast = NULL;
} else {
CQueueItem *p = mFirst->GetNext();
delete mFirst;
mFirst = p;
}
mSize--;
}
T & front()
{
return mFirst->GetItem();
}
T & back()
{
return mLast->GetItem();
}
unsigned int size()
{
return mSize;
}
private:
CQueueItem *mFirst;
CQueueItem *mLast;
unsigned int mSize;
};
#endif //_INCLUDE_CQUEUE_H

View File

@ -1,413 +0,0 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
#ifndef _INCLUDE_CSTRING_H
#define _INCLUDE_CSTRING_H
#include <string.h>
#include <stdio.h>
//by David "BAILOPAN" Anderson
class String
{
public:
String()
{
v = NULL;
a_size = 0;
//assign("");
}
~String()
{
if (v)
delete [] v;
}
String(const char *src)
{
v = NULL;
a_size = 0;
assign(src);
}
const char * _fread(FILE *fp)
{
Grow(512, false);
char *ret = fgets(v, 511, fp);
return ret;
}
String(const String &src)
{
v = NULL;
a_size = 0;
assign(src.c_str());
}
const char *c_str() { return v?v:""; }
const char *c_str() const { return v?v:""; }
void append(const char *t)
{
Grow(size() + strlen(t) + 1);
strcat(v, t);
}
void append(const char c)
{
size_t len = size();
Grow(len + 2);
v[len] = c;
v[len + 1] = '\0';
}
void append(String &d)
{
append(d.c_str());
}
void assign(const String &src)
{
assign(src.c_str());
}
void assign(const char *d)
{
if (!d)
{
clear();
} else {
size_t len = strlen(d);
Grow(len + 1, false);
memcpy(v, d, len);
v[len] = '\0';
}
}
void clear()
{
if (v)
v[0] = '\0';
}
int compare (const char *d) const
{
if (!v)
return strcmp("", d);
else
return strcmp(v, d);
}
//Added this for amxx inclusion
bool empty()
{
if (!v)
return true;
if (v[0] == '\0')
return true;
return false;
}
size_t size()
{
if (v)
return strlen(v);
else
return 0;
}
int find(const char c, int index = 0)
{
int len = static_cast<int>(size());
if (len < 1)
return npos;
if (index >= len || index < 0)
return npos;
int i = 0;
for (i=index; i<len; i++)
{
if (v[i] == c)
{
return i;
}
}
return npos;
}
bool is_space(int c)
{
if (c == '\f' || c == '\n' ||
c == '\t' || c == '\r' ||
c == '\v' || c == ' ')
{
return true;
}
return false;
}
void reparse_newlines()
{
size_t len = size();
int offs = 0;
char c;
if (!len)
return;
for (size_t i=0; i<len; i++)
{
c = v[i];
if (c == '^' && (i != len-1))
{
c = v[++i];
if (c == 'n')
c = '\n';
else if (c == 't')
c = '\t';
offs++;
}
v[i-offs] = c;
}
v[len-offs] = '\0';
}
void trim()
{
if (!v)
return;
unsigned int i = 0;
unsigned int j = 0;
size_t len = strlen(v);
if (len == 1)
{
if (is_space(v[i]))
{
clear();
return;
}
}
unsigned char c0 = v[0];
if (is_space(c0))
{
for (i=0; i<len; i++)
{
if (!is_space(v[i]) || (is_space(v[i]) && ((unsigned char)i==len-1)))
{
erase(0, i);
break;
}
}
}
len = strlen(v);
if (len < 1)
{
return;
}
if (is_space(v[len-1]))
{
for (i=len-1; i>=0; i--)
{
if (!is_space(v[i])
|| (is_space(v[i]) && i==0))
{
erase(i+1, j);
break;
}
j++;
}
}
if (len == 1)
{
if (is_space(v[0]))
{
clear();
return;
}
}
}
void erase(unsigned int start, int num = npos)
{
if (!v)
return;
unsigned int i = 0;
size_t len = size();
//check for bounds
if (num == npos || start+num > len-start)
num = len - start;
//do the erasing
bool copyflag = false;
for (i=0; i<len; i++)
{
if (i>=start && i<start+num)
{
if (i+num < len)
{
v[i] = v[i+num];
} else {
v[i] = 0;
}
copyflag = true;
} else if (copyflag) {
if (i+num < len)
{
v[i] = v[i+num];
} else {
v[i] = 0;
}
}
}
len -= num;
v[len] = 0;
}
String substr(unsigned int index, int num = npos)
{
if (!v)
{
String b("");
return b;
}
String ns;
size_t len = size();
if (index >= len || !v)
return ns;
if (num == npos)
{
num = len - index;
} else if (index+num >= len) {
num = len - index;
}
unsigned int i = 0;
unsigned int nslen = num + 2;
ns.Grow(nslen);
for (i=index; i<index+num; i++)
ns.append(v[i]);
return ns;
}
void toLower()
{
if (!v)
return;
unsigned int i = 0;
size_t len = strlen(v);
for (i=0; i<len; i++)
{
if (v[i] >= 65 && v[i] <= 90)
v[i] &= ~(1<<5);
}
}
String & operator = (const String &src)
{
assign(src);
return *this;
}
String & operator = (const char *src)
{
assign(src);
return *this;
}
char operator [] (unsigned int index)
{
if (index > size() || !v)
{
return -1;
} else {
return v[index];
}
}
int at(int a)
{
if (a < 0 || a >= (int)size() || !v)
return -1;
return v[a];
}
bool at(int at, char c)
{
if (at < 0 || at >= (int)size() || !v)
return false;
v[at] = c;
return true;
}
private:
void Grow(unsigned int d, bool copy=true)
{
if (d <= a_size)
return;
char *n = new char[d + 1];
if (copy && v)
strcpy(n, v);
if (v)
delete [] v;
else
strcpy(n, "");
v = n;
a_size = d + 1;
}
char *v;
unsigned int a_size;
public:
static const int npos = -1;
};
#endif //_INCLUDE_CSTRING_H

View File

@ -1,33 +1,11 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#include "amxmodx.h"
#include "CTask.h"
@ -113,7 +91,9 @@ void CTaskMngr::CTask::changeBase(float fNewBase)
void CTaskMngr::CTask::resetNextExecTime(float fCurrentTime)
{
m_fNextExecTime = fCurrentTime + m_fBase;
// If we're here while we're executing we would add m_fBase twice
if (!m_bInExecute)
m_fNextExecTime = fCurrentTime + m_fBase;
}
void CTaskMngr::CTask::executeIfRequired(float fCurrentTime, float fTimeLimit, float fTimeLeft)
@ -223,35 +203,36 @@ void CTaskMngr::registerTimers(float *pCurrentTime, float *pTimeLimit, float *pT
void CTaskMngr::registerTask(CPluginMngr::CPlugin *pPlugin, int iFunc, int iFlags, cell iId, float fBase, int iParamsLen, const cell *pParams, int iRepeat)
{
// first, search for free tasks
TaskListIter iter = m_Tasks.find(CTaskDescriptor(0, NULL, true));
if (iter)
for (auto &task : m_Tasks)
{
// found: reuse it
iter->set(pPlugin, iFunc, iFlags, iId, fBase, iParamsLen, pParams, iRepeat, *m_pTmr_CurrentTime);
} else {
// not found: make a new one
CTask *pTmp = new CTask;
if (!pTmp)
if (task->isFree() && !task->inExecute())
{
// found: reuse it
task->set(pPlugin, iFunc, iFlags, iId, fBase, iParamsLen, pParams, iRepeat, *m_pTmr_CurrentTime);
return;
pTmp->set(pPlugin, iFunc, iFlags, iId, fBase, iParamsLen, pParams, iRepeat, *m_pTmr_CurrentTime);
m_Tasks.put(pTmp);
}
}
// not found: make a new one
auto task = ke::AutoPtr<CTask>(new CTask);
if (!task)
return;
task->set(pPlugin, iFunc, iFlags, iId, fBase, iParamsLen, pParams, iRepeat, *m_pTmr_CurrentTime);
m_Tasks.append(ke::Move(task));
}
int CTaskMngr::removeTasks(int iId, AMX *pAmx)
{
CTaskDescriptor descriptor(iId, pAmx);
TaskListIter iter = m_Tasks.find(descriptor);
int i = 0;
while (iter)
for (auto &task : m_Tasks)
{
iter->clear();
++i;
iter = m_Tasks.find(++iter, descriptor);
if (task->match(iId, pAmx))
{
task->clear();
++i;
}
}
return i;
@ -259,16 +240,16 @@ int CTaskMngr::removeTasks(int iId, AMX *pAmx)
int CTaskMngr::changeTasks(int iId, AMX *pAmx, float fNewBase)
{
CTaskDescriptor descriptor(iId, pAmx);
TaskListIter iter = m_Tasks.find(descriptor);
int i = 0;
while (iter)
for (auto &task : m_Tasks)
{
iter->changeBase(fNewBase);
iter->resetNextExecTime(*m_pTmr_CurrentTime);
++i;
iter = m_Tasks.find(++iter, descriptor);
if (task->match(iId, pAmx))
{
task->changeBase(fNewBase);
task->resetNextExecTime(*m_pTmr_CurrentTime);
++i;
}
}
return i;
@ -276,16 +257,26 @@ int CTaskMngr::changeTasks(int iId, AMX *pAmx, float fNewBase)
bool CTaskMngr::taskExists(int iId, AMX *pAmx)
{
return m_Tasks.find(CTaskDescriptor(iId, pAmx));
for (auto &task : m_Tasks)
{
if (task->match(iId, pAmx))
{
return true;
}
}
return false;
}
void CTaskMngr::startFrame()
{
for (TaskListIter iter = m_Tasks.begin(); iter; ++iter)
auto lastSize = m_Tasks.length();
for(auto i = 0u; i < lastSize; i++)
{
if (iter->isFree())
auto &task = m_Tasks[i];
if (task->isFree())
continue;
iter->executeIfRequired(*m_pTmr_CurrentTime, *m_pTmr_TimeLimit, *m_pTmr_TimeLeft);
task->executeIfRequired(*m_pTmr_CurrentTime, *m_pTmr_TimeLimit, *m_pTmr_TimeLeft);
}
}

View File

@ -1,33 +1,11 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#ifndef CTASK_H
#define CTASK_H
@ -74,40 +52,17 @@ private:
bool shouldRepeat();
inline bool match(int id, AMX *amx)
{
return (!m_bFree) && (amx ? getAMX() == amx : true) && (m_iId == id);
}
CTask();
~CTask();
};
class CTaskDescriptor
{
public:
cell m_iId;
AMX *m_pAmx;
bool m_bFree;
CTaskDescriptor(int iId, AMX *pAmx, bool bFree = false)
{
m_iId = iId;
m_pAmx = pAmx;
m_bFree = bFree;
}
friend bool operator == (const CTask &left, const CTaskDescriptor &right)
{
if (right.m_bFree)
return (left.isFree() && !left.inExecute());
return (!left.isFree()) &&
(right.m_pAmx ? left.getAMX() == right.m_pAmx : true) &&
(left.getTaskId() == right.m_iId);
}
};
/*** CTaskMngr priv members ***/
typedef CList<CTask, CTaskDescriptor> TaskList;
typedef TaskList::iterator TaskListIter;
TaskList m_Tasks;
ke::Vector<ke::AutoPtr<CTask>> m_Tasks;
float *m_pTmr_CurrentTime;
float *m_pTmr_TimeLimit;

1133
amxmodx/CTextParsers.cpp Normal file

File diff suppressed because it is too large Load Diff

89
amxmodx/CTextParsers.h Normal file
View File

@ -0,0 +1,89 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
* =============================================================================
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, version 3.0, as published by the
* Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id$
*/
#ifndef _INCLUDE_SOURCEMOD_TEXTPARSERS_H_
#define _INCLUDE_SOURCEMOD_TEXTPARSERS_H_
#include <ITextParsers.h>
#include <amtl/am-vector.h>
/**
* @param void * IN: Stream pointer
* @param char * IN/OUT: Stream buffer
* @param size_t IN: Maximum size of buffer
* @param unsigned int * OUT: Number of bytes read (0 = end of stream)
* @return True on success, false on failure
*/
typedef bool(*STREAMREADER)(void *, char *, size_t, unsigned int *);
class TextParsers : public ITextParsers
{
public:
TextParsers();
public:
bool ParseFile_INI(const char *file,
ITextListener_INI *ini_listener,
unsigned int *line,
unsigned int *col,
bool inline_comment);
SMCError ParseFile_SMC(const char *file,
ITextListener_SMC *smc_listener,
SMCStates *states);
SMCError ParseSMCFile(const char *file,
ITextListener_SMC *smc_listener,
SMCStates *states,
char *buffer,
size_t maxsize);
SMCError ParseSMCStream(const char *stream,
size_t length,
ITextListener_SMC *smc_listener,
SMCStates *states,
char *buffer,
size_t maxsize);
unsigned int GetUTF8CharBytes(const char *stream);
const char *GetSMCErrorString(SMCError err);
bool IsWhitespace(const char *stream);
private:
SMCError ParseStream_SMC(void *stream,
STREAMREADER srdr,
ITextListener_SMC *smc,
SMCStates *states);
};
extern TextParsers g_TextParser;
#endif //_INCLUDE_SOURCEMOD_TEXTPARSERS_H_

View File

@ -1,40 +1,18 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include "amxmodx.h"
#include "CVault.h"
#include "CFile.h"
#include "CFileSystem.h"
// *****************************************************
// class Vault
@ -61,7 +39,7 @@ void Vault::put(const char* k, const char* v)
if (*a)
{
(*a)->value.assign(v);
(*a)->value = v;
(*a)->number = atoi(v);
}
else
@ -79,7 +57,7 @@ Vault::Obj** Vault::find(const char* n)
while (*a)
{
if (strcmp((*a)->key.c_str(), n) == 0)
if (strcmp((*a)->key.chars(), n) == 0)
return a;
a = &(*a)->next;
@ -108,7 +86,7 @@ const char* Vault::get(const char* n)
if (b == 0) return "";
return b->value.c_str();
return b->value.chars();
}
void Vault::clear()
@ -134,45 +112,74 @@ void Vault::remove(const char* n)
void Vault::setSource(const char* n)
{
path.assign(n);
path = n;
}
bool Vault::loadVault()
{
if (path.empty()) return false;
if (!path.length())
{
return false;
}
clear();
File a(path.c_str(), "r");
FILE *fp = fopen(path.chars(), "r");
if (!a) return false;
const int sz = 512;
char value[sz + 1];
char key[sz + 1];
while (a >> key && a.skipWs() && a.getline(value, sz))
if (!fp)
{
if (isalpha(*key))
put(key, value);
return false;
}
char lineRead[512];
char key[sizeof(lineRead) + 1];
char value[sizeof(lineRead) + 1];
while (fgets(lineRead, sizeof(lineRead), fp))
{
UTIL_TrimLeft(lineRead);
if (!*lineRead || *lineRead == ';')
{
continue;
}
sscanf(lineRead, "%s%*[ \t]%[^\n]", key, value);
if (isalpha(*key))
{
put(key, value);
}
}
fclose(fp);
return true;
}
bool Vault::saveVault()
{
if (path.empty()) return false;
if (!path.length())
{
return false;
}
File a(path.c_str(), "w");
FILE *fp = fopen(path.chars(), "w");
if (!a) return false;
if (!fp)
{
return false;
}
a << "; Don't modify!" << '\n';
fputs("; Don't modify!\n", fp);
for (Obj* b = head; b; b = b->next)
a << b->key << '\t' << b->value << '\n';
{
fprintf(fp, "%s\t%s\n", b->key.chars(), b->value.chars());
}
fclose(fp);
return true;
}

View File

@ -1,40 +1,15 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#ifndef VAULT_CUSTOM_H
#define VAULT_CUSTOM_H
#include "CString.h"
#include "CList.h"
// *****************************************************
// class Vault
// *****************************************************
@ -43,15 +18,15 @@ class Vault
{
struct Obj
{
String key;
String value;
ke::AString key;
ke::AString value;
int number;
Obj *next;
Obj(const char* k, const char* v);
} *head;
String path;
ke::AString path;
Obj** find(const char* n);
@ -84,8 +59,8 @@ public:
iterator& operator++() { if (a) a = a->next; return *this; }
bool operator==(const iterator& b) const { return a == b.a; }
bool operator!=(const iterator& b) const { return !operator==(b); }
String& key() const { return a->key; }
String& value() const { return a->value; }
ke::AString& key() const { return a->key; }
ke::AString& value() const { return a->value; }
};
inline iterator begin() const { return iterator(head); }

View File

@ -1,491 +0,0 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
#ifndef __CVECTOR_H__
#define __CVECTOR_H__
#include <assert.h>
// Vector
template <class T> class CVector
{
bool Grow()
{
// automatic grow
size_t newSize = m_Size * 2;
if (newSize == 0)
newSize = 8; // a good init value
T *newData = new T[newSize];
if (!newData)
return false;
if (m_Data)
{
for (size_t i=0; i<m_CurrentUsedSize; i++)
newData[i] = m_Data[i];
delete [] m_Data;
}
m_Data = newData;
m_Size = newSize;
return true;
}
bool GrowIfNeeded()
{
if (m_CurrentUsedSize >= m_Size)
return Grow();
else
return true;
}
bool ChangeSize(size_t size)
{
// change size
if (size == m_Size)
return true;
if (!size)
{
if (m_Data)
{
delete [] m_Data;
m_Data = NULL;
m_Size = 0;
}
return true;
}
T *newData = new T[size];
if (!newData)
return false;
if (m_Data)
{
size_t end = (m_CurrentUsedSize < size) ? (m_CurrentUsedSize) : size;
for (size_t i=0; i<end; i++)
newData[i] = m_Data[i];
delete [] m_Data;
}
m_Data = newData;
m_Size = size;
if (m_CurrentUsedSize > m_Size)
m_CurrentUsedSize = m_Size;
return true;
}
void FreeMemIfPossible()
{
if (!m_Data)
return;
if (!m_CurrentUsedSize)
{
ChangeSize(0);
return;
}
size_t newSize = m_Size;
while (m_CurrentUsedSize <= newSize / 2)
newSize /= 2;
if (newSize != m_Size)
ChangeSize(newSize);
}
protected:
T *m_Data;
size_t m_Size;
size_t m_CurrentUsedSize;
public:
class iterator
{
protected:
T *m_Ptr;
public:
// constructors / destructors
iterator()
{
m_Ptr = NULL;
}
iterator(T * ptr)
{
m_Ptr = ptr;
}
// member functions
T * base()
{
return m_Ptr;
}
const T * base() const
{
return m_Ptr;
}
// operators
T & operator*()
{
return *m_Ptr;
}
T * operator->()
{
return m_Ptr;
}
iterator & operator++() // preincrement
{
++m_Ptr;
return (*this);
}
iterator operator++(int) // postincrement
{
iterator tmp = *this;
++m_Ptr;
return tmp;
}
iterator & operator--() // predecrement
{
--m_Ptr;
return (*this);
}
iterator operator--(int) // postdecrememnt
{
iterator tmp = *this;
--m_Ptr;
return tmp;
}
bool operator==(T * right) const
{
return (m_Ptr == right);
}
bool operator==(const iterator & right) const
{
return (m_Ptr == right.m_Ptr);
}
bool operator!=(T * right) const
{
return (m_Ptr != right);
}
bool operator!=(const iterator & right) const
{
return (m_Ptr != right.m_Ptr);
}
iterator & operator+=(size_t offset)
{
m_Ptr += offset;
return (*this);
}
iterator & operator-=(size_t offset)
{
m_Ptr -= offset;
return (*this);
}
iterator operator+(size_t offset) const
{
iterator tmp(*this);
tmp.m_Ptr += offset;
return tmp;
}
iterator operator-(size_t offset) const
{
iterator tmp(*this);
tmp.m_Ptr -= offset;
return tmp;
}
T & operator[](size_t offset)
{
return (*(*this + offset));
}
const T & operator[](size_t offset) const
{
return (*(*this + offset));
}
bool operator<(const iterator & right) const
{
return m_Ptr < right.m_Ptr;
}
bool operator>(const iterator & right) const
{
return m_Ptr > right.m_Ptr;
}
bool operator<=(const iterator & right) const
{
return m_Ptr <= right.m_Ptr;
}
bool operator>=(const iterator & right) const
{
return m_Ptr >= right.m_Ptr;
}
size_t operator-(const iterator & right) const
{
return m_Ptr - right.m_Ptr;
}
};
// constructors / destructors
CVector<T>()
{
m_Size = 0;
m_CurrentUsedSize = 0;
m_Data = NULL;
}
CVector<T>(const CVector<T> & other)
{
// copy data
m_Data = new T [other.m_CurrentUsedSize];
m_Size = other.m_CurrentUsedSize;
m_CurrentUsedSize = other.m_CurrentUsedSize;
for (size_t i=0; i<other.m_CurrentUsedSize; i++)
m_Data[i] = other.m_Data[i];
}
~CVector<T>()
{
clear();
}
// interface
size_t size() const
{
return m_CurrentUsedSize;
}
size_t capacity() const
{
return m_Size;
}
iterator begin() const
{
return iterator(m_Data);
}
iterator end() const
{
return iterator(m_Data + m_CurrentUsedSize);
}
iterator iterAt(size_t pos)
{
if (pos > m_CurrentUsedSize)
assert(0);
return iterator(m_Data + pos);
}
bool reserve(size_t newSize)
{
if (newSize > m_Size)
return ChangeSize(newSize);
return true;
}
bool push_back(const T & elem)
{
++m_CurrentUsedSize;
if (!GrowIfNeeded())
{
--m_CurrentUsedSize;
return false;
}
m_Data[m_CurrentUsedSize - 1] = elem;
return true;
}
void pop_back()
{
--m_CurrentUsedSize;
if (m_CurrentUsedSize < 0)
m_CurrentUsedSize = 0;
FreeMemIfPossible();
}
bool resize(size_t newSize)
{
if (!ChangeSize(newSize))
return false;
m_CurrentUsedSize = newSize;
return true;
}
bool empty() const
{
return (m_CurrentUsedSize == 0);
}
T & at(size_t pos)
{
if (pos > m_CurrentUsedSize)
{
assert(0);
}
return m_Data[pos];
}
const T & at(size_t pos) const
{
if (pos > m_CurrentUsedSize)
{
assert(0);
}
return m_Data[pos];
}
T & operator[](size_t pos)
{
return at(pos);
}
const T & operator[](size_t pos) const
{
return at(pos);
}
T & front()
{
if (m_CurrentUsedSize < 1)
{
assert(0);
}
return m_Data[0];
}
const T & front() const
{
if (m_CurrentUsedSize < 1)
{
assert(0);
}
return m_Data[0];
}
T & back()
{
if (m_CurrentUsedSize < 1)
{
assert(0);
}
return m_Data[m_CurrentUsedSize - 1];
}
const T & back() const
{
if (m_CurrentUsedSize < 1)
{
assert(0);
}
return m_Data[m_CurrentUsedSize - 1];
}
iterator insert(iterator where, const T & value)
{
// validate iter
if (where < m_Data || where > (m_Data + m_CurrentUsedSize))
return iterator(0);
size_t ofs = where - begin();
++m_CurrentUsedSize;
if (!GrowIfNeeded())
{
--m_CurrentUsedSize;
return false;
}
where = begin() + ofs;
// Move subsequent entries
for (T *ptr = m_Data + m_CurrentUsedSize - 2; ptr >= where.base(); --ptr)
*(ptr + 1) = *ptr;
*where.base() = value;
return where;
}
iterator erase(iterator where)
{
// validate iter
if (where < m_Data || where >= (m_Data + m_CurrentUsedSize))
return iterator(0);
size_t ofs = where - begin();
if (m_CurrentUsedSize > 1)
{
// move
T *theend = m_Data + m_CurrentUsedSize;
for (T *ptr = where.base() + 1; ptr < theend; ++ptr)
*(ptr - 1) = *ptr;
}
--m_CurrentUsedSize;
FreeMemIfPossible();
return begin() + ofs;
}
void clear()
{
m_Size = 0;
m_CurrentUsedSize = 0;
if (m_Data)
{
delete [] m_Data;
m_Data = NULL;
}
}
};
#endif // __CVECTOR_H__

340
amxmodx/CoreConfig.cpp Normal file
View File

@ -0,0 +1,340 @@
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#include "amxmodx.h"
#include "CoreConfig.h"
#include "CLibrarySys.h"
#include <amxmodx_version.h>
CoreConfig CoreCfg;
const char *MainConfigFile = "amxx.cfg";
const char *AutoConfigDir = "/plugins";
const char *MapConfigDir = "/maps";
const char *CommandFormat = "exec %s\n";
CoreConfig::CoreConfig()
{
Clear();
}
CoreConfig::~CoreConfig()
{
}
void CoreConfig::OnAmxxInitialized()
{
m_ConfigsBufferedForward = registerForward("OnAutoConfigsBuffered", ET_IGNORE, FP_DONE);
m_ConfigsExecutedForward = registerForward("OnConfigsExecuted", ET_IGNORE, FP_DONE);
}
void CoreConfig::Clear()
{
m_ConfigsExecuted = false;
m_PendingForwardPush = false;
m_LegacyMainConfigExecuted = false;
m_LegacyMapConfigsExecuted = false,
m_legacyMapConfigNextTime = 0.0f;
}
void CoreConfig::ExecuteMainConfig()
{
if (m_LegacyMainConfigExecuted)
{
return;
}
char path[PLATFORM_MAX_PATH];
char command[PLATFORM_MAX_PATH + sizeof(CommandFormat)];
ke::SafeSprintf(path, sizeof(path), "%s/%s/%s", g_mod_name.chars(), get_localinfo("amxx_configsdir", "addons/amxmodx/configs"), MainConfigFile);
ke::SafeSprintf(command, sizeof(command), CommandFormat, path);
SERVER_COMMAND(command);
}
void CoreConfig::ExecuteAutoConfigs()
{
for (size_t i = 0; i < static_cast<size_t>(g_plugins.getPluginsNum()); ++i)
{
auto plugin = g_plugins.findPlugin(i);
bool can_create = true;
for (size_t j = 0; j < plugin->GetConfigCount(); ++j)
{
can_create = ExecuteAutoConfig(plugin, plugin->GetConfig(j), can_create);
}
}
executeForwards(m_ConfigsBufferedForward);
}
bool CoreConfig::ExecuteAutoConfig(CPluginMngr::CPlugin *plugin, AutoConfig *config, bool can_create)
{
bool will_create = false;
const char *configsDir = get_localinfo("amxx_configsdir", "addons/amxmodx/configs");
if (can_create && config->create)
{
will_create = true;
const char *folder = config->folder.chars();
char path[PLATFORM_MAX_PATH];
char build[PLATFORM_MAX_PATH];
build_pathname_r(path, sizeof(path), "%s%s/%s", configsDir, AutoConfigDir, folder);
if (!g_LibSys.IsPathDirectory(path))
{
char *cur_ptr = path;
g_LibSys.PathFormat(path, sizeof(path), "%s", folder);
build_pathname_r(build, sizeof(build), "%s%s", configsDir, AutoConfigDir);
size_t length = strlen(build);
do
{
char *next_ptr = cur_ptr;
while (*next_ptr != '\0')
{
if (*next_ptr == PLATFORM_SEP_CHAR)
{
*next_ptr = '\0';
next_ptr++;
break;
}
next_ptr++;
}
if (*next_ptr == '\0')
{
next_ptr = nullptr;
}
length += g_LibSys.PathFormat(&build[length], sizeof(build) - length, "/%s", cur_ptr);
if (!g_LibSys.CreateFolder(build))
{
break;
}
cur_ptr = next_ptr;
} while (cur_ptr);
}
}
char file[PLATFORM_MAX_PATH];
if (config->folder.length())
{
ke::SafeSprintf(file, sizeof(file), "%s/%s%s/%s/%s.cfg", g_mod_name.chars(), configsDir, AutoConfigDir, config->folder.chars(), config->autocfg.chars());
}
else
{
ke::SafeSprintf(file, sizeof(file), "%s/%s%s/%s.cfg", g_mod_name.chars(), configsDir, AutoConfigDir, config->autocfg.chars());
}
bool file_exists = g_LibSys.IsPathFile(file);
if (!file_exists && will_create)
{
auto list = g_CvarManager.GetCvarsList();
if (list->empty())
{
return can_create;
}
FILE *fp = fopen(file, "wt");
if (fp)
{
fprintf(fp, "// This file was auto-generated by AMX Mod X (v%s)\n", AMXX_VERSION);
if (*plugin->getTitle() && *plugin->getAuthor() && *plugin->getVersion())
{
fprintf(fp, "// Cvars for plugin \"%s\" by \"%s\" (%s, v%s)\n", plugin->getTitle(), plugin->getAuthor(), plugin->getName(), plugin->getVersion());
}
else
{
fprintf(fp, "// Cvars for plugin \"%s\"\n", plugin->getName());
}
fprintf(fp, "\n\n");
for (auto iter = list->begin(); iter != list->end(); iter++)
{
auto info = (*iter);
if (info->pluginId == plugin->getId())
{
char description[255];
char *ptr = description;
// Print comments until there is no more
strncopy(description, info->description.chars(), sizeof(description));
while (*ptr != '\0')
{
// Find the next line
char *next_ptr = ptr;
while (*next_ptr != '\0')
{
if (*next_ptr == '\n')
{
*next_ptr = '\0';
next_ptr++;
break;
}
next_ptr++;
}
fprintf(fp, "// %s\n", ptr);
ptr = next_ptr;
}
fprintf(fp, "// -\n");
fprintf(fp, "// Default: \"%s\"\n", info->defaultval.chars());
if (info->bound.hasMin)
{
fprintf(fp, "// Minimum: \"%02f\"\n", info->bound.minVal);
}
if (info->bound.hasMax)
{
fprintf(fp, "// Maximum: \"%02f\"\n", info->bound.maxVal);
}
fprintf(fp, "%s \"%s\"\n", info->var->name, info->defaultval.chars());
fprintf(fp, "\n");
}
}
fprintf(fp, "\n");
file_exists = true;
can_create = false;
fclose(fp);
}
else
{
AMXXLOG_Error("Failed to auto generate config for %s, make sure the directory has write permission.", plugin->getName());
return can_create;
}
}
if (file_exists)
{
char command[PLATFORM_MAX_PATH + sizeof(CommandFormat)];
ke::SafeSprintf(command, sizeof(command), CommandFormat, file);
SERVER_COMMAND(command);
}
return can_create;
}
void CoreConfig::ExecuteMapConfig()
{
const char *configsDir = get_localinfo("amxx_configsdir", "addons/amxmodx/configs");
char cfgPath[PLATFORM_MAX_PATH];
char mapName[PLATFORM_MAX_PATH];
char command[PLATFORM_MAX_PATH + sizeof(CommandFormat)];
strncopy(mapName, STRING(gpGlobals->mapname), sizeof(mapName));
char *mapPrefix;
if ((mapPrefix = strtok(mapName, "_")))
{
ke::SafeSprintf(cfgPath, sizeof(cfgPath), "%s/%s%s/prefix_%s.cfg", g_mod_name.chars(), configsDir, MapConfigDir, mapPrefix);
if (g_LibSys.IsPathFile(cfgPath))
{
ke::SafeSprintf(command, sizeof(command), CommandFormat, cfgPath);
SERVER_COMMAND(command);
}
}
strncopy(mapName, STRING(gpGlobals->mapname), sizeof(mapName));
ke::SafeSprintf(cfgPath, sizeof(cfgPath), "%s/%s%s/%s.cfg", g_mod_name.chars(), configsDir, MapConfigDir, mapName);
if (g_LibSys.IsPathFile(cfgPath))
{
ke::SafeSprintf(command, sizeof(command), CommandFormat, cfgPath);
SERVER_COMMAND(command);
}
// Consider all configs be executed to the next frame.
m_PendingForwardPush = true;
}
void CoreConfig::OnMapConfigTimer()
{
if (m_ConfigsExecuted)
{
return;
}
if (m_legacyMapConfigNextTime <= gpGlobals->time)
{
if (m_PendingForwardPush)
{
m_PendingForwardPush = false;
m_ConfigsExecuted = true;
executeForwards(m_ConfigsExecutedForward);
}
else if (!m_LegacyMapConfigsExecuted)
{
ExecuteMapConfig();
}
}
}
void CoreConfig::CheckLegacyBufferedCommand(char *command)
{
if (m_ConfigsExecuted)
{
return;
}
if (!m_LegacyMainConfigExecuted && strstr(command, MainConfigFile))
{
m_LegacyMainConfigExecuted = true;
}
if (!m_LegacyMapConfigsExecuted && strstr(command, MapConfigDir))
{
m_LegacyMapConfigsExecuted = true;
// Consider all configs be executed to m_legacyMapConfigNextTime time.
m_PendingForwardPush = true;
}
}
void CoreConfig::SetMapConfigTimer(float time)
{
m_legacyMapConfigNextTime = gpGlobals->time + time;
}

51
amxmodx/CoreConfig.h Normal file
View File

@ -0,0 +1,51 @@
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#ifndef _CORE_CONFIG_H_
#define _CORE_CONFIG_H_
#include "CPlugin.h"
class CoreConfig
{
public:
CoreConfig();
~CoreConfig();
public:
void Clear();
void ExecuteMainConfig();
void ExecuteAutoConfigs();
bool ExecuteAutoConfig(CPluginMngr::CPlugin *plugin, AutoConfig *config, bool can_create);
void ExecuteMapConfig();
void OnAmxxInitialized();
void OnMapConfigTimer();
void CheckLegacyBufferedCommand(char *command);
void SetMapConfigTimer(float time);
private:
bool m_ConfigsExecuted; // Whether all configs have been executed
bool m_PendingForwardPush; // Whether OnConfigsExecuted forward should be triggered to the next frame
bool m_LegacyMainConfigExecuted; // Whether the old admin.sma is used and amxx.cfg was executed from there
bool m_LegacyMapConfigsExecuted; // Whether the old admin.sma is used and per-map config was executed from there
float m_legacyMapConfigNextTime; // Sets the next time that per-map configs should be executed
int m_ConfigsBufferedForward;
int m_ConfigsExecutedForward;
};
extern CoreConfig CoreCfg;
#endif // _CORE_CONFIG_H_

669
amxmodx/CvarManager.cpp Normal file
View File

@ -0,0 +1,669 @@
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#include "CvarManager.h"
#include "amxmodx.h"
#include <CDetour/detours.h>
#include <auto-string.h>
#include <resdk/mod_rehlds_api.h>
CvarManager g_CvarManager;
void (*Cvar_DirectSet_Actual)(struct cvar_s* var, const char *value) = nullptr;
void Cvar_DirectSet_Custom(struct cvar_s *var, const char *value, IRehldsHook_Cvar_DirectSet *chain = nullptr)
{
CvarInfo* info = nullptr;
if (!var || !value // Sanity checks against bogus pointers.
|| strcmp(var->string, value) == 0 // Make sure old and new values are different to not trigger callbacks.
|| !g_CvarManager.CacheLookup(var->name, &info)) // No data in cache, nothing to do.
{
chain ? chain->callNext(var, value) : Cvar_DirectSet_Actual(var, value);
return;
}
if (info->bound.hasMin || info->bound.hasMax) // cvar_s doesn't have min/max mechanism, so we check things here.
{
float fvalue = atof(value);
bool oob = false;
if (info->bound.hasMin && fvalue < info->bound.minVal)
{
oob = true;
fvalue = info->bound.minVal;
}
else if (info->bound.hasMax && fvalue > info->bound.maxVal)
{
oob = true;
fvalue = info->bound.maxVal;
}
if (oob) // Found value out of bound, set new value and block original call.
{
CVAR_SET_FLOAT(var->name, fvalue);
return;
}
}
ke::AString oldValue; // We save old value since it will be likely changed after original function called.
if (!info->hooks.empty())
{
oldValue = var->string;
}
chain ? chain->callNext(var, value) : Cvar_DirectSet_Actual(var, value);
if (!info->binds.empty())
{
for (size_t i = 0; i < info->binds.length(); ++i)
{
CvarBind* bind = info->binds[i];
switch (bind->type)
{
case CvarBind::CvarType_Int:
{
*bind->varAddress = atoi(var->string);
break;
}
case CvarBind::CvarType_Float:
{
float fvalue = atof(var->string);
*bind->varAddress = amx_ftoc(fvalue);
break;
}
case CvarBind::CvarType_String:
{
set_amxstring_simple(bind->varAddress, var->string, bind->varLength);
break;
}
}
}
}
if (!info->hooks.empty())
{
for (size_t i = 0; i < info->hooks.length(); ++i)
{
CvarHook* hook = info->hooks[i];
if (hook->forward->state == AutoForward::FSTATE_OK) // Our callback can be enable/disabled by natives.
{
executeForwards(hook->forward->id, reinterpret_cast<cvar_t*>(var), oldValue.chars(), var->string);
}
}
}
}
void Cvar_DirectSet(struct cvar_s *var, const char *value)
{
Cvar_DirectSet_Custom(var, value);
}
void Cvar_DirectSet_RH(IRehldsHook_Cvar_DirectSet *chain, cvar_t *var, const char *value)
{
Cvar_DirectSet_Custom(var, value, chain);
}
CvarManager::CvarManager() : m_AmxmodxCvars(0), m_HookDetour(nullptr), m_ReHookEnabled(false)
{
}
CvarManager::~CvarManager()
{
OnAmxxShutdown();
}
void CvarManager::CreateCvarHook(void)
{
// void PF_Cvar_DirectSet(struct cvar_s *var, const char *value) // = pfnCvar_DirectSet
// {
// Cvar_DirectSet(var, value); // <- We want to hook this.
// }
if (!RehldsHookchains)
{
void *functionAddress = nullptr;
if (CommonConfig && CommonConfig->GetMemSig("Cvar_DirectSet", &functionAddress) && functionAddress)
{
// Disabled by default.
m_HookDetour = DETOUR_CREATE_STATIC_FIXED(Cvar_DirectSet, functionAddress);
}
else
{
AMXXLOG_Log("Binding/Hooking cvars have been disabled - %s.", RehldsApi ? "update ReHLDS" : "check your gamedata files");
}
}
}
void CvarManager::EnableHook()
{
if (RehldsHookchains)
{
if (!m_ReHookEnabled)
{
RehldsHookchains->Cvar_DirectSet()->registerHook(Cvar_DirectSet_RH);
m_ReHookEnabled = true;
}
}
else if (m_HookDetour)
{
m_HookDetour->EnableDetour();
}
}
void CvarManager::DisableHook()
{
if (RehldsHookchains)
{
if (m_ReHookEnabled)
{
RehldsHookchains->Cvar_DirectSet()->unregisterHook(Cvar_DirectSet_RH);
m_ReHookEnabled = false;
}
}
else if (m_HookDetour)
{
m_HookDetour->DisableDetour();
}
}
void CvarManager::DestroyHook()
{
DisableHook();
if (m_HookDetour)
{
m_HookDetour->Destroy();
}
}
CvarInfo* CvarManager::CreateCvar(const char* name, const char* value, const char* plugin, int pluginId, int flags,
const char* helpText)
{
cvar_t* var = nullptr;
CvarInfo* info = nullptr;
if (!CacheLookup(name, &info))
{
// Not cached - Is cvar already exist?
var = CVAR_GET_POINTER(name);
// Whether it exists, we need to prepare a new entry.
info = new CvarInfo(name, helpText, plugin, pluginId);
if (var)
{
// Cvar already exists. Just copy.
// "string" will be set after. "value" and "next" are automatically set.
info->var = var;
info->defaultval = var->string;
info->amxmodx = false;
}
else
{
// Registers a new cvar.
static cvar_t cvar_reg_helper;
// "string" will be set after. "value" and "next" are automatically set.
cvar_reg_helper.name = info->name.chars();
cvar_reg_helper.string = "";
cvar_reg_helper.flags = flags;
// Adds cvar to global list.
CVAR_REGISTER(&cvar_reg_helper);
// Registering can fail if name is already a registered command.
var = CVAR_GET_POINTER(name);
// If so, we can't go further.
if (!var)
{
delete info;
return nullptr;
}
// If ok, we got a valid pointer, we can copy.
info->var = var;
info->defaultval = value;
info->amxmodx = true;
// Keeps track count of cvars registered by AMXX.
++m_AmxmodxCvars;
}
// Add a new entry in the caches.
m_Cvars.append(info);
m_Cache.insert(name, info);
// Make sure that whether an existing or new cvar is set to the given value.
CVAR_DIRECTSET(var, value);
}
else if (info->pluginId == -1)
{
// In situation where a plugin has been modified/recompiled
// or new added plugins, and a change map occurs. We want to keep data up to date.
info->bound.hasMin = false;
info->bound.minVal = 0;
info->bound.hasMax = false;
info->bound.maxVal = 0;
info->defaultval = value;
info->description = helpText;
info->pluginId = pluginId;
}
// Detour is disabled on map change.
// Don't enable it unless there are things to do.
if ((info->bound.hasMin || info->bound.hasMax))
{
EnableHook();
}
return info;
}
CvarInfo* CvarManager::FindCvar(const char* name)
{
cvar_t* var = nullptr;
CvarInfo* info = nullptr;
// Do we have already cvar in cache?
if (CacheLookup(name, &info))
{
return info;
}
// Cvar doesn't exist.
if (!(var = CVAR_GET_POINTER(name)))
{
return nullptr;
}
// Create a new entry.
info = new CvarInfo(name);
info->var = var;
// Add entry in the caches.
m_Cvars.append(info);
m_Cache.insert(name, info);
return info;
}
CvarInfo* CvarManager::FindCvar(size_t index)
{
// Used by get_plugins_cvar native.
// For compatibility, only cvars registered by AMXX are concerned.
size_t iter_id = 0;
for (CvarsList::iterator iter = m_Cvars.begin(); iter != m_Cvars.end(); iter++)
{
if (iter->amxmodx && iter_id++ == index)
{
return *(iter);
}
}
return nullptr;
}
bool CvarManager::CacheLookup(const char* name, CvarInfo** info)
{
return m_Cache.retrieve(name, info);
}
AutoForward* CvarManager::HookCvarChange(cvar_t* var, AMX* amx, cell param, const char** callback)
{
CvarInfo* info = nullptr;
// A cvar is guaranteed to be in cache if pointer is got from
// get_cvar_pointer and register_cvar natives. Though it might be
// provided by another way. If by any chance we run in such
// situation, we create a new entry right now.
if (!CacheLookup(var->name, &info))
{
// Create a new entry.
info = new CvarInfo(var->name);
info->var = var;
// Add entry in the caches.
m_Cvars.append(info);
m_Cache.insert(info->name.chars(), info);
}
int length;
*callback = get_amxstring(amx, param, 0, length);
int forwardId = registerSPForwardByName(amx, *callback, FP_CELL, FP_STRING, FP_STRING, FP_DONE);
// Invalid callback, it could be: not a public function, wrongly named, or simply missing.
if (forwardId == -1)
{
return nullptr;
}
// Hook is disabled on map change.
EnableHook();
AutoForward* forward = new AutoForward(forwardId, *callback);
info->hooks.append(new CvarHook(g_plugins.findPlugin(amx)->getId(), forward));
return forward;
}
bool CvarManager::BindCvar(CvarInfo* info, CvarBind::CvarType type, AMX* amx, cell varofs, size_t varlen)
{
if (varofs > amx->hlw) // If variable address is not inside global area, we can't bind it.
{
LogError(amx, AMX_ERR_NATIVE, "Cvars can only be bound to global variables");
return false;
}
int pluginId = g_plugins.findPluginFast(amx)->getId();
cell* address = get_amxaddr(amx, varofs);
// To avoid unexpected behavior, probably better to error such situations.
for (size_t i = 0; i < info->binds.length(); ++i)
{
CvarBind* bind = info->binds[i];
if (bind->pluginId == pluginId)
{
if (bind->varAddress == address)
{
LogError(amx, AMX_ERR_NATIVE, "A global variable can not be bound to multiple Cvars");
return false;
}
}
}
CvarBind* bind = new CvarBind(pluginId, type, get_amxaddr(amx, varofs), varlen);
info->binds.append(bind);
// Update right away variable with current cvar value.
switch (type)
{
case CvarBind::CvarType_Int:
*bind->varAddress = atoi(info->var->string);
break;
case CvarBind::CvarType_Float:
*bind->varAddress = amx_ftoc(info->var->value);
break;
case CvarBind::CvarType_String:
set_amxstring_simple(bind->varAddress, info->var->string, bind->varLength);
break;
}
// Hook is disabled on map change.
EnableHook();
return true;
}
void CvarManager::SetCvarMin(CvarInfo* info, bool set, float value, int pluginId)
{
info->bound.hasMin = set;
info->bound.minPluginId = pluginId;
if (set)
{
// Hook is disabled on map change.
EnableHook();
info->bound.minVal = value;
// Current value is already in the allowed range.
if (info->var->value >= value)
{
return;
}
// Update if needed.
CVAR_SET_FLOAT(info->var->name, value);
}
}
void CvarManager::SetCvarMax(CvarInfo* info, bool set, float value, int pluginId)
{
info->bound.hasMax = set;
info->bound.maxPluginId = pluginId;
if (set)
{
// Hook is disabled on map change.
EnableHook();
info->bound.maxVal = value;
// Current value is already in the allowed range.
if (info->var->value <= value)
{
return;
}
// Update if needed.
CVAR_SET_FLOAT(info->var->name, value);
}
}
size_t CvarManager::GetRegCvarsCount()
{
return m_AmxmodxCvars;
}
CvarsList* CvarManager::GetCvarsList()
{
return &m_Cvars;
}
ke::AutoString convertFlagsToString(int flags)
{
ke::AutoString flagsName;
if (flags > 0)
{
if (flags & FCVAR_ARCHIVE) flagsName = flagsName + "FCVAR_ARCHIVE ";
if (flags & FCVAR_USERINFO) flagsName = flagsName + "FCVAR_USERINFO ";
if (flags & FCVAR_SERVER) flagsName = flagsName + "FCVAR_SERVER ";
if (flags & FCVAR_EXTDLL) flagsName = flagsName + "FCVAR_EXTDLL ";
if (flags & FCVAR_CLIENTDLL) flagsName = flagsName + "FCVAR_CLIENTDLL ";
if (flags & FCVAR_PROTECTED) flagsName = flagsName + "FCVAR_PROTECTED ";
if (flags & FCVAR_SPONLY) flagsName = flagsName + "FCVAR_SPONLY ";
if (flags & FCVAR_PRINTABLEONLY) flagsName = flagsName + "FCVAR_PRINTABLEONLY ";
if (flags & FCVAR_UNLOGGED) flagsName = flagsName + "FCVAR_UNLOGGED ";
if (flags & FCVAR_NOEXTRAWHITEPACE) flagsName = flagsName + "FCVAR_NOEXTRAWHITEPACE ";
}
if (!flagsName.length())
{
flagsName = "-";
}
return flagsName;
}
void CvarManager::OnConsoleCommand()
{
size_t index = 0;
size_t indexToSearch = 0;
ke::AString partialName;
int argcount = CMD_ARGC();
// amxx cvars [partial plugin name] [index from listing]
// E.g.:
// amxx cvars test <- list all cvars from plugin name starting by "test"
// amxx cvars 2 <- show informations about cvar in position 2 from "amxx cvars" list
// amxx cvars test 2 <- show informations about cvar in position 2 from "amxx cvars test" list
if (argcount > 2)
{
const char* argument = CMD_ARGV(2);
indexToSearch = atoi(argument); // amxx cvars 2
if (!indexToSearch)
{
partialName = argument; // amxx cvars test
if (argcount > 3) // amxx cvars test 2
{
indexToSearch = atoi(CMD_ARGV(3));
}
}
}
if (!indexToSearch)
{
print_srvconsole("\nManaged cvars:\n");
print_srvconsole(" %-24.23s %-24.23s %-18.17s %-8.7s %-8.7s %-8.7s\n", "NAME", "VALUE", "PLUGIN", "HOOKED", "MIN", "MAX");
print_srvconsole(" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n");
}
for (CvarsList::iterator iter = m_Cvars.begin(); iter != m_Cvars.end(); iter++)
{
CvarInfo* ci = (*iter);
// List any cvars having a status either created, hooked or bound by a plugin.
bool in_list = ci->amxmodx || !ci->binds.empty() || !ci->hooks.empty() || ci->bound.hasMin || ci->bound.hasMax;
if (in_list && (!partialName.length() || strncmp(ci->plugin.chars(), partialName.chars(), partialName.length()) == 0))
{
if (!indexToSearch)
{
print_srvconsole(" [%3d] %-24.23s %-24.23s %-18.17s %-8.7s ", ++index, ci->name.chars(), ci->var->string,
ci->plugin.length() ? ci->plugin.chars() : "-",
ci->hooks.empty() ? "no" : "yes");
(ci->bound.hasMin) ? print_srvconsole("%-8.2f ", ci->bound.minVal) : print_srvconsole("%-8.7s ", "-");
(ci->bound.hasMax) ? print_srvconsole("%-8.2f ", ci->bound.maxVal) : print_srvconsole("%-8.7s ", "-");
print_srvconsole("\n");
}
else
{
if (++index != indexToSearch)
{
continue;
}
print_srvconsole("\nCvar details :\n\n");
print_srvconsole(" Cvar name : %s\n", ci->var->name);
print_srvconsole(" Value : %s\n", ci->var->string);
print_srvconsole(" Def. value : %s\n", ci->defaultval.chars());
print_srvconsole(" Description : %s\n", ci->description.chars());
print_srvconsole(" Flags : %s\n\n", convertFlagsToString(ci->var->flags).ptr());
print_srvconsole(" %-12s %-26.25s %s\n", "STATUS", "PLUGIN", "INFOS");
print_srvconsole(" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n");
if (ci->amxmodx)
{
print_srvconsole(" Registered %-26.25s %s\n", ci->plugin.chars(), "-");
}
if (ci->bound.hasMin)
{
print_srvconsole(" Min value %-26.25s %f\n", g_plugins.findPlugin(ci->bound.minPluginId)->getName(), ci->bound.minVal);
}
if (ci->bound.hasMax)
{
print_srvconsole(" Max value %-26.25s %f\n", g_plugins.findPlugin(ci->bound.maxPluginId)->getName(), ci->bound.maxVal);
}
if (!ci->binds.empty())
{
for (size_t i = 0; i < ci->binds.length(); ++i)
{
print_srvconsole(" Bound %-26.25s %s\n", g_plugins.findPlugin(ci->binds[i]->pluginId)->getName(), "-");
}
}
if (!ci->hooks.empty())
{
for (size_t i = 0; i < ci->hooks.length(); ++i)
{
CvarHook* hook = ci->hooks[i];
print_srvconsole(" Hooked %-26.25s %s (%s)\n", g_plugins.findPlugin(hook->pluginId)->getName(),
hook->forward->callback.chars(),
hook->forward->state == AutoForward::FSTATE_OK ? "active" : "inactive");
}
}
break;
}
}
}
}
void CvarManager::OnPluginUnloaded()
{
// Clear only plugin hooks list.
for (CvarsList::iterator cvar = m_Cvars.begin(); cvar != m_Cvars.end(); cvar++)
{
for (size_t i = 0; i < (*cvar)->binds.length(); ++i)
{
delete (*cvar)->binds[i];
}
for (size_t i = 0; i < (*cvar)->hooks.length(); ++i)
{
delete (*cvar)->hooks[i];
}
if ((*cvar)->amxmodx) // Mark registered cvars so we can refresh default datas at next map.
{
(*cvar)->pluginId = -1;
}
(*cvar)->binds.clear();
(*cvar)->hooks.clear();
}
// There is no point to enable hook if at next map change
// no plugins hook cvars.
DisableHook();
}
void CvarManager::OnAmxxShutdown()
{
// Free everything.
CvarsList::iterator iter = m_Cvars.begin();
while (iter != m_Cvars.end())
{
CvarInfo* cvar = (*iter);
for (size_t i = 0; i < cvar->binds.length(); ++i)
{
delete cvar->binds[i];
}
for (size_t i = 0; i < cvar->hooks.length(); ++i)
{
delete cvar->hooks[i];
}
iter = m_Cvars.erase(iter);
delete cvar;
}
m_Cache.clear();
DestroyHook();
}

177
amxmodx/CvarManager.h Normal file
View File

@ -0,0 +1,177 @@
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#ifndef CVARS_H
#define CVARS_H
#include "amxmodx.h"
#include <amtl/am-vector.h>
#include <amtl/am-inlinelist.h>
#include <sm_namehashset.h>
#include "CGameConfigs.h"
class CDetour;
enum CvarBounds
{
CvarBound_Upper = 0,
CvarBound_Lower
};
struct AutoForward
{
enum fwdstate
{
FSTATE_INVALID = 0,
FSTATE_OK,
FSTATE_STOP,
};
AutoForward(int id_, const char* handler) : id(id_), state(FSTATE_OK), callback(handler) {};
AutoForward() : id(-1) , state(FSTATE_INVALID) {};
~AutoForward()
{
unregisterSPForward(id);
}
int id;
fwdstate state;
ke::AString callback;
};
struct CvarHook
{
CvarHook(int id, AutoForward* fwd) : pluginId(id), forward(fwd) {};
CvarHook(int id) : pluginId(id), forward(new AutoForward()) {};
int pluginId;
ke::AutoPtr<AutoForward> forward;
};
struct CvarBind
{
enum CvarType
{
CvarType_Int,
CvarType_Float,
CvarType_String,
};
CvarBind(int id_, CvarType type_, cell* varAddress_, size_t varLength_)
:
pluginId(id_),
type(type_),
varAddress(varAddress_),
varLength(varLength_) {};
int pluginId;
CvarType type;
cell* varAddress;
size_t varLength;
};
struct CvarBound
{
CvarBound()
:
hasMin(false), minVal(0),
hasMax(false), maxVal(0),
minPluginId(-1),
maxPluginId(-1) {};
bool hasMin;
float minVal;
bool hasMax;
float maxVal;
int minPluginId;
int maxPluginId;
};
typedef ke::Vector<CvarHook*> CvarsHook;
typedef ke::Vector<CvarBind*> CvarsBind;
struct CvarInfo : public ke::InlineListNode<CvarInfo>
{
CvarInfo(const char* name_, const char* helpText, const char* plugin_, int pluginId_)
:
name(name_), description(helpText),
plugin(plugin_), pluginId(pluginId_), bound() {};
CvarInfo(const char* name_)
:
name(name_), defaultval(""), description(""),
plugin(""), pluginId(-1), bound(), amxmodx(false) {};
cvar_t* var;
ke::AString name;
ke::AString defaultval;
ke::AString description;
ke::AString plugin;
int pluginId;
CvarBound bound;
CvarsBind binds;
CvarsHook hooks;
bool amxmodx;
static inline bool matches(const char *name, const CvarInfo* info)
{
return strcmp(name, info->var->name) == 0;
}
};
typedef NameHashSet<CvarInfo*> CvarsCache;
typedef ke::InlineList<CvarInfo> CvarsList;
class CvarManager
{
public:
CvarManager();
~CvarManager();
public:
void CreateCvarHook();
void EnableHook();
void DisableHook();
void DestroyHook();
CvarInfo* CreateCvar(const char* name, const char* value, const char* plugin, int pluginId, int flags = 0, const char* helpText = "");
CvarInfo* FindCvar(const char* name);
CvarInfo* FindCvar(size_t index);
bool CacheLookup(const char* name, CvarInfo** info);
AutoForward* HookCvarChange(cvar_t* var, AMX* amx, cell param, const char** callback);
bool BindCvar(CvarInfo* info, CvarBind::CvarType type, AMX* amx, cell varofs, size_t varlen = 0);
void SetCvarMin(CvarInfo* info, bool set, float value, int pluginId);
void SetCvarMax(CvarInfo* info, bool set, float value, int pluginId);
size_t GetRegCvarsCount();
CvarsList* GetCvarsList();
void OnConsoleCommand();
void OnPluginUnloaded();
void OnAmxxShutdown();
private:
CvarsCache m_Cache;
CvarsList m_Cvars;
size_t m_AmxmodxCvars;
CDetour* m_HookDetour;
bool m_ReHookEnabled;
};
extern CvarManager g_CvarManager;
#endif // CVARS_H

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,118 +0,0 @@
#(C)2004-2005 AMX Mod X Development Team
# Makefile written by David "BAILOPAN" Anderson
HLSDK = ../../hlsdk
MM_ROOT = ../metamod/metamod
### EDIT BELOW FOR OTHER PROJECTS ###
OPT_FLAGS = -O2 -fno-strict-aliasing -funroll-loops -s -fomit-frame-pointer -pipe
DEBUG_FLAGS = -g -ggdb3
CPP = gcc-4.1
NAME = amxmodx
BIN_SUFFIX_32 = mm_i386.so
BIN_SUFFIX_64 = mm_amd64.so
OBJECTS = meta_api.cpp CFile.cpp CVault.cpp vault.cpp float.cpp file.cpp modules.cpp \
CMisc.cpp CTask.cpp string.cpp amxmodx.cpp CEvent.cpp CCmd.cpp CLogEvent.cpp \
srvcmd.cpp strptime.cpp amxcore.cpp amxtime.cpp power.cpp amxxlog.cpp fakemeta.cpp \
amxxfile.cpp CLang.cpp md5.cpp emsg.cpp CForward.cpp CPlugin.cpp CModule.cpp \
CMenu.cpp util.cpp amx.cpp amxdbg.cpp natives.cpp newmenus.cpp debugger.cpp \
optimizer.cpp format.cpp messages.cpp libraries.cpp vector.cpp sorting.cpp \
amxmod_compat.cpp
LINK = -lgcc -static-libgcc
INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared -I$(HLSDK)/game_shared \
-I$(MM_ROOT) -Lzlib -I$(HLSDK)/common
GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1)
ifeq "$(GCC_VERSION)" "4"
OPT_FLAGS += -fvisibility=hidden -fvisibility-inlines-hidden
endif
ifeq "$(DEBUG)" "true"
BIN_DIR = Debug
CFLAGS = $(DEBUG_FLAGS)
else
BIN_DIR = Release
CFLAGS = $(OPT_FLAGS)
endif
ifeq "$(BINLOG)" "true"
NAME := $(NAME)_bl
BIN_DIR := $(BIN_DIR)BinLog
OBJECTS += binlog.cpp
CFLAGS += -DBINLOG_ENABLED
endif
CFLAGS += -DLINUX -DNDEBUG -DAMX_NOPROPLIST -fPIC -Wall -Werror -DHAVE_STDINT_H -static-libgcc -fno-rtti -fno-exceptions
ifeq "$(AMD64)" "true"
BINARY = $(NAME)_$(BIN_SUFFIX_64)
CFLAGS += -DPAWN_CELL_SIZE=64 -DHAVE_I64 -DAMD64 -m64
LINK += -lz64
OBJECTS += JIT/natives-amd64.o
else
BINARY = $(NAME)_$(BIN_SUFFIX_32)
OBJECTS += JIT/amxexecn.o JIT/amxjitsn.o JIT/natives-x86.o
OBJECTS += JIT/helpers-x86.o
CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32
LINK += -lz
OPT_FLAGS += -march=i586
endif
OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o)
$(BIN_DIR)/%.o: %.cpp
$(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $<
all:
mkdir -p $(BIN_DIR)
$(MAKE) amxmodx
amd64:
rm -f zlib/libz.a
$(MAKE) all AMD64=true
amd64_debug:
rm -f zlib/libz.a
$(MAKE) all AMD64=true DEBUG=true
amd64_binlog:
rm -f zlib/libz.a
$(MAKE) all AMD64=true BINLOG=true
amd64_binlog_debug:
rm -f zlib/libz.a
$(MAKE) all AMD64=true BINLOG=true DEBUG=true
binlog:
$(MAKE) all BINLOG=true
binlog_debug:
$(MAKE) all BINLOG=true DEBUG=true
amxmodx: $(OBJ_LINUX)
$(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY)
debug:
$(MAKE) all DEBUG=true
default: all
clean:
rm -rf Release/*.o
rm -rf Release/$(NAME)_$(BIN_SUFFIX_32)
rm -rf Release/$(NAME)_$(BIN_SUFFIX_64)
rm -rf ReleaseBinLog/*.o
rm -rf ReleaseBinLog/$(NAME)_bl_$(BIN_SUFFIX_32)
rm -rf ReleaseBinLog/$(NAME)_bl_$(BIN_SUFFIX_64)
rm -rf Debug/*.o
rm -rf Debug/$(NAME)_$(BIN_SUFFIX_32)
rm -rf Debug/$(NAME)_$(BIN_SUFFIX_64)
rm -rf DebugBinLog/*.o
rm -rf DebugBinLog/$(NAME)_bl_$(BIN_SUFFIX_32)
rm -rf DebugBinLog/$(NAME)_bl_$(BIN_SUFFIX_64)

View File

@ -17,8 +17,6 @@
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
*
* Version: $Id$
*/
#define AMX_NODYNALOAD
@ -48,7 +46,7 @@
#include <stdlib.h>
#include <math.h>
#include "osdefs.h"
#if defined LINUX || defined __FreeBSD__ || defined __OpenBSD__
#if defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__
#include <sclinux.h>
#include <unistd.h>
#include <errno.h>
@ -68,6 +66,9 @@
#include <windows.h>
#endif
#include <chrono>
#include <amxmodx.h>
#include <CPlugin.h>
/* When one or more of the AMX_funcname macris are defined, we want
* to compile only those functions. However, when none of these macros
@ -436,7 +437,7 @@ int AMXAPI amx_Callback(AMX *amx, cell index, cell *result, cell *params)
hdr=(AMX_HEADER *)amx->base;
assert(hdr->natives<=hdr->libraries);
#if defined AMX_NATIVETABLE
if (index<NULL) {
if (index<0) {
assert(-(index+1)<(sizeof(AMX_NATIVETABLE)/sizeof(AMX_NATIVETABLE)[0]));
f=(AMX_NATIVETABLE)[-(index+1)];
} else {
@ -803,7 +804,7 @@ static void expand(unsigned char *code, long codesize, long memsize)
do {
codesize--;
/* no input byte should be shifted out completely */
assert(shift<8*sizeof(cell));
assert(shift<static_cast<int>(8*sizeof(cell)));
/* we work from the end of a sequence backwards; the final code in
* a sequence may not have the continuation bit set */
assert(shift>0 || (code[(size_t)codesize] & 0x80)==0);
@ -932,11 +933,11 @@ int AMXAPI amx_Init(AMX *amx, void *program)
#define ALIGN(addr) (addr)
#elif defined LINUX || defined __FreeBSD__ || defined __OpenBSD__
#elif defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__
/* Linux already has mprotect() */
/* But wants the address aligned! */
#define ALIGN(addr) (char *)(((long)addr + sysconf(_SC_PAGESIZE)-1) & ~(sysconf(_SC_PAGESIZE)-1))
#define ALIGN(addr) ((void *)((intptr_t)addr & ~(sysconf(_SC_PAGESIZE)-1)))
#else
@ -973,27 +974,25 @@ int AMXAPI amx_InitJIT(AMX *amx, void *reloc_table, void *native_code)
memcpy(native_code, amx->base, ((AMX_HEADER *)(amx->base))->cod);
hdr = (AMX_HEADER *)native_code;
/* JIT rulz! (TM) */
/* MP: added check for correct compilation */
//Fixed bug (thanks T(+)rget)
if ((res = asm_runJIT(amx->base, reloc_table, native_code)) == 0)
{
/* update the required memory size (the previous value was a
* conservative estimate, now we know the exact size)
*/
amx->code_size = (hdr->dat + hdr->stp + 3) & ~3;
/* The compiled code is relocatable, since only relative jumps are
* used for destinations within the generated code and absoulute
* addresses for jumps into the runtime, which is fixed in memory.
*/
amx->base = (unsigned char*) native_code;
amx->cip = hdr->cip;
amx->hea = hdr->hea;
amx->stp = hdr->stp - sizeof(cell);
amx->hlw = hdr->hea;
/* also put a sentinel for strings at the top the stack */
*(cell *)((char*)native_code + hdr->dat + hdr->stp - sizeof(cell)) = 0;
amx->stk = amx->stp;
/* also put a sentinel for strings at the top the stack */
*(cell *)((char*)native_code + hdr->dat + amx->stp - sizeof(cell)) = 0;
/* update the required memory size (the previous value was a
* conservative estimate, now we know the exact size)
*/
amx->code_size = (hdr->dat + amx->stp + sizeof(cell)) & ~3;
} /* if */
return (res == 0) ? AMX_ERR_NONE : AMX_ERR_INIT_JIT;
@ -1016,10 +1015,10 @@ int AMXAPI amx_InitJIT(AMX *amx,void *compiled_program,void *reloc_table)
#if defined AMX_CLEANUP
int AMXAPI amx_Cleanup(AMX *amx)
{
#if (defined _Windows || defined LINUX || defined __FreeBSD__ || defined __OpenBSD__) && !defined AMX_NODYNALOAD
#if (defined _Windows || defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__) && !defined AMX_NODYNALOAD
#if defined _Windows
typedef int (FAR WINAPI *AMX_ENTRY)(AMX FAR *amx);
#elif defined LINUX || defined __FreeBSD__ || defined __OpenBSD__
#elif defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__
typedef int (*AMX_ENTRY)(AMX *amx);
#endif
AMX_HEADER *hdr;
@ -1029,7 +1028,7 @@ int AMXAPI amx_Cleanup(AMX *amx)
#endif
/* unload all extension modules */
#if (defined _Windows || defined LINUX || defined __FreeBSD__ || defined __OpenBSD__) && !defined AMX_NODYNALOAD
#if (defined _Windows || defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__) && !defined AMX_NODYNALOAD
hdr=(AMX_HEADER *)amx->base;
assert(hdr->magic==AMX_MAGIC);
numlibraries=NUMENTRIES(hdr,libraries,pubvars);
@ -1042,14 +1041,14 @@ int AMXAPI amx_Cleanup(AMX *amx)
strcat(funcname,"Cleanup");
#if defined _Windows
libcleanup=(AMX_ENTRY)GetProcAddress((HINSTANCE)lib->address,funcname);
#elif defined LINUX || defined __FreeBSD__ || defined __OpenBSD__
#elif defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__
libcleanup=(AMX_ENTRY)dlsym((void*)lib->address,funcname);
#endif
if (libcleanup!=NULL)
libcleanup(amx);
#if defined _Windows
FreeLibrary((HINSTANCE)lib->address);
#elif defined LINUX || defined __FreeBSD__ || defined __OpenBSD__
#elif defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__
dlclose((void*)lib->address);
#endif
} /* if */
@ -1177,12 +1176,12 @@ int AMXAPI amx_GetNative(AMX *amx, int index, char *funcname)
int AMXAPI amx_FindNative(AMX *amx, const char *name, int *index)
{
int first,last,mid;
int last,mid;
char pname[sNAMEMAX+1];
amx_NumNatives(amx, &last);
last--; /* last valid index is 1 less than the number of functions */
first=0;
/* normal search */
for (mid=0; mid<=last; mid++)
{
@ -1642,7 +1641,7 @@ int AMXAPI amx_PushString(AMX *amx, cell *amx_addr, cell **phys_addr, const char
* fast "indirect threaded" interpreter.
*/
#define NEXT(cip) goto **cip++
#define NEXT(cip) goto *(const void *)*cip++
int AMXAPI amx_Exec(AMX *amx, cell *retval, int index)
{
@ -1826,14 +1825,14 @@ static const void * const amx_opcodelist[] = {
NEXT(cip);
op_load_i:
/* verify address */
if (pri>=hea && pri<stk || (ucell)pri>=(ucell)amx->stp)
if ((pri>=hea && pri<stk) || (ucell)pri>=(ucell)amx->stp)
ABORT(amx,AMX_ERR_MEMACCESS);
pri= * (cell *)(data+(int)pri);
NEXT(cip);
op_lodb_i:
GETPARAM(offs);
/* verify address */
if (pri>=hea && pri<stk || (ucell)pri>=(ucell)amx->stp)
if ((pri>=hea && pri<stk) || (ucell)pri>=(ucell)amx->stp)
ABORT(amx,AMX_ERR_MEMACCESS);
switch (offs) {
case 1:
@ -1899,14 +1898,14 @@ static const void * const amx_opcodelist[] = {
NEXT(cip);
op_stor_i:
/* verify address */
if (alt>=hea && alt<stk || (ucell)alt>=(ucell)amx->stp)
if ((alt>=hea && alt<stk) || (ucell)alt>=(ucell)amx->stp)
ABORT(amx,AMX_ERR_MEMACCESS);
*(cell *)(data+(int)alt)=pri;
NEXT(cip);
op_strb_i:
GETPARAM(offs);
/* verify address */
if (alt>=hea && alt<stk || (ucell)alt>=(ucell)amx->stp)
if ((alt>=hea && alt<stk) || (ucell)alt>=(ucell)amx->stp)
ABORT(amx,AMX_ERR_MEMACCESS);
switch (offs) {
case 1:
@ -1923,7 +1922,7 @@ static const void * const amx_opcodelist[] = {
op_lidx:
offs=pri*sizeof(cell)+alt;
/* verify address */
if (offs>=hea && offs<stk || (ucell)offs>=(ucell)amx->stp)
if ((offs>=hea && offs<stk) || (ucell)offs>=(ucell)amx->stp)
ABORT(amx,AMX_ERR_MEMACCESS);
pri= * (cell *)(data+(int)offs);
NEXT(cip);
@ -1931,7 +1930,7 @@ static const void * const amx_opcodelist[] = {
GETPARAM(offs);
offs=(pri << (int)offs)+alt;
/* verify address */
if (offs>=hea && offs<stk || (ucell)offs>=(ucell)amx->stp)
if ((offs>=hea && offs<stk) || (ucell)offs>=(ucell)amx->stp)
ABORT(amx,AMX_ERR_MEMACCESS);
pri= * (cell *)(data+(int)offs);
NEXT(cip);
@ -2368,13 +2367,13 @@ static const void * const amx_opcodelist[] = {
/* verify top & bottom memory addresses, for both source and destination
* addresses
*/
if (pri>=hea && pri<stk || (ucell)pri>=(ucell)amx->stp)
if ((pri>=hea && pri<stk) || (ucell)pri>=(ucell)amx->stp)
ABORT(amx,AMX_ERR_MEMACCESS);
if ((pri+offs)>hea && (pri+offs)<stk || (ucell)(pri+offs)>(ucell)amx->stp)
if (((pri+offs)>hea && (pri+offs)<stk) || (ucell)(pri+offs)>(ucell)amx->stp)
ABORT(amx,AMX_ERR_MEMACCESS);
if (alt>=hea && alt<stk || (ucell)alt>=(ucell)amx->stp)
if ((alt>=hea && alt<stk) || (ucell)alt>=(ucell)amx->stp)
ABORT(amx,AMX_ERR_MEMACCESS);
if ((alt+offs)>hea && (alt+offs)<stk || (ucell)(alt+offs)>(ucell)amx->stp)
if (((alt+offs)>hea && (alt+offs)<stk) || (ucell)(alt+offs)>(ucell)amx->stp)
ABORT(amx,AMX_ERR_MEMACCESS);
memcpy(data+(int)alt, data+(int)pri, (int)offs);
NEXT(cip);
@ -2383,22 +2382,22 @@ static const void * const amx_opcodelist[] = {
/* verify top & bottom memory addresses, for both source and destination
* addresses
*/
if (pri>=hea && pri<stk || (ucell)pri>=(ucell)amx->stp)
if ((pri>=hea && pri<stk) || (ucell)pri>=(ucell)amx->stp)
ABORT(amx,AMX_ERR_MEMACCESS);
if ((pri+offs)>hea && (pri+offs)<stk || (ucell)(pri+offs)>(ucell)amx->stp)
if (((pri+offs)>hea && (pri+offs)<stk) || (ucell)(pri+offs)>(ucell)amx->stp)
ABORT(amx,AMX_ERR_MEMACCESS);
if (alt>=hea && alt<stk || (ucell)alt>=(ucell)amx->stp)
if ((alt>=hea && alt<stk) || (ucell)alt>=(ucell)amx->stp)
ABORT(amx,AMX_ERR_MEMACCESS);
if ((alt+offs)>hea && (alt+offs)<stk || (ucell)(alt+offs)>(ucell)amx->stp)
if (((alt+offs)>hea && (alt+offs)<stk) || (ucell)(alt+offs)>(ucell)amx->stp)
ABORT(amx,AMX_ERR_MEMACCESS);
pri=memcmp(data+(int)alt, data+(int)pri, (int)offs);
NEXT(cip);
op_fill:
GETPARAM(offs);
/* verify top & bottom memory addresses */
if (alt>=hea && alt<stk || (ucell)alt>=(ucell)amx->stp)
if ((alt>=hea && alt<stk) || (ucell)alt>=(ucell)amx->stp)
ABORT(amx,AMX_ERR_MEMACCESS);
if ((alt+offs)>hea && (alt+offs)<stk || (ucell)(alt+offs)>(ucell)amx->stp)
if (((alt+offs)>hea && (alt+offs)<stk) || (ucell)(alt+offs)>(ucell)amx->stp)
ABORT(amx,AMX_ERR_MEMACCESS);
for (i=(int)alt; offs>=(int)sizeof(cell); i+=sizeof(cell), offs-=sizeof(cell))
*(cell *)(data+i) = pri;
@ -3697,7 +3696,7 @@ int AMXAPI amx_GetAddr(AMX *amx,cell amx_addr,cell **phys_addr)
data=(amx->data!=NULL) ? amx->data : amx->base+(int)hdr->dat;
assert(phys_addr!=NULL);
if (amx_addr>=amx->hea && amx_addr<amx->stk || amx_addr<0 || amx_addr>=amx->stp) {
if ((amx_addr>=amx->hea && amx_addr<amx->stk) || amx_addr<0 || amx_addr>=amx->stp) {
*phys_addr=NULL;
return AMX_ERR_MEMACCESS;
} /* if */
@ -4096,10 +4095,6 @@ int AMXAPI amx_GetLibraries(AMX *amx)
return numLibraries;
}
#ifdef __linux__
#define _snprintf snprintf
#endif
const char *AMXAPI amx_GetLibrary(AMX *amx, int index, char *buffer, int len)
{
AMX_HEADER *hdr = (AMX_HEADER *)amx->base;
@ -4143,7 +4138,7 @@ int AMXAPI amx_SetStringOld(cell *dest,const char *source,int pack,int use_wchar
dest[i]=(cell)(((wchar_t*)source)[i]);
} else {
for (i=0; i<len; i++)
dest[i]=(cell)source[i];
dest[i]=(unsigned char)source[i];
} /* if */
dest[len]=0;
} /* if */
@ -4181,3 +4176,37 @@ int AMXAPI amx_GetStringOld(char *dest,const cell *source,int use_wchar)
dest[len]='\0'; /* store terminator */
return AMX_ERR_NONE;
}
int AMXAPI amx_ExecPerf(AMX* amx, cell* retval, int index)
{
CPluginMngr::CPlugin* perf_Plug = g_plugins.findPluginFast(amx);
if (amxmodx_perflog->value > 0.0f && perf_Plug && (perf_Plug->isDebug() || (int)amxmodx_debug->value == 2))
{
char perf_funcname[sNAMEMAX + 1];
perf_funcname[0] = '\0';
amx_GetPublic(perf_Plug->getAMX(), index, perf_funcname);
if (perf_funcname[0] == '\0')
sprintf(perf_funcname, "Unknown_ID%d", index);
const char* perf_plugname = perf_Plug->getName();
if (!perf_plugname || perf_plugname[0] == '\0')
perf_plugname = "Unknown_plugin";
using std::chrono::steady_clock;
using std::chrono::duration_cast;
using std::chrono::duration;
using std::chrono::microseconds;
auto t1 = steady_clock::now();
int err = amx_Exec(amx, retval, index);
auto ms_int = duration_cast<microseconds>(steady_clock::now() - t1);
auto ms_float = (float)(ms_int.count() / 1000.0f);
if (ms_float >= amxmodx_perflog->value)
{
AMXXLOG_Log("[%s] performance issue. Function %s executed more than %.*fms.", perf_plugname, perf_funcname, 1, ms_float);
}
return err;
}
return amx_Exec(amx, retval, index);
}

View File

@ -17,14 +17,12 @@
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
*
* Version: $Id$
*/
#if defined FREEBSD && !defined __FreeBSD__
#define __FreeBSD__
#endif
#if defined LINUX || defined __FreeBSD__ || defined __OpenBSD__
#if defined LINUX || defined __FreeBSD__ || defined __OpenBSD__ || defined __APPLE__
#include <sclinux.h>
#endif
@ -34,7 +32,7 @@
#if defined HAVE_STDINT_H
#include <stdint.h>
#else
#if defined __LCC__ || defined __DMC__ || defined LINUX
#if defined __LCC__ || defined __DMC__ || defined LINUX || defined __APPLE__
#if defined HAVE_INTTYPES_H
#include <inttypes.h>
#else
@ -190,7 +188,7 @@ typedef int (AMXAPI *AMX_NATIVE_FILTER)(struct tagAMX *amx, int index);
#endif
#if !defined AMX_NO_ALIGN
#if defined LINUX || defined __FreeBSD__
#if defined LINUX || defined __FreeBSD__ || defined __APPLE__
#pragma pack(1) /* structures must be packed (byte-aligned) */
#elif defined MACOS && defined __MWERKS__
#pragma options align=mac68k
@ -210,7 +208,7 @@ typedef struct tagAMX_NATIVE_INFO {
#define AMX_USERNUM 4
#define sEXPMAX 19 /* maximum name length for file version <= 6 */
#define sNAMEMAX 31 /* maximum name length of symbol name */
#define sNAMEMAX 63 /* maximum name length of symbol name */
typedef struct tagAMX_FUNCSTUB {
ucell address PACKED;
@ -322,7 +320,7 @@ enum {
#define AMX_FLAG_COMPACT 0x04 /* compact encoding */
#define AMX_FLAG_BYTEOPC 0x08 /* opcode is a byte (not a cell) */
#define AMX_FLAG_NOCHECKS 0x10 /* no array bounds checking; no STMT opcode */
#define AMX_FLAG_OLDFILE 0x20 /* Old AMX Mod plugin */
/* AMX_FLAG_OLDFILE 0x20 Old AMX Mod plugin */
#define AMX_FLAG_PRENIT 0x100 /* pre-initialized, do not check natives */
#define AMX_FLAG_NTVREG 0x1000 /* all native functions are registered */
#define AMX_FLAG_JITC 0x2000 /* abstract machine is JIT compiled */
@ -384,6 +382,7 @@ int AMXAPI amx_Callback(AMX *amx, cell index, cell *result, cell *params);
int AMXAPI amx_CheckNatives(AMX *amx, AMX_NATIVE_FILTER nf);
int AMXAPI amx_Cleanup(AMX *amx);
int AMXAPI amx_Clone(AMX *amxClone, AMX *amxSource, void *data);
int AMXAPI amx_ExecPerf(AMX* amx, cell* retval, int index);
int AMXAPI amx_Exec(AMX *amx, cell *retval, int index);
int AMXAPI amx_FindNative(AMX *amx, const char *name, int *index);
int AMXAPI amx_FindPublic(AMX *amx, const char *funcname, int *index);
@ -442,7 +441,7 @@ int AMXAPI amx_GetStringOld(char *dest,const cell *source,int use_wchar);
amx_Register((amx), amx_NativeInfo((name),(func)), 1);
#if !defined AMX_NO_ALIGN
#if defined LINUX || defined __FreeBSD__
#if defined LINUX || defined __FreeBSD__ || defined __APPLE__
#pragma pack() /* reset default packing */
#elif defined MACOS && defined __MWERKS__
#pragma options align=reset

View File

@ -17,9 +17,8 @@
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
*
* Version: $Id$
*/
#if defined _UNICODE || defined __UNICODE__ || defined UNICODE
# if !defined UNICODE /* for Windows */
# define UNICODE
@ -180,7 +179,7 @@ static cell AMX_NATIVE_CALL setarg(AMX *amx, cell *params)
/* adjust the address in "value" in case of an array access */
value+=params[2]*sizeof(cell);
/* verify the address */
if (value<0 || value>=amx->hea && value<amx->stk)
if (value<0 || (value>=amx->hea && value<amx->stk))
return 0;
/* set the value indirectly */
* (cell *)(data+(int)value) = params[3];

View File

@ -19,9 +19,8 @@
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
*
* Version: $Id$
*/
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
@ -462,8 +461,8 @@ int AMXAPI dbg_GetVariable(AMX_DBG *amxdbg, const char *symname, ucell scopeaddr
break;
/* check the range, keep a pointer to the symbol with the smallest range */
if (strcmp(amxdbg->symboltbl[index]->name, symname) == 0
&& (codestart == 0 && codeend == 0
|| amxdbg->symboltbl[index]->codestart >= codestart && amxdbg->symboltbl[index]->codeend <= codeend))
&& ((codestart == 0 && codeend == 0)
|| (amxdbg->symboltbl[index]->codestart >= codestart && amxdbg->symboltbl[index]->codeend <= codeend)))
{
*sym = amxdbg->symboltbl[index];
codestart = amxdbg->symboltbl[index]->codestart;

View File

@ -20,8 +20,6 @@
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
*
* Version: $Id$
*/
#ifndef AMXDBG_H_INCLUDED
@ -49,7 +47,7 @@ extern "C" {
#endif
#if !defined AMX_NO_ALIGN
#if defined LINUX || defined __FreeBSD__
#if defined LINUX || defined __FreeBSD__ || defined __APPLE__
#pragma pack(1) /* structures must be packed (byte-aligned) */
#elif defined MACOS && defined __MWERKS__
#pragma options align=mac68k
@ -156,7 +154,7 @@ int AMXAPI dbg_GetArrayDim(AMX_DBG *amxdbg, const AMX_DBG_SYMBOL *sym, const AMX
#if !defined AMX_NO_ALIGN
#if defined LINUX || defined __FreeBSD__
#if defined LINUX || defined __FreeBSD__ || defined __APPLE__
#pragma pack() /* reset default packing */
#elif defined MACOS && defined __MWERKS__
#pragma options align=reset

View File

@ -56,6 +56,9 @@
;
;History (list of changes)
;-------------------------
; 24 february 2013 by Scott Ehlert
; Aligned stack to 16-byte boundary for native calls in case they make library
; calls on Mac OS X or use SSE instructions.
; 10 february 2006 by David Anderson
; Addition of float opcodes
; 17 february 2005 by Thiadmer Riemersms
@ -189,6 +192,21 @@
%endif
%endmacro
%macro _STK_ALIGN 1 ; align stack to 16-byte boundary and
; allocate %1 bytes of stack space
%if %1 % 16 != 0
%error "expected 16-byte aligned value"
%endif
push edi
mov edi, esp
and esp, 0xFFFFFFF0
sub esp, %1
%endmacro
%macro _STK_RESTORE 0 ; restore stack pointer after 16-byte alignment
mov esp, edi
pop edi
%endmacro
Start_CODE
@ -1265,13 +1283,15 @@ OP_SYSREQ_PRI:
push ebp
push esi
push edi
_STK_ALIGN 16 ; align stack to 16-byte boundary and
; allocate 16 bytes of stack space
; push the parameters
push ecx
push ebx
push edx
push eax
mov [esp+12], ecx
mov [esp+08], ebx
mov [esp+04], edx
mov [esp], eax
call [ebp+_callback]
_DROPARGS 10h ; remove arguments from stack
_STK_RESTORE ; restore stack pointer
pop edi ; restore saved registers
pop esi
pop ebp
@ -1308,11 +1328,13 @@ OP_SYSREQ_D: ; (TR)
push ebp
push esi
push edi
_STK_ALIGN 16 ; align stack to 16-byte boundary and
; allocate 16 bytes of stack space
; push the parameters
push edx
push eax
mov [esp+04], edx
mov [esp], eax
call ebx ; direct call
_DROPARGS 8 ; remove arguments from stack
_STK_RESTORE ; restore stack pointer
pop edi ; restore saved registers
pop esi
pop ebp
@ -1458,7 +1480,7 @@ OP_FLOAT_ROUND:
push 0
mov ebp,esp
fstcw [ebp]
mov eax,[ebp]
mov eax,[ebp]
push eax
;clear the top bits
xor ah,ah
@ -1470,22 +1492,20 @@ OP_FLOAT_ROUND:
;set the bits
or ah,dl ;set bits 15,14 of FCW to rounding method
or ah,3 ;set precision to 64bit
mov [ebp], eax
fldcw [ebp]
;calculate
sub esp,4
fld dword [edi+ecx+4]
test edx,edx
jz .correct
jmp .skip_correct
.correct:
fadd st0
jnz .skip_correct
;nearest mode
;correct so as to AVOID bankers rounding
or ah, 4 ;set rounding mode to floor
fadd dword [g_round_nearest]
fistp dword [esp]
pop eax
sar eax,1
jmp .done
.skip_correct:
mov [ebp], eax
fldcw [ebp]
frndint
fistp dword [esp]
pop eax
@ -1533,9 +1553,11 @@ OP_BREAK:
; call the debug hook
mov eax,ebp ; 1st parm: amx
_SAVEREGS
push eax
_STK_ALIGN 16 ; align stack to 16-byte boundary and
; allocate 16 bytes of stack space
mov [esp], eax
call [ebp+_debug] ; call debug function
_DROPARGS 4 ; remove arguments from stack
_STK_RESTORE ; restore stack pointer
cmp eax,AMX_ERR_NONE
je short break_noabort; continue running
mov [ebp+_error],eax ; save EAX (error code) before restoring all regs

View File

@ -6,6 +6,14 @@
; (27 disks, no output, DOS4/GW under Win95) with this implementation of the
; JIT compiler.
; BUILD NOTE: Use nasm 0.97.x or 0.98.x with the options below.
; ----------------
; Windows : nasm -O2 -f win32 -o amxjitsn.obj amxjitsn.asm
; Linux : nasm -O2 -f elf -o amxjitsn.o amxjitsn.asm
; OS X : nasm -O2 -f macho -o amxjitsn-darwin.o amxjitsn.asm
; ----------------
; If nasm 2.x must be used, replace -O2 with -O0.
; NOTE 1:
; There is only one pass implemented in this version. This means there is no
; way of knowing the size of the compiled code before it has actually been com-
@ -90,6 +98,9 @@
; Revision History
; ----------------
; 24 february 2013 by Scott Ehlert
; Aligned stack to 16-byte boundary for native calls in case they make library
; calls on Mac OS X or use SSE instructions.
; 16 august 2005 by David "BAILOPAN" Anderson (DA)
; Changed JIT to not swap stack pointer during execution. This
; is playing with fire, especially with pthreads and signals on linux,
@ -303,13 +314,31 @@
%endif
%endmacro
%macro _STK_ALIGN 1 ; align stack to 16-byte boundary and
; allocate %1 bytes of stack space
; top of stack allocation will hold original esp
%if %1 % 16 != 0
%error "expected 16-byte aligned value"
%endif
%ifdef WIN32
section .data exec
%else
section .text
%endif
%push stkalign
%assign stkspace %1
mov ebp, esp
and esp, 0xFFFFFFF0
sub esp, %1
mov [esp+%1-4], ebp
%endmacro
%macro _STK_RESTORE 0 ; restore stack pointer after 16-byte alignment
%ifnctx stkalign
%fatal "expected _STK_ALIGN before _STK_RESTORE"
%endif
mov esp, [esp+stkspace-4]
%pop
%endmacro
global asm_runJIT, _asm_runJIT
global amx_exec_jit, _amx_exec_jit
@ -436,15 +465,6 @@ reloc_done:
pop ebp
ret
; GWMV:
; The code below modifies itself to store the arguments to the Pawn opcodes
; in the compiled code. This is fine, but the .text section in an ELF executable
; is usually marked read-only, that's why this code is in the .data section.
%ifndef WIN32
section .data exec
%endif
OP_LOAD_PRI:
;nop;
putval j_load_pri+2
@ -1052,7 +1072,7 @@ OP_CALL:
j_call:
;call 12345678h ; tasm chokes on this out of a sudden
_PUSH 0
j_call_e8
j_call_e8:
db 0e8h, 0, 0, 0, 0
CHECKCODESIZE j_call
@ -1959,22 +1979,20 @@ OP_FLOAT_ROUND:
;set the bits
or ah,dl ;set bits 15,14 of FCW to rounding method
or ah,3 ;set precision to 64bit
mov [ebp], eax
fldcw [ebp]
;calculate
sub esp,4
fld dword [esi+4]
test edx,edx
jz .correct
jmp .skip_correct
.correct:
fadd st0
jnz .skip_correct
;nearest mode
;correct so as to AVOID bankers rounding
or ah, 4 ;set rounding mode to floor
fadd dword [g_round_nearest]
fistp dword [esp]
pop eax
sar eax,1
jmp .done
.skip_correct:
mov [ebp], eax
fldcw [ebp]
frndint
fistp dword [esp]
pop eax
@ -2255,8 +2273,10 @@ err_divide:
jmp _return_popstack
JIT_OP_SYSREQ:
push ecx
push esi
_STK_ALIGN 32 ; align stack to 16-byte boundary and
; allocate 32 bytes of stack space
mov [esp+16], ecx
mov [esp+12], esi
mov ebp,amx ; get amx into EBP
sub esi,edi ; correct STK
@ -2271,14 +2291,15 @@ JIT_OP_SYSREQ:
lea ebx,pri ; 3rd param: addr. of retval
;Our original esi is still pushed!
push ebx
push eax ; 2nd param: function number
push ebp ; 1st param: amx
mov [esp+08], ebx
mov [esp+04], eax ; 2nd param: function number
mov [esp], ebp ; 1st param: amx
call [ebp+_callback]
_DROPARGS 12 ; remove args from stack
pop esi
pop ecx
mov esi, [esp+12] ; restore esi
mov ecx, [esp+16] ; restore ecx
_STK_RESTORE ; restore stack pointer
cmp eax,AMX_ERR_NONE
jne _return_popstack
.continue:
@ -2290,8 +2311,10 @@ JIT_OP_SYSREQ:
JIT_OP_SYSREQ_D: ; (TR)
push ecx
push esi
_STK_ALIGN 16 ; align stack to 16-byte boundary and
; allocate 16 bytes of stack space
mov [esp+08], ecx
mov [esp+04], esi
mov ebp,amx ; get amx into EBP
sub esi,edi ; correct STK
@ -2304,11 +2327,12 @@ JIT_OP_SYSREQ_D: ; (TR)
mov [ebp+_frm],eax ; eax & ecx are invalid by now
;esi is still pushed!
push ebp ; 1st param: amx
mov [esp], ebp ; 1st param: amx
call ebx ; direct call
_DROPARGS 8 ; remove args from stack
pop ecx
mov ecx, [esp+08] ; restore ecx
_STK_RESTORE ; restore stack pointer
mov ebp,amx ; get amx into EBP
cmp dword [ebp+_error],AMX_ERR_NONE
jne _return_popstack; return error code, if any
@ -2322,8 +2346,10 @@ JIT_OP_SYSREQ_D: ; (TR)
JIT_OP_BREAK:
%ifdef DEBUGSUPPORT
push ecx
push esi
_STK_ALIGN 16 ; align stack to 16-byte boundary and
; allocate 16 bytes of stack space
mov [esp+08], ecx
mov [esp+04], esi
mov ebp,amx ; get amx into EBP
sub esi,edi ; correct STK
@ -2337,12 +2363,13 @@ JIT_OP_BREAK:
mov [ebp+_frm],ebx ; EBX & ECX are invalid by now
;??? storing CIP is not very useful, because the code changed (during JIT compile)
push ebp ; 1st param: amx
mov [esp], ebp ; 1st param: amx
call [ebp+_debug]
_DROPARGS 4 ; remove args from stack
pop esi
pop ecx
mov esi, [esp+04] ; restore esi
mov ecx, [esp+08] ; restore ecx
_STK_RESTORE ; restore stack pointer
cmp eax,AMX_ERR_NONE
jne _return_popstack; return error code, if any
@ -2591,4 +2618,4 @@ _amx_opcodelist_jit:
DD OP_FLOAT_ROUND ; DA
DD OP_FLOAT_CMP ; DA
END
END:

View File

@ -1,117 +0,0 @@
#include "amxmodx.h"
#include "amxmod_compat.h"
#include "format.h"
bool GetTranslation(amxtrans_t trans, int &key, int &dest, int &lang)
{
key = (trans & BCOMPAT_TRANSLATE_KEYMASK);
dest = (trans >> BCOMPAT_TRANSLATE_DESTRSH) & BCOMPAT_TRANSLATE_DESTMASK;
lang = (trans >> BCOMPAT_TRANSLATE_LANGRSH) & BCOMPAT_TRANSLATE_LANGMASK;
if (dest == 0x3F)
{
dest = -1;
}
if (lang == 0x1F)
{
lang = -1;
}
return true;
}
bool translate_bcompat(AMX *amx, cell *source, const char **_key, const char **_def)
{
amxtrans_t trans = static_cast<amxtrans_t>(*source);
int key, _dest, lang;
if (!GetTranslation(trans, key, _dest, lang))
{
return false;
}
cell amx_addr, *phys_addr;
if (amx_Allot(amx, 3, &amx_addr, &phys_addr) != AMX_ERR_NONE)
{
return false;
}
if (_dest == -1)
{
*phys_addr = LANG_PLAYER;
} else if (_dest == 0) {
*phys_addr = LANG_SERVER;
} else if (lang >= 0 && lang < g_langMngr.GetLangsNum()) {
const char *name = g_langMngr.GetLangName(lang);
phys_addr[0] = static_cast<cell>(name[0]);
phys_addr[1] = static_cast<cell>(name[1]);
phys_addr[2] = static_cast<cell>('\0');
} else {
*phys_addr = LANG_SERVER;
}
//not optimized but it works, eh
//if someone cares they can make a translate() wrapper that takes the key # in directly
const char *r_key = g_langMngr.GetKey(key);
const char *def = translate(amx, amx_addr, r_key);
if (!def)
{
def = r_key;
}
amx_Release(amx, amx_addr);
*_key = g_langMngr.GetKey(key);
*_def = def;
return true;
}
static cell AMX_NATIVE_CALL amx_translate(AMX *amx, cell *params)
{
int len;
char *key = get_amxstring(amx, params[1], 0, len);
amxtrans_t trans;
int suki = g_langMngr.GetKeyEntry(key);
//Some AMX Mod plugins do not register everything they need. Prevent a crash.
if (suki == -1)
{
suki = g_langMngr.AddKeyEntry(key);
}
if (suki > BCOMPAT_TRANSLATE_KEYMASK)
{
LogError(amx, AMX_ERR_NATIVE, "Not enough translation space, aborting!");
return 0;
}
trans = suki & BCOMPAT_TRANSLATE_KEYMASK;
int dest = static_cast<int>(params[2]);
int lang = static_cast<int>(params[3]);
if (dest == -1)
{
trans |= (0x3F << BCOMPAT_TRANSLATE_DESTRSH);
} else {
trans |= (dest & BCOMPAT_TRANSLATE_DESTMASK) << BCOMPAT_TRANSLATE_DESTRSH;
}
if (lang == -1)
{
trans |= (0x1F << BCOMPAT_TRANSLATE_LANGRSH);
} else {
trans |= (lang & BCOMPAT_TRANSLATE_LANGMASK) << BCOMPAT_TRANSLATE_LANGRSH;
}
trans |= BCOMPAT_TRANSLATE_BITS;
return static_cast<cell>(trans);
}
AMX_NATIVE_INFO g_BcompatNatives[] =
{
{"translate", amx_translate},
{NULL, NULL},
};

View File

@ -1,28 +0,0 @@
#ifndef _INCLUDE_AMXMOD_CORE_COMPAT_H
#define _INCLUDE_AMXMOD_CORE_COMPAT_H
/**
* New format for translation:
* Note that we only support:
* 4k keys
* 32 languages
* 0000 0000 0000 0000 0000 0000 0000 0000
* | key id |
* | | <- dest id
* | | <- lang id
*/
#define BCOMPAT_TRANSLATE_BITS 0xFF000000
#define BCOMPAT_TRANSLATE_KEYMASK 0xFFF
#define BCOMPAT_TRANSLATE_DESTMASK 0x3F
#define BCOMPAT_TRANSLATE_DESTRSH 12
#define BCOMPAT_TRANSLATE_LANGMASK 0x1F
#define BCOMPAT_TRANSLATE_LANGRSH 18
typedef unsigned int amxtrans_t;
bool GetTranslation(amxtrans_t trans, int &key, int &dest, int &lang);
extern AMX_NATIVE_INFO g_BcompatNatives[];
#endif //_INCLUDE_AMXMOD_CORE_COMPAT_H

File diff suppressed because it is too large Load Diff

View File

@ -1,38 +1,16 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#ifndef AMXMODX_H
#define AMXMODX_H
#ifdef __linux__
#if defined PLATFORM_POSIX
#include <unistd.h>
#include <stdlib.h>
#include "sclinux.h"
@ -51,13 +29,14 @@
#endif
#endif
#include "md5.h"
#include "CVector.h"
#include "CList.h"
#include "CQueue.h"
#include "hashing.h"
#include "modules.h"
#include "CString.h"
#include "CPlugin.h"
#include "CLibrarySys.h"
#include <auto-string.h>
#include <amtl/am-string.h>
#include <amtl/am-vector.h>
#include <amtl/am-inlinelist.h>
#include "CMisc.h"
#include "CVault.h"
#include "CModule.h"
@ -65,15 +44,18 @@
#include "CLogEvent.h"
#include "CForward.h"
#include "CCmd.h"
#include "CMenu.h"
#include "CEvent.h"
#include "CLang.h"
#include "fakemeta.h"
#include "amxxlog.h"
#include "CvarManager.h"
#include "CoreConfig.h"
#include "CFrameAction.h"
#include <amxmodx_version.h>
#include <HLTypeConversion.h>
#define AMXXLOG_Log g_log.Log
#define AMXXLOG_Error g_log.LogError
#define AMX_VERSION "1.76a"
extern AMX_NATIVE_INFO core_Natives[];
extern AMX_NATIVE_INFO time_Natives[];
@ -86,13 +68,18 @@ extern AMX_NATIVE_INFO vault_Natives[];
extern AMX_NATIVE_INFO msg_Natives[];
extern AMX_NATIVE_INFO vector_Natives[];
extern AMX_NATIVE_INFO g_SortNatives[];
extern AMX_NATIVE_INFO g_DataStructNatives[];
extern AMX_NATIVE_INFO g_StackNatives[];
extern AMX_NATIVE_INFO g_TextParserNatives[];
extern AMX_NATIVE_INFO g_CvarNatives[];
extern AMX_NATIVE_INFO g_GameConfigNatives[];
#ifndef __linux__
#if defined PLATFORM_WINDOWS
#define DLLOAD(path) (DLHANDLE)LoadLibrary(path)
#define DLPROC(m, func) GetProcAddress(m, func)
#define DLFREE(m) FreeLibrary(m)
#else
#define DLLOAD(path) (DLHANDLE)dlopen(path, RTLD_NOW)
#define DLLOAD(path) (DLHANDLE)dlopen(path, RTLD_NOW | RTLD_LOCAL | RTLD_DEEPBIND)
#define DLPROC(m, func) dlsym(m, func)
#define DLFREE(m) dlclose(m)
#endif
@ -108,7 +95,7 @@ extern AMX_NATIVE_INFO g_SortNatives[];
#endif
#endif
#ifndef __linux__
#if defined PLATFORM_WINDOWS
typedef HINSTANCE DLHANDLE;
#else
typedef void* DLHANDLE;
@ -126,19 +113,34 @@ extern AMX_NATIVE_INFO g_SortNatives[];
#define SETCLIENTLISTENING (*g_engfuncs.pfnVoice_SetClientListening)
#define SETCLIENTMAXSPEED (*g_engfuncs.pfnSetClientMaxspeed)
#define MAX_BUFFER_LENGTH 16384
char* UTIL_SplitHudMessage(register const char *src);
int UTIL_ReadFlags(const char* c);
void UTIL_ClientPrint(edict_t *pEntity, int msg_dest, char *msg);
void UTIL_FakeClientCommand(edict_t *pEdict, const char *cmd, const char *arg1 = NULL, const char *arg2 = NULL);
void UTIL_FakeClientCommand(edict_t *pEdict, const char *cmd, const char *arg1 = NULL, const char *arg2 = NULL, bool fwd = false);
void UTIL_GetFlags(char* flags, int flag);
void UTIL_HudMessage(edict_t *pEntity, const hudtextparms_t &textparms, char *pMessage);
void UTIL_HudMessage(edict_t *pEntity, const hudtextparms_t &textparms, const char *pMessage);
void UTIL_DHudMessage(edict_t *pEntity, const hudtextparms_t &textparms, const char *pMessage, unsigned int length);
void UTIL_IntToString(int value, char *output);
void UTIL_ShowMOTD(edict_t *client, char *motd, int mlen, const char *name);
void UTIL_ShowMenu(edict_t* pEntity, int slots, int time, char *menu, int mlen);
void UTIL_ClientSayText(edict_t *pEntity, int sender, char *msg);
void UTIL_TeamInfo(edict_t *pEntity, int playerIndex, const char *pszTeamName);
char *UTIL_VarArgs(const char *fmt, ...);
template <typename D> int UTIL_CheckValidChar(D *c);
template <typename D, typename S> unsigned int strncopy(D *dest, const S *src, size_t count);
unsigned int UTIL_GetUTF8CharBytes(const char *stream);
size_t UTIL_ReplaceAll(char *subject, size_t maxlength, const char *search, const char *replace, bool caseSensitive);
size_t UTIL_ReplaceAll(char *subject, size_t maxlength, const char *search, size_t searchLen, const char *replace, size_t replaceLen, bool caseSensitive);
char *UTIL_ReplaceEx(char *subject, size_t maxLen, const char *search, size_t searchLen, const char *replace, size_t replaceLen, bool caseSensitive);
void UTIL_TrimLeft(char *buffer);
void UTIL_TrimRight(char *buffer);
char* utf8stristr(const char *string1, const char *string2);
int utf8strncasecmp(const char *string1, const char *string2, size_t n);
int utf8strcasecmp(const char *string1, const char *string2);
#define GET_PLAYER_POINTER(e) (&g_players[ENTINDEX(e)])
//#define GET_PLAYER_POINTER(e) (&g_players[(((int)e-g_edict_point)/sizeof(edict_t))])
@ -146,7 +148,7 @@ char *UTIL_VarArgs(const char *fmt, ...);
struct WeaponsVault
{
String fullName;
ke::AString fullName;
short int iId;
short int ammoSlot;
};
@ -157,28 +159,28 @@ struct fakecmd_t
const char *argv[3];
int argc;
bool fake;
bool notify; // notify to plugins.
};
extern CLog g_log;
extern CPluginMngr g_plugins;
extern CTaskMngr g_tasksMngr;
extern CFrameActionMngr g_frameActionMngr;
extern CPlayer g_players[33];
extern CPlayer* mPlayer;
extern CmdMngr g_commands;
extern CList<CCVar> g_cvars;
extern CList<ForceObject> g_forcemodels;
extern CList<ForceObject> g_forcesounds;
extern CList<ForceObject> g_forcegeneric;
extern CList<CModule, const char *> g_modules;
extern CList<CScript, AMX*> g_loadedscripts;
extern CList<CPlayer*> g_auth;
extern ke::Vector<ke::AutoPtr<ForceObject>> g_forcemodels;
extern ke::Vector<ke::AutoPtr<ForceObject>> g_forcesounds;
extern ke::Vector<ke::AutoPtr<ForceObject>> g_forcegeneric;
extern ke::Vector<ke::AutoPtr<CPlayer *>> g_auth;
extern ke::InlineList<CModule> g_modules;
extern ke::InlineList<CScript> g_loadedscripts;
extern EventsMngr g_events;
extern Grenades g_grenades;
extern LogEventsMngr g_logevents;
extern MenuMngr g_menucmds;
extern CLangMngr g_langMngr;
extern String g_log_dir;
extern String g_mod_name;
extern ke::AString g_log_dir;
extern ke::AString g_mod_name;
extern TeamIds g_teamsIds;
extern Vault g_vault;
extern CForwardMngr g_forwards;
@ -186,9 +188,17 @@ extern WeaponsVault g_weaponsData[MAX_WEAPONS];
extern XVars g_xvars;
extern bool g_bmod_cstrike;
extern bool g_bmod_dod;
extern bool g_bmod_dmc;
extern bool g_bmod_ricochet;
extern bool g_bmod_valve;
extern bool g_bmod_gearbox;
extern bool g_official_mod;
extern bool g_dontprecache;
extern int g_srvindex;
extern cvar_t* amxmodx_version;
extern cvar_t* amxmodx_debug;
extern cvar_t* amxmodx_language;
extern cvar_t* amxmodx_perflog;
extern cvar_t* hostname;
extern cvar_t* mp_timelimit;
extern fakecmd_t g_fakecmd;
@ -229,6 +239,8 @@ extern int gmsgWeaponList;
extern int gmsgintermission;
extern int gmsgResetHUD;
extern int gmsgRoundTime;
extern int gmsgSayText;
extern int gmsgInitHUD;
void Client_AmmoPickup(void*);
void Client_AmmoX(void*);
@ -241,6 +253,7 @@ void Client_VGUIMenu(void*);
void Client_WeaponList(void*);
void Client_DamageEnd(void*);
void Client_DeathMsg(void*);
void Client_InitHUDEnd(void*);
void amx_command();
void plugin_srvcmd();
@ -252,10 +265,6 @@ int loadModules(const char* filename, PLUG_LOADTIME now);
void detachModules();
void detachReloadModules();
#ifdef FAKEMETA
void attachModules();
#endif
// Count modules
enum CountModulesMode
{
@ -270,29 +279,33 @@ void modules_callPluginsUnloaded();
void modules_callPluginsUnloading();
cell* get_amxaddr(AMX *amx, cell amx_addr);
char* build_pathname(char *fmt, ...);
char* build_pathname_r(char *buffer, size_t maxlen, char *fmt, ...);
char* build_pathname(const char *fmt, ...);
char* build_pathname_r(char *buffer, size_t maxlen, const char *fmt, ...);
char* format_amxstring(AMX *amx, cell *params, int parm, int& len);
AMX* get_amxscript(int, void**, const char**);
const char* get_amxscriptname(AMX* amx);
char* get_amxstring(AMX *amx, cell amx_addr, int id, int& len);
char* get_amxstring_null(AMX *amx, cell amx_addr, int id, int& len);
cell* get_amxvector_null(AMX *amx, cell amx_addr);
extern "C" size_t get_amxstring_r(AMX *amx, cell amx_addr, char *destination, int maxlen);
int amxstring_len(cell* cstr);
int load_amxscript(AMX* amx, void** program, const char* path, char error[64], int debug);
int load_amxscript_ex(AMX* amx, void** program, const char* path, char *error, size_t maxLength, int debug);
int set_amxnatives(AMX* amx, char error[64]);
int set_amxstring(AMX *amx, cell amx_addr, const char *source, int max);
int set_amxstring_simple(cell *dest, const char *source, int max);
template <typename T> int set_amxstring_utf8(AMX *amx, cell amx_addr, const T *source, size_t sourcelen, size_t maxlen);
int set_amxstring_utf8_char(AMX *amx, cell amx_addr, const char *source, size_t sourcelen, size_t maxlen);
int set_amxstring_utf8_cell(AMX *amx, cell amx_addr, const cell *source, size_t sourcelen, size_t maxlen);
int unload_amxscript(AMX* amx, void** program);
void copy_amxmemory(cell* dest, cell* src, int len);
void get_modname(char*);
void print_srvconsole(char *fmt, ...);
void report_error(int code, char* fmt, ...);
void* alloc_amxmemory(void**, int size);
void free_amxmemory(void **ptr);
void print_srvconsole(const char *fmt, ...);
void report_error(int code, const char* fmt, ...);
// get_localinfo
const char* get_localinfo(const char* name, const char* def);
cell AMX_NATIVE_CALL require_module(AMX *amx, cell *params);
extern "C" void LogError(AMX *amx, int err, const char *fmt, ...);
enum ModuleCallReason
@ -327,6 +340,8 @@ extern int FF_PluginEnd;
extern int FF_InconsistentFile;
extern int FF_ClientAuthorized;
extern int FF_ChangeLevel;
extern int FF_ClientConnectEx;
extern bool g_coloredmenus;
typedef void (*AUTHORIZEFUNC)(int player, const char *authstring);
@ -339,6 +354,23 @@ struct func_s
const char *desc;
};
enum AdminProperty
{
Admin_Auth = 0,
Admin_Password,
Admin_Access,
Admin_Flags
};
enum PrintColor
{
print_team_default = 0,
print_team_grey =-1,
print_team_red = -2,
print_team_blue = -3,
};
extern enginefuncs_t *g_pEngTable;
extern HLTypeConversion TypeConversion;
#endif // AMXMODX_H

View File

@ -2,8 +2,6 @@
*
* Copyright (c) ITB CompuPhase, 2001-2002
* This file may be freely used. No warranties of any kind.
*
* Version: $Id$
*/
#include <time.h>
#include <assert.h>

View File

@ -1,11 +0,0 @@
; /usr/local/cross-tools/bin/i386-mingw32msvc-dlltool --base-file /tmp/cc4kB6s0.base --output-exp amx_mm.exp --dllname amx_mm.dll --output-def amx_mm.def --add-stdcall-alias --exclude-symbol=DllMainCRTStartup@12 --def /tmp/ccyI7I7K.def
EXPORTS
GetEngineFunctions @ 1 ;
GetEngineFunctions_Post @ 2 ;
GetEntityAPI2 @ 3 ;
GetEntityAPI2_Post @ 4 ;
GiveFnptrsToDll = GiveFnptrsToDll@8 @ 5 ;
GiveFnptrsToDll@8 @ 6 ;
Meta_Attach @ 7 ;
Meta_Detach @ 8 ;
Meta_Query @ 9 ;

View File

@ -1,32 +1,11 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#include "amxmodx.h"
#include "amxxfile.h"
@ -42,7 +21,7 @@
#define PACKED
#endif
#if defined __linux__
#if defined(__linux__) || defined(__APPLE__)
#pragma pack(1) /* structures must be packed (byte-aligned) */
#else
#pragma pack(1) /* structures must be packed (byte-aligned) */
@ -127,7 +106,7 @@ CAmxxReader::CAmxxReader(const char *filename, int cellsize)
for (mint8_t i = 0; i < m_Bh.numPlugins; i++)
{
pe = &(m_Bh.plugins[i]);
pe = &(m_Bh.plugins[(unsigned)i]);
DATAREAD(&pe->cellsize, sizeof(mint8_t), 1);
DATAREAD(&pe->disksize, sizeof(int32_t), 1);
DATAREAD(&pe->imagesize, sizeof(int32_t), 1);
@ -137,7 +116,7 @@ CAmxxReader::CAmxxReader(const char *filename, int cellsize)
for (mint8_t i = 0; i < m_Bh.numPlugins; i++)
{
pe = &(m_Bh.plugins[i]);
pe = &(m_Bh.plugins[(unsigned)i]);
if (pe->cellsize == m_CellSize)
{
@ -310,7 +289,18 @@ size_t CAmxxReader::GetBufferSize()
m_pFile = NULL; \
return m_Status; \
}
#define DATAREAD_RELEASE(addr, itemsize, itemcount) \
if (fread(addr, itemsize, itemcount, m_pFile) != static_cast<size_t>(itemcount)) \
{ \
if (feof(m_pFile)) \
m_Status = Err_FileInvalid; \
else \
m_Status = Err_FileRead; \
fclose(m_pFile); \
m_pFile = NULL; \
delete[] tempBuffer;\
return m_Status; \
}
CAmxxReader::Error CAmxxReader::GetSection(void *buffer)
{
if (!m_pFile)
@ -332,7 +322,7 @@ CAmxxReader::Error CAmxxReader::GetSection(void *buffer)
PluginEntry *pe = &(m_Bh.plugins[m_Entry]);
char *tempBuffer = new char[m_SectionLength + 1];
fseek(m_pFile, pe->offs, SEEK_SET);
DATAREAD((void *)tempBuffer, 1, m_SectionLength);
DATAREAD_RELEASE((void *)tempBuffer, 1, m_SectionLength);
uLongf destLen = GetBufferSize();
int result = uncompress((Bytef *)buffer, &destLen, (Bytef *)tempBuffer, m_SectionLength);
delete [] tempBuffer;
@ -356,7 +346,7 @@ CAmxxReader::Error CAmxxReader::GetSection(void *buffer)
// read the data to a temporary buffer
char *tempBuffer = new char[m_SectionLength + 1];
//fread(tempBuffer, sizeof(char), m_SectionLength, m_pFile);
DATAREAD((void*)tempBuffer, 1, m_SectionLength);
DATAREAD_RELEASE((void*)tempBuffer, 1, m_SectionLength);
// decompress
int result = uncompress((Bytef *)buffer, &destLen, (Bytef *)tempBuffer, m_SectionLength);
delete [] tempBuffer;

View File

@ -1,33 +1,11 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#ifndef __AMXXFILE_H__
#define __AMXXFILE_H__

View File

@ -1,32 +1,11 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
// amxx_logging localinfo:
// 0 = no logging
@ -35,19 +14,21 @@
// 3 = HL Logs
#include <time.h>
#ifndef __linux__
#if defined(_WIN32)
#include <io.h>
#endif
#include "amxmodx.h"
#ifndef __linux__
#if defined(_WIN32WIN32)
#define vsnprintf _vsnprintf
#endif
#include <amxmodx_version.h>
CLog::CLog()
{
m_LogType = 0;
m_LogFile.clear();
m_LogFile = nullptr;
m_FoundError = false;
m_LoggedErrMap = false;
}
@ -60,14 +41,14 @@ CLog::~CLog()
void CLog::CloseFile()
{
// log "log file closed" to old file, if any
if (!m_LogFile.empty())
if (m_LogFile.length())
{
FILE *fp = fopen(m_LogFile.c_str(), "r");
FILE *fp = fopen(m_LogFile.chars(), "r");
if (fp)
{
fclose(fp);
fp = fopen(m_LogFile.c_str(), "a+");
fp = fopen(m_LogFile.chars(), "a+");
// get time
time_t td;
@ -81,7 +62,7 @@ void CLog::CloseFile()
fclose(fp);
}
m_LogFile.clear();
m_LogFile = nullptr;
}
}
@ -94,12 +75,14 @@ void CLog::CreateNewFile()
time(&td);
tm *curTime = localtime(&td);
char file[256];
char file[PLATFORM_MAX_PATH];
char name[256];
int i = 0;
while (true)
{
build_pathname_r(file, sizeof(file)-1, "%s/L%02d%02d%03d.log", g_log_dir.c_str(), curTime->tm_mon + 1, curTime->tm_mday, i);
ke::SafeSprintf(name, sizeof(name), "%s/L%02d%02d%03d.log", g_log_dir.chars(), curTime->tm_mon + 1, curTime->tm_mday, i);
build_pathname_r(file, sizeof(file), "%s", name);
FILE *pTmpFile = fopen(file, "r"); // open for reading to check whether the file exists
if (!pTmpFile)
@ -108,45 +91,51 @@ void CLog::CreateNewFile()
fclose(pTmpFile);
++i;
}
m_LogFile.assign(file);
m_LogFile = file;
// Log logfile start
FILE *fp = fopen(m_LogFile.c_str(), "w");
FILE *fp = fopen(m_LogFile.chars(), "w");
if (!fp)
{
ALERT(at_logged, "[AMXX] Unexpected fatal logging error. AMXX Logging disabled.\n");
SET_LOCALINFO("amxx_logging", "0");
} else {
fprintf(fp, "AMX Mod X log file started (file \"%s/L%02d%02d%03d.log\") (version \"%s\")\n", g_log_dir.c_str(), curTime->tm_mon + 1, curTime->tm_mday, i, AMX_VERSION);
fprintf(fp, "AMX Mod X log file started (file \"%s\") (version \"%s\")\n", name, AMXX_VERSION);
fclose(fp);
}
}
void CLog::UseFile(const String &fileName)
void CLog::UseFile(const ke::AString &fileName)
{
static char file[256];
m_LogFile.assign(build_pathname_r(file, sizeof(file)-1, "%s/%s", g_log_dir.c_str(), fileName.c_str()));
static char file[PLATFORM_MAX_PATH];
m_LogFile = build_pathname_r(file, sizeof(file), "%s/%s", g_log_dir.chars(), fileName.chars());
}
void CLog::SetLogType(const char* localInfo)
{
m_LogType = atoi(get_localinfo(localInfo, "1"));
if (m_LogType < 0 || m_LogType > 3)
{
SET_LOCALINFO(localInfo, "1");
m_LogType = 1;
print_srvconsole("[AMXX] Invalid amxx_logging value; setting back to 1...");
}
}
void CLog::MapChange()
{
// create dir if not existing
char file[256];
#ifdef __linux
mkdir(build_pathname_r(file, sizeof(file)-1, "%s", g_log_dir.c_str()), 0700);
char file[PLATFORM_MAX_PATH];
#if defined(__linux__) || defined(__APPLE__)
mkdir(build_pathname_r(file, sizeof(file), "%s", g_log_dir.chars()), 0700);
#else
mkdir(build_pathname_r(file, sizeof(file)-1, "%s", g_log_dir.c_str()));
mkdir(build_pathname_r(file, sizeof(file), "%s", g_log_dir.chars()));
#endif
m_LogType = atoi(get_localinfo("amxx_logging", "1"));
if (m_LogType < 0 || m_LogType > 3)
{
SET_LOCALINFO("amxx_logging", "1");
m_LogType = 1;
print_srvconsole("[AMXX] Invalid amxx_logging value; setting back to 1...");
}
SetLogType("amxx_logging");
m_LoggedErrMap = false;
@ -163,7 +152,7 @@ void CLog::MapChange()
void CLog::Log(const char *fmt, ...)
{
static char file[256];
static char file[PLATFORM_MAX_PATH];
if (m_LogType == 1 || m_LogType == 2)
{
@ -186,21 +175,21 @@ void CLog::Log(const char *fmt, ...)
FILE *pF = NULL;
if (m_LogType == 2)
{
pF = fopen(m_LogFile.c_str(), "a+");
pF = fopen(m_LogFile.chars(), "a+");
if (!pF)
{
CreateNewFile();
pF = fopen(m_LogFile.c_str(), "a+");
pF = fopen(m_LogFile.chars(), "a+");
if (!pF)
{
ALERT(at_logged, "[AMXX] Unexpected fatal logging error (couldn't open %s for a+). AMXX Logging disabled for this map.\n", m_LogFile.c_str());
ALERT(at_logged, "[AMXX] Unexpected fatal logging error (couldn't open %s for a+). AMXX Logging disabled for this map.\n", m_LogFile.chars());
m_LogType = 0;
return;
}
}
} else {
build_pathname_r(file, sizeof(file)-1, "%s/L%02d%02d.log", g_log_dir.c_str(), curTime->tm_mon + 1, curTime->tm_mday);
build_pathname_r(file, sizeof(file), "%s/L%04d%02d%02d.log", g_log_dir.chars(), (curTime->tm_year + 1900), curTime->tm_mon + 1, curTime->tm_mday);
pF = fopen(file, "a+");
}
@ -229,7 +218,8 @@ void CLog::Log(const char *fmt, ...)
void CLog::LogError(const char *fmt, ...)
{
static char file[256];
static char file[PLATFORM_MAX_PATH];
static char name[256];
if (m_FoundError)
{
@ -253,7 +243,8 @@ void CLog::LogError(const char *fmt, ...)
va_end(arglst);
FILE *pF = NULL;
build_pathname_r(file, sizeof(file)-1, "%s/error_%02d%02d%02d.log", g_log_dir.c_str(), curTime->tm_mon + 1, curTime->tm_mday, curTime->tm_year - 100);
ke::SafeSprintf(name, sizeof(name), "%s/error_%04d%02d%02d.log", g_log_dir.chars(), curTime->tm_year + 1900, curTime->tm_mon + 1, curTime->tm_mday);
build_pathname_r(file, sizeof(file), "%s", name);
pF = fopen(file, "a+");
if (pF)
@ -261,7 +252,7 @@ void CLog::LogError(const char *fmt, ...)
if (!m_LoggedErrMap)
{
fprintf(pF, "L %s: Start of error session.\n", date);
fprintf(pF, "L %s: Info (map \"%s\") (logfile \"error_%02d%02d%02d.log\")\n", date, STRING(gpGlobals->mapname), curTime->tm_mon + 1, curTime->tm_mday, curTime->tm_year - 100);
fprintf(pF, "L %s: Info (map \"%s\") (file \"%s\")\n", date, STRING(gpGlobals->mapname), name);
m_LoggedErrMap = true;
}
fprintf(pF, "L %s: %s\n", date, msg);
@ -275,4 +266,3 @@ void CLog::LogError(const char *fmt, ...)
// print on server console
print_srvconsole("L %s: %s\n", date, msg);
}

View File

@ -1,32 +1,11 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#ifndef __AMXXLOG_H__
#define __AMXXLOG_H__
@ -34,19 +13,20 @@
class CLog
{
private:
String m_LogFile;
ke::AString m_LogFile;
int m_LogType;
bool m_FoundError;
bool m_LoggedErrMap;
void GetLastFile(int &outMonth, int &outDay, String &outFilename);
void UseFile(const String &fileName);
void GetLastFile(int &outMonth, int &outDay, ke::AString &outFilename);
void UseFile(const ke::AString &fileName);
public:
CLog();
~CLog();
void CreateNewFile();
void CloseFile();
void SetLogType(const char* localInfo);
void MapChange();
void Log(const char *fmt, ...);
void LogError(const char *fmt, ...);

View File

@ -1,3 +1,12 @@
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#if defined BINLOG_ENABLED
#include <time.h>
@ -40,13 +49,13 @@ int LookupFile(AMX_DBG *amxdbg, ucell address)
bool BinLog::Open()
{
const char *data = get_localinfo("amxmodx_datadir", "addons/amxmodx/data");
char path[255];
build_pathname_r(path, sizeof(path)-1, "%s/binlogs", data);
char path[PLATFORM_MAX_PATH];
build_pathname_r(path, sizeof(path), "%s/binlogs", data);
if (!DirExists(path))
{
mkdir(path
#if defined __linux__
#if defined(__linux__) || defined(__APPLE__)
, 0755
#endif
);
@ -54,8 +63,8 @@ bool BinLog::Open()
return false;
}
char file[255];
build_pathname_r(file, sizeof(file)-1, "%s/binlogs/lastlog", data);
char file[PLATFORM_MAX_PATH];
build_pathname_r(file, sizeof(file), "%s/binlogs/lastlog", data);
unsigned int lastcntr = 0;
FILE *lastlog = fopen(file, "rb");
@ -72,13 +81,13 @@ bool BinLog::Open()
fwrite(&lastcntr, sizeof(int), 1, lastlog);
fclose(lastlog);
}
build_pathname_r(file, sizeof(file)-1, "%s/binlogs/binlog%04d.blg", data, lastcntr);
m_logfile.assign(file);
build_pathname_r(file, sizeof(file), "%s/binlogs/binlog%04d.blg", data, lastcntr);
m_logfile = file;
/**
* it's now safe to create the binary log
*/
FILE *fp = fopen(m_logfile.c_str(), "wb");
FILE *fp = fopen(m_logfile.chars(), "wb");
if (!fp)
return false;
@ -110,7 +119,7 @@ void BinLog::WriteOp(BinLogOp op, int plug, ...)
if (!m_state)
return;
FILE *fp = fopen(m_logfile.c_str(), "ab");
FILE *fp = fopen(m_logfile.chars(), "ab");
if (!fp)
return;
@ -122,7 +131,7 @@ void BinLog::WriteOp(BinLogOp op, int plug, ...)
fclose(fp);
Close();
Open();
fp = fopen(m_logfile.c_str(), "ab");
fp = fopen(m_logfile.chars(), "ab");
if (!fp)
return;
}

View File

@ -1,9 +1,18 @@
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#ifndef _INCLUDE_BINLOG_H
#define _INCLUDE_BINLOG_H
#if defined BINLOG_ENABLED
#include "CString.h"
#include <amtl/am-string.h>
#define BINLOG_MAGIC 0x414D424C
#define BINLOG_VERSION 0x0300
@ -71,7 +80,7 @@ public:
private:
void WritePluginDB(FILE *fp);
private:
String m_logfile;
ke::AString m_logfile;
bool m_state;
};

729
amxmodx/cvars.cpp Normal file
View File

@ -0,0 +1,729 @@
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#include "CvarManager.h"
#include "amxmodx.h"
#include "nongpl_matches.h"
char CVarTempBuffer[64];
const char *invis_cvar_list[5] ={ "amxmodx_version", "amxmodx_modules", "amx_debug", "amx_mldebug", "amx_client_languages" };
// create_cvar(const name[], const default_value[], flags = 0, const description[] = "", bool:has_min = false, Float:min_val = 0.0, bool:has_max = false, Float:max_val = 0.0)
static cell AMX_NATIVE_CALL create_cvar(AMX *amx, cell *params)
{
int length;
const char* name = get_amxstring(amx, params[1], 0, length);
const char* value = get_amxstring(amx, params[2], 1, length);
const char* helpText = get_amxstring(amx, params[4], 2, length);
int flags = params[3];
CPluginMngr::CPlugin *plugin = g_plugins.findPluginFast(amx);
if (CheckBadConList(name, 0))
{
plugin->AddToFailCounter(1);
}
CvarInfo* info = g_CvarManager.CreateCvar(name, value, plugin->getName(), plugin->getId(), flags, helpText);
if (info)
{
bool hasMin = params[5] != 0;
bool hasMax = params[7] != 0;
float minVal = amx_ctof(params[6]);
float maxVal = amx_ctof(params[8]);
if (hasMin && hasMax)
{
if (minVal > maxVal)
{
LogError(amx, AMX_ERR_NATIVE, "The minimum value can not be above the maximum value");
return 0;
}
else if (maxVal < minVal)
{
LogError(amx, AMX_ERR_NATIVE, "The maximum value can not be below the minimum value");
return 0;
}
}
g_CvarManager.SetCvarMin(info, hasMin, minVal, plugin->getId());
g_CvarManager.SetCvarMax(info, hasMax, maxVal, plugin->getId());
return reinterpret_cast<cell>(info->var);
}
return 0;
}
// register_cvar(const name[], const string[], flags=0, Float:fvalue=0.0)
static cell AMX_NATIVE_CALL register_cvar(AMX *amx, cell *params)
{
int length;
const char* name = get_amxstring(amx, params[1], 0, length);
const char* value = get_amxstring(amx, params[2], 1, length);
int flags = params[3];
float fvalue = amx_ctof(params[4]);
CPluginMngr::CPlugin *plugin = g_plugins.findPluginFast(amx);
if (CheckBadConList(name, 0))
{
plugin->AddToFailCounter(1);
}
CvarInfo* info = g_CvarManager.CreateCvar(name, value, plugin->getName(), plugin->getId(), flags);
if (info)
{
return reinterpret_cast<cell>(info->var);
}
return 0;
}
// cvar_exists(const cvar[])
static cell AMX_NATIVE_CALL cvar_exists(AMX *amx, cell *params)
{
int ilen;
return (g_CvarManager.FindCvar(get_amxstring(amx, params[1], 0, ilen)) ? 1 : 0);
}
// get_cvar_pointer(const cvar[])
static cell AMX_NATIVE_CALL get_cvar_pointer(AMX *amx, cell *params)
{
int len;
const char *name = get_amxstring(amx, params[1], 0, len);
CvarInfo* info = g_CvarManager.FindCvar(name);
return reinterpret_cast<cell>(info ? info->var : 0);
}
// hook_cvar_change(cvarHandle, const callback[])
static cell AMX_NATIVE_CALL hook_cvar_change(AMX *amx, cell *params)
{
cvar_t* var = reinterpret_cast<cvar_t*>(params[1]);
if (!var)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid cvar handle: %p", var);
return 0;
}
const char* callback;
AutoForward* forward = g_CvarManager.HookCvarChange(var, amx, params[2], &callback);
if (!forward)
{
LogError(amx, AMX_ERR_NATIVE, "Function \"%s\" is not present", callback);
return 0;
}
return reinterpret_cast<cell>(forward);
}
// enable_cvar_hook(cvarhook:handle);
static cell AMX_NATIVE_CALL enable_cvar_hook(AMX *amx, cell *params)
{
AutoForward* forward = reinterpret_cast<AutoForward*>(params[1]);
if (!forward)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid cvar hook handle: %p", forward);
return 0;
}
forward->state = AutoForward::FSTATE_OK;
return 1;
}
// disable_cvar_hook(cvarhook:handle);
static cell AMX_NATIVE_CALL disable_cvar_hook(AMX *amx, cell *params)
{
AutoForward* forward = reinterpret_cast<AutoForward*>(params[1]);
if (!forward)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid cvar hook handle: %p", forward);
return 0;
}
forward->state = AutoForward::FSTATE_STOP;
return 1;
}
// get_cvar_flags(const cvar[])
static cell AMX_NATIVE_CALL get_cvar_flags(AMX *amx, cell *params)
{
int ilen;
char* sCvar = get_amxstring(amx, params[1], 0, ilen);
CvarInfo* info = g_CvarManager.FindCvar(sCvar);
return info ? info->var->flags : 0;
}
// get_cvar_float(const cvarname[])
static cell AMX_NATIVE_CALL get_cvar_float(AMX *amx, cell *params)
{
int length;
const char* name = get_amxstring(amx, params[1], 0, length);
CvarInfo* info = g_CvarManager.FindCvar(name);
return info ? amx_ftoc(info->var->value) : 0;
}
// get_cvar_num(const cvarname[])
static cell AMX_NATIVE_CALL get_cvar_num(AMX *amx, cell *params)
{
int length;
const char* name = get_amxstring(amx, params[1], 0, length);
CvarInfo* info = g_CvarManager.FindCvar(name);
return info ? (int)info->var->value : 0;
}
// get_cvar_string(const cvarname[], output[], iLen)
static cell AMX_NATIVE_CALL get_cvar_string(AMX *amx, cell *params)
{
int length;
const char* name = get_amxstring(amx, params[1], 0, length);
CvarInfo* info = g_CvarManager.FindCvar(name);
const char *value = info ? info->var->string : "";
length = info ? strlen(value) : 0;
return set_amxstring_utf8(amx, params[2], value, length, params[3]);
}
// set_cvar_flags(const cvar[], flags)
static cell AMX_NATIVE_CALL set_cvar_flags(AMX *amx, cell *params)
{
int ilen;
const char* sCvar = get_amxstring(amx, params[1], 0, ilen);
if (!strcmp(sCvar, "amx_version") || !strcmp(sCvar, "amxmodx_version") || !strcmp(sCvar, "fun_version") || !strcmp(sCvar, "sv_cheats"))
return 0;
CvarInfo* info = g_CvarManager.FindCvar(sCvar);
if (info)
{
info->var->flags |= (int)(params[2]);
return 1;
}
return 0;
}
// set_cvar_float(const cvar[], Float:value)
static cell AMX_NATIVE_CALL set_cvar_float(AMX *amx, cell *params)
{
int length;
const char* name = get_amxstring(amx, params[1], 0, length);
CvarInfo* info = g_CvarManager.FindCvar(name);
if (info)
{
ke::SafeSprintf(CVarTempBuffer, sizeof(CVarTempBuffer), "%f", amx_ctof(params[2]));
CVAR_DIRECTSET(info->var, &CVarTempBuffer[0]);
}
return 1;
}
// set_cvar_num(const cvarname[], value)
static cell AMX_NATIVE_CALL set_cvar_num(AMX *amx, cell *params)
{
int length;
const char* name = get_amxstring(amx, params[1], 0, length);
int value = params[2];
CvarInfo* info = g_CvarManager.FindCvar(name);
if (info)
{
ke::SafeSprintf(CVarTempBuffer, sizeof(CVarTempBuffer), "%d", value);
CVAR_DIRECTSET(info->var, &CVarTempBuffer[0]);
}
return 1;
}
// set_cvar_string(const cvar[], const value[])
static cell AMX_NATIVE_CALL set_cvar_string(AMX *amx, cell *params)
{
int length;
const char* name = get_amxstring(amx, params[1], 0, length);
CvarInfo* info = g_CvarManager.FindCvar(name);
if (info)
{
CVAR_DIRECTSET(info->var, get_amxstring(amx, params[2], 1, length));
}
return 1;
}
// get_pcvar_flags(pcvar)
static cell AMX_NATIVE_CALL get_pcvar_flags(AMX *amx, cell *params)
{
cvar_t *ptr = reinterpret_cast<cvar_t *>(params[1]);
if (!ptr)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid CVAR pointer");
return 0;
}
return ptr->flags;
}
// Float:get_pcvar_float(pcvar)
static cell AMX_NATIVE_CALL get_pcvar_float(AMX *amx, cell *params)
{
cvar_t *ptr = reinterpret_cast<cvar_t *>(params[1]);
if (!ptr)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid CVAR pointer");
return 0;
}
return amx_ftoc(ptr->value);
}
// get_pcvar_num(pcvar)
static cell AMX_NATIVE_CALL get_pcvar_num(AMX *amx, cell *params)
{
cvar_t *ptr = reinterpret_cast<cvar_t *>(params[1]);
if (!ptr)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid CVAR pointer");
return 0;
}
return (int)ptr->value;
}
// bool:get_pcvar_bool(pcvar)
static cell AMX_NATIVE_CALL get_pcvar_bool(AMX *amx, cell *params)
{
return !!get_pcvar_num(amx, params);
}
// get_pcvar_string(pcvar, string[], maxlen)
static cell AMX_NATIVE_CALL get_pcvar_string(AMX *amx, cell *params)
{
cvar_t *ptr = reinterpret_cast<cvar_t *>(params[1]);
if (!ptr)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid CVAR pointer");
return 0;
}
return set_amxstring_utf8(amx, params[2], ptr->string ? ptr->string : "", ptr->string ? strlen(ptr->string) : 0, params[3]);
}
// get_pcvar_bounds(pcvar, CvarBounds:type, &Float:value)
static cell AMX_NATIVE_CALL get_pcvar_bounds(AMX *amx, cell *params)
{
cvar_t *ptr = reinterpret_cast<cvar_t *>(params[1]);
CvarInfo* info = nullptr;
if (!ptr || !(info = g_CvarManager.FindCvar(ptr->name)))
{
LogError(amx, AMX_ERR_NATIVE, "Invalid CVAR pointer");
return 0;
}
bool hasBound = false;
float bound;
switch (params[2])
{
case CvarBound_Lower:
hasBound = info->bound.hasMin;
bound = info->bound.minVal;
break;
case CvarBound_Upper:
hasBound = info->bound.hasMax;
bound = info->bound.maxVal;
break;
default:
LogError(amx, AMX_ERR_NATIVE, "Invalid CvarBounds value: %d", params[2]);
return 0;
}
*get_amxaddr(amx, params[3]) = amx_ftoc(bound);
return hasBound;
}
// bind_pcvar_float(pcvar, &Float:var)
static cell AMX_NATIVE_CALL bind_pcvar_float(AMX *amx, cell *params)
{
cvar_t *ptr = reinterpret_cast<cvar_t *>(params[1]);
CvarInfo* info = nullptr;
if (!ptr || !(info = g_CvarManager.FindCvar(ptr->name)))
{
LogError(amx, AMX_ERR_NATIVE, "Invalid CVAR pointer");
return 0;
}
return g_CvarManager.BindCvar(info, CvarBind::CvarType_Float, amx, params[2]);
}
// bind_pcvar_num(pcvar, &any:var)
static cell AMX_NATIVE_CALL bind_pcvar_num(AMX *amx, cell *params)
{
cvar_t *ptr = reinterpret_cast<cvar_t *>(params[1]);
CvarInfo* info = nullptr;
if (!ptr || !(info = g_CvarManager.FindCvar(ptr->name)))
{
LogError(amx, AMX_ERR_NATIVE, "Invalid CVAR pointer");
return 0;
}
return g_CvarManager.BindCvar(info, CvarBind::CvarType_Int, amx, params[2]);
}
// bind_pcvar_string(pcvar, any:var[], varlen)
static cell AMX_NATIVE_CALL bind_pcvar_string(AMX *amx, cell *params)
{
cvar_t *ptr = reinterpret_cast<cvar_t *>(params[1]);
CvarInfo* info = nullptr;
if (!ptr || !(info = g_CvarManager.FindCvar(ptr->name)))
{
LogError(amx, AMX_ERR_NATIVE, "Invalid CVAR pointer");
return 0;
}
return g_CvarManager.BindCvar(info, CvarBind::CvarType_String, amx, params[2], params[3]);
}
// set_pcvar_flags(pcvar, flags)
static cell AMX_NATIVE_CALL set_pcvar_flags(AMX *amx, cell *params)
{
cvar_t *ptr = reinterpret_cast<cvar_t *>(params[1]);
if (!ptr)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid CVAR pointer");
return 0;
}
ptr->flags = static_cast<int>(params[2]);
return 1;
}
// set_pcvar_float(pcvar, Float:num)
static cell AMX_NATIVE_CALL set_pcvar_float(AMX *amx, cell *params)
{
cvar_t *ptr = reinterpret_cast<cvar_t *>(params[1]);
if (!ptr)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid CVAR pointer");
return 0;
}
ke::SafeSprintf(CVarTempBuffer, sizeof(CVarTempBuffer), "%f", amx_ctof(params[2]));
CVAR_DIRECTSET(ptr, &CVarTempBuffer[0]);
return 1;
}
// set_pcvar_num(pcvar, num)
static cell AMX_NATIVE_CALL set_pcvar_num(AMX *amx, cell *params)
{
cvar_t *ptr = reinterpret_cast<cvar_t *>(params[1]);
if (!ptr)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid CVAR pointer");
return 0;
}
ke::SafeSprintf(CVarTempBuffer, sizeof(CVarTempBuffer), "%d", params[2]);
CVAR_DIRECTSET(ptr, &CVarTempBuffer[0]);
return 1;
}
// set_pcvar_string(pcvar, const string[])
static cell AMX_NATIVE_CALL set_pcvar_string(AMX *amx, cell *params)
{
cvar_t *ptr = reinterpret_cast<cvar_t *>(params[1]);
if (!ptr)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid CVAR pointer");
return 0;
}
int len;
CVAR_DIRECTSET(ptr, get_amxstring(amx, params[2], 0, len));
return 1;
}
// set_pcvar_bounds(pcvar, CvarBounds:type, bool:set, Float:value = 0.0)
static cell AMX_NATIVE_CALL set_pcvar_bounds(AMX *amx, cell *params)
{
cvar_t *ptr = reinterpret_cast<cvar_t *>(params[1]);
CvarInfo* info = nullptr;
if (!ptr || !(info = g_CvarManager.FindCvar(ptr->name)))
{
LogError(amx, AMX_ERR_NATIVE, "Invalid CVAR pointer");
return 0;
}
bool set = params[3] != 0;
int pluginId = g_plugins.findPluginFast(amx)->getId();
float value = amx_ctof(params[4]);
switch (params[2])
{
case CvarBound_Lower:
{
if (set && info->bound.hasMax && value > info->bound.maxVal)
{
LogError(amx, AMX_ERR_NATIVE, "The minimum value can not be above the maximum value");
return 0;
}
g_CvarManager.SetCvarMin(info, set, value, pluginId);
break;
}
case CvarBound_Upper:
{
if (set && info->bound.hasMin && value < info->bound.minVal)
{
LogError(amx, AMX_ERR_NATIVE, "The maximum value can not be below the minimum value");
return 0;
}
g_CvarManager.SetCvarMax(info, set, value, pluginId);
break;
}
default:
{
LogError(amx, AMX_ERR_NATIVE, "Invalid CvarBounds value: %d", params[2]);
return 0;
}
}
return 1;
}
// remove_cvar_flags(const cvar[], flags=-1)
static cell AMX_NATIVE_CALL remove_cvar_flags(AMX *amx, cell *params)
{
int ilen;
char* sCvar = get_amxstring(amx, params[1], 0, ilen);
if (!strcmp(sCvar, "amx_version") || !strcmp(sCvar, "amxmodx_version") || !strcmp(sCvar, "fun_version") || !strcmp(sCvar, "sv_cheats"))
return 0;
CvarInfo* info = g_CvarManager.FindCvar(sCvar);
if (info)
{
info->var->flags &= ~((int)(params[2]));
return 1;
}
return 0;
}
// get_plugins_cvar(id, name[], namelen, &flags=0, &plugin_id=0, &pcvar_handle=0, description[]="", desc_len=0)
static cell AMX_NATIVE_CALL get_plugins_cvar(AMX *amx, cell *params)
{
CvarInfo* info = g_CvarManager.FindCvar(params[1]);
if (info)
{
set_amxstring(amx, params[2], info->name.chars(), params[3]);
*get_amxaddr(amx, params[4]) = info->var->flags;
*get_amxaddr(amx, params[5]) = info->pluginId;
*get_amxaddr(amx, params[6]) = reinterpret_cast<cell>(info->var);
if (*params / sizeof(cell) >= 7)
{
set_amxstring(amx, params[7], info->description.chars(), params[8]);
}
return 1;
}
return 0;
}
// get_plugins_cvarsnum()
static cell AMX_NATIVE_CALL get_plugins_cvarsnum(AMX *amx, cell *params)
{
return g_CvarManager.GetRegCvarsCount();
}
#if defined AMD64
static bool g_warned_ccqv = false;
#endif
// query_client_cvar(id, const cvar[], const resultfunc[])
static cell AMX_NATIVE_CALL query_client_cvar(AMX *amx, cell *params)
{
int numParams = params[0] / sizeof(cell);
if (numParams != 3 && numParams != 5)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid number of parameters passed!");
return 0;
}
#if defined AMD64
if (!g_warned_ccqv)
{
LogError(amx, AMX_ERR_NATIVE, "[AMXX] Client CVAR Querying is not available on AMD64 (one time warn)");
g_warned_ccqv = true;
}
return 0;
#endif
if (!g_NewDLL_Available)
{
LogError(amx, AMX_ERR_NATIVE, "Client CVAR querying is not enabled - check MM version!");
return 0;
}
int id = params[1];
if (id < 1 || id > gpGlobals->maxClients)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid player id %d", id);
return 0;
}
CPlayer *pPlayer = GET_PLAYER_POINTER_I(id);
if (!pPlayer->initialized || pPlayer->IsBot())
{
LogError(amx, AMX_ERR_NATIVE, "Player %d is either not connected or a bot", id);
return 0;
}
int dummy;
const char *cvarname = get_amxstring(amx, params[2], 0, dummy);
const char *resultfuncname = get_amxstring(amx, params[3], 1, dummy);
// public clientcvarquery_result(id, const cvar[], const result[], [const param[]])
int iFunc;
if (numParams == 5 && params[4] != 0)
iFunc = registerSPForwardByName(amx, resultfuncname, FP_CELL, FP_STRING, FP_STRING, FP_ARRAY, FP_DONE);
else
iFunc = registerSPForwardByName(amx, resultfuncname, FP_CELL, FP_STRING, FP_STRING, FP_DONE);
if (iFunc == -1)
{
LogError(amx, AMX_ERR_NATIVE, "Function \"%s\" is not present", resultfuncname);
return 0;
}
ClientCvarQuery_Info *queryObject = new ClientCvarQuery_Info;
queryObject->resultFwd = iFunc;
queryObject->requestId = MAKE_REQUESTID(PLID);
if (numParams == 5 && params[4] != 0)
{
queryObject->paramLen = params[4] + 1;
queryObject->params = new cell[queryObject->paramLen];
if (!queryObject->params)
{
delete queryObject;
unregisterSPForward(iFunc);
LogError(amx, AMX_ERR_MEMORY, "Hmm. Out of memory?");
return 0;
}
memcpy(reinterpret_cast<void*>(queryObject->params), reinterpret_cast<const void *>(get_amxaddr(amx, params[5])), queryObject->paramLen * sizeof(cell));
queryObject->params[queryObject->paramLen - 1] = 0;
}
else {
queryObject->params = NULL;
queryObject->paramLen = 0;
}
pPlayer->queries.push_back(queryObject);
QUERY_CLIENT_CVAR_VALUE2(pPlayer->pEdict, cvarname, queryObject->requestId);
return 1;
}
AMX_NATIVE_INFO g_CvarNatives[] =
{
{"create_cvar", create_cvar},
{"register_cvar", register_cvar},
{"cvar_exists", cvar_exists},
{"get_cvar_pointer", get_cvar_pointer},
{"hook_cvar_change", hook_cvar_change},
{"enable_cvar_hook", enable_cvar_hook},
{"disable_cvar_hook", disable_cvar_hook},
{"get_cvar_flags", get_cvar_flags},
{"get_cvar_float", get_cvar_float},
{"get_cvar_num", get_cvar_num},
{"get_cvar_string", get_cvar_string},
{"set_cvar_flags", set_cvar_flags},
{"set_cvar_float", set_cvar_float},
{"set_cvar_num", set_cvar_num},
{"set_cvar_string", set_cvar_string},
{"get_pcvar_flags", get_pcvar_flags},
{"get_pcvar_float", get_pcvar_float},
{"get_pcvar_num", get_pcvar_num},
{"get_pcvar_bool", get_pcvar_bool},
{"get_pcvar_string", get_pcvar_string},
{"get_pcvar_bounds", get_pcvar_bounds},
{"set_pcvar_flags", set_pcvar_flags},
{"set_pcvar_float", set_pcvar_float},
{"set_pcvar_num", set_pcvar_num},
{"set_pcvar_bool", set_pcvar_num},
{"set_pcvar_string", set_pcvar_string},
{"set_pcvar_bounds", set_pcvar_bounds},
{"remove_cvar_flags", remove_cvar_flags},
{"bind_pcvar_float", bind_pcvar_float},
{"bind_pcvar_num", bind_pcvar_num},
{"bind_pcvar_string", bind_pcvar_string},
{"get_plugins_cvar", get_plugins_cvar},
{"get_plugins_cvarsnum", get_plugins_cvarsnum},
{"query_client_cvar", query_client_cvar},
{NULL, NULL}
};

250
amxmodx/datapacks.cpp Normal file
View File

@ -0,0 +1,250 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
* =============================================================================
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, version 3.0, as published by the
* Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*/
#include "CDataPack.h"
NativeHandle<CDataPack> DataPackHandles;
static cell AMX_NATIVE_CALL CreateDataPack(AMX* amx, cell* params)
{
return static_cast<cell>(DataPackHandles.create());
}
static cell AMX_NATIVE_CALL WritePackCell(AMX* amx, cell* params)
{
CDataPack *d = DataPackHandles.lookup(params[1]);
if (!d)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid datapack handle provided (%d)", params[1]);
return 0;
}
d->PackCell(params[2]);
return 1;
}
static cell AMX_NATIVE_CALL WritePackFloat(AMX* amx, cell* params)
{
CDataPack *d = DataPackHandles.lookup(params[1]);
if (!d)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid datapack handle provided (%d)", params[1]);
return 0;
}
d->PackFloat(amx_ctof(params[2]));
return 1;
}
static cell AMX_NATIVE_CALL WritePackString(AMX* amx, cell* params)
{
CDataPack *d = DataPackHandles.lookup(params[1]);
if (!d)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid datapack handle provided (%d)", params[1]);
return 0;
}
int len;
const char *str = get_amxstring(amx, params[2], 0, len);
d->PackString(str);
return len;
}
static cell AMX_NATIVE_CALL ReadPackCell(AMX* amx, cell* params)
{
CDataPack *d = DataPackHandles.lookup(params[1]);
if (!d)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid datapack handle provided (%d)", params[1]);
return 0;
}
if (!d->CanReadCell())
{
LogError(amx, AMX_ERR_NATIVE, "Datapack operation is invalid.");
return 0;
}
return d->ReadCell();
}
static cell AMX_NATIVE_CALL ReadPackFloat(AMX* amx, cell* params)
{
CDataPack *d = DataPackHandles.lookup(params[1]);
if (!d)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid datapack handle provided (%d)", params[1]);
return 0;
}
if (!d->CanReadFloat())
{
LogError(amx, AMX_ERR_NATIVE, "Datapack operation is invalid.");
return 0;
}
float value = d->ReadFloat();
return amx_ftoc(value);
}
static cell AMX_NATIVE_CALL ReadPackString(AMX* amx, cell* params)
{
CDataPack *d = DataPackHandles.lookup(params[1]);
if (!d)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid datapack handle provided (%d)", params[1]);
return 0;
}
if (!d->CanReadString(NULL))
{
LogError(amx, AMX_ERR_NATIVE, "Datapack operation is invalid.");
return 0;
}
size_t len;
const char *str = d->ReadString(&len);
return set_amxstring_utf8(amx, params[2], str, len, params[3]);
}
static cell AMX_NATIVE_CALL ResetPack(AMX* amx, cell* params)
{
CDataPack *d = DataPackHandles.lookup(params[1]);
if (!d)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid datapack handle provided (%d)", params[1]);
return 0;
}
d->Reset();
if (params[2])
{
d->ResetSize();
}
return 1;
}
static cell AMX_NATIVE_CALL GetPackPosition(AMX* amx, cell* params)
{
CDataPack *d = DataPackHandles.lookup(params[1]);
if (!d)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid datapack handle provided (%d)", params[1]);
return 0;
}
return static_cast<cell>(d->GetPosition());
}
static cell AMX_NATIVE_CALL SetPackPosition(AMX* amx, cell* params)
{
CDataPack *d = DataPackHandles.lookup(params[1]);
if (!d)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid datapack handle provided (%d)", params[1]);
return 0;
}
if (!d->SetPosition(params[2]))
{
LogError(amx, AMX_ERR_NATIVE, "Invalid DataPack position, %d is out of bounds", params[2]);
return 0;
}
return 1;
}
static cell AMX_NATIVE_CALL IsPackEnded(AMX* amx, cell* params)
{
CDataPack *d = DataPackHandles.lookup(params[1]);
if (!d)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid datapack handle provided (%d)", params[1]);
return 0;
}
return d->IsReadable(1) ? false : true;
}
static cell AMX_NATIVE_CALL DestroyDataPack(AMX* amx, cell* params)
{
cell *ptr = get_amxaddr(amx, params[1]);
CDataPack *d = DataPackHandles.lookup(*ptr);
if (!d)
{
return 0;
}
if (DataPackHandles.destroy(*ptr))
{
*ptr = 0;
return 1;
}
return 0;
}
AMX_NATIVE_INFO g_DatapackNatives[] =
{
{ "CreateDataPack" , CreateDataPack },
{ "WritePackCell" , WritePackCell },
{ "WritePackFloat" , WritePackFloat },
{ "WritePackString", WritePackString },
{ "ReadPackCell" , ReadPackCell },
{ "ReadPackFloat" , ReadPackFloat },
{ "ReadPackString" , ReadPackString },
{ "ResetPack" , ResetPack },
{ "GetPackPosition", GetPackPosition },
{ "SetPackPosition", SetPackPosition },
{ "IsPackEnded" , IsPackEnded },
{ "DestroyDataPack", DestroyDataPack },
{ nullptr , nullptr}
};

935
amxmodx/datastructs.cpp Normal file
View File

@ -0,0 +1,935 @@
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#include "amxmodx.h"
#include "datastructs.h"
#include <amtl/am-utility.h>
NativeHandle<CellArray> ArrayHandles;
// Array:ArrayCreate(cellsize=1, reserved=32);
static cell AMX_NATIVE_CALL ArrayCreate(AMX* amx, cell* params)
{
// params[1] (cellsize) is how big in cells each element is.
// this MUST be greater than 0!
int cellsize = params[1];
// params[2] (reserved) is how many elements to allocate
// immediately when the list is created.
int reserved = params[2];
if (cellsize <= 0)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid array size (%d)", cellsize);
return -1;
}
if (reserved < 0)
{
reserved = 0;
}
return ArrayHandles.create(cellsize, reserved);
}
// native ArrayClear(Array:which);
static cell AMX_NATIVE_CALL ArrayClear(AMX* amx, cell* params)
{
CellArray* vec = ArrayHandles.lookup(params[1]);
if (!vec)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", params[1]);
return 0;
}
vec->clear();
return 1;
}
// native ArraySize(Array:which);
static cell AMX_NATIVE_CALL ArraySize(AMX* amx, cell* params)
{
CellArray* vec = ArrayHandles.lookup(params[1]);
if (!vec)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", params[1]);
return 0;
}
return vec->size();
}
// native bool:ArrayResize(Array:which, newsize);
static cell AMX_NATIVE_CALL ArrayResize(AMX* amx, cell* params)
{
CellArray* vec = ArrayHandles.lookup(params[1]);
if (!vec)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", params[1]);
return 0;
}
if (!vec->resize(params[2]))
{
LogError(amx, AMX_ERR_NATIVE, "Unable to resize array to \"%u\"", params[2]);
return 0;
}
return 1;
}
// native Array:ArrayClone(Array:which);
static cell AMX_NATIVE_CALL ArrayClone(AMX* amx, cell* params)
{
CellArray* vec = ArrayHandles.lookup(params[1]);
if (!vec)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", params[1]);
return 0;
}
auto data = vec->clone();
if (!data)
{
LogError(amx, AMX_ERR_NATIVE, "Failed to clone array. Out of memory.");
return 0;
}
return ArrayHandles.clone(data);
}
// native ArrayGetArray(Array:which, item, any:output[], size = -1);
static cell AMX_NATIVE_CALL ArrayGetArray(AMX* amx, cell* params)
{
CellArray* vec = ArrayHandles.lookup(params[1]);
if (!vec)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", params[1]);
return 0;
}
size_t idx = (size_t)params[2];
if (idx >= vec->size())
{
LogError(amx, AMX_ERR_NATIVE, "Invalid index %d (count: %d)", idx, vec->size());
return 0;
}
cell *blk = vec->at(idx);
size_t indexes = vec->blocksize();
if (*params / sizeof(cell) == 4)
{
if (params[4] != -1 && (size_t)params[4] <= vec->blocksize())
{
indexes = params[4];
}
}
cell *addr = get_amxaddr(amx, params[3]);
memcpy(addr, blk, sizeof(cell) * indexes);
return indexes;
}
// native any:ArrayGetCell(Array:which, item, block = 0, bool:asChar = false);
static cell AMX_NATIVE_CALL ArrayGetCell(AMX* amx, cell* params)
{
CellArray* vec = ArrayHandles.lookup(params[1]);
if (!vec)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", params[1]);
return 0;
}
size_t idx = (size_t)params[2];
if (idx >= vec->size())
{
LogError(amx, AMX_ERR_NATIVE, "Invalid index %d (count: %d)", idx, vec->size());
return 0;
}
cell *blk = vec->at(idx);
if (*params / sizeof(cell) <= 2)
{
return *blk;
}
idx = (size_t)params[3];
if (!params[4])
{
if (idx >= vec->blocksize())
{
LogError(amx, AMX_ERR_NATIVE, "Invalid block %d (blocksize: %d)", idx, vec->blocksize());
return 0;
}
return blk[idx];
}
else
{
if (idx >= vec->blocksize() * 4)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid byte %d (blocksize: %d bytes)", idx, vec->blocksize() * 4);
return 0;
}
return (cell)*((char *)blk + idx);
}
return 0;
}
// native ArrayGetString(Array:which, item, output[], size);
static cell AMX_NATIVE_CALL ArrayGetString(AMX* amx, cell* params)
{
CellArray* vec = ArrayHandles.lookup(params[1]);
if (!vec)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", params[1]);
return 0;
}
size_t idx = (size_t)params[2];
if (idx >= vec->size())
{
LogError(amx, AMX_ERR_NATIVE, "Invalid index %d (count: %d)", idx, vec->size());
return 0;
}
cell *blk = vec->at(idx);
return set_amxstring_utf8(amx, params[3], blk, amxstring_len(blk), params[4]);
}
// native ArraySetArray(Array:which, item, const any:input[], size =-1);
static cell AMX_NATIVE_CALL ArraySetArray(AMX* amx, cell* params)
{
CellArray* vec = ArrayHandles.lookup(params[1]);
if (!vec)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", params[1]);
return 0;
}
size_t idx = (size_t)params[2];
if (idx >= vec->size())
{
LogError(amx, AMX_ERR_NATIVE, "Invalid index %d (count: %d)", idx, vec->size());
return 0;
}
cell *blk = vec->at(idx);
size_t indexes = vec->blocksize();
if (*params / sizeof(cell) == 4)
{
if (params[4] != -1 && (size_t)params[4] <= vec->blocksize())
{
indexes = params[4];
}
}
cell *addr = get_amxaddr(amx, params[3]);
memcpy(blk, addr, sizeof(cell) * indexes);
return indexes;
}
// native ArraySetCell(Array:which, item, any:input, block = 0, bool:asChar = false);
static cell AMX_NATIVE_CALL ArraySetCell(AMX* amx, cell* params)
{
CellArray* vec = ArrayHandles.lookup(params[1]);
if (!vec)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", params[1]);
return 0;
}
size_t idx = (size_t)params[2];
if (idx >= vec->size())
{
LogError(amx, AMX_ERR_NATIVE, "Invalid index %d (count: %d)", idx, vec->size());
return 0;
}
cell *blk = vec->at(idx);
idx = (size_t)params[4];
if (*params / sizeof(cell) <= 3)
{
*blk = params[3];
return 1;
}
if (params[5] == 0)
{
if (idx >= vec->blocksize())
{
LogError(amx, AMX_ERR_NATIVE, "Invalid block %d (blocksize: %d)", idx, vec->blocksize());
return 0;
}
blk[idx] = params[3];
}
else
{
if (idx >= vec->blocksize() * 4)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid byte %d (blocksize: %d bytes)", idx, vec->blocksize() * 4);
return 0;
}
*((char *)blk + idx) = (char)params[3];
}
return 1;
}
// native ArraySetString(Array:which, item, const input[]);
static cell AMX_NATIVE_CALL ArraySetString(AMX* amx, cell* params)
{
CellArray* vec = ArrayHandles.lookup(params[1]);
if (!vec)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", params[1]);
return 0;
}
size_t idx = (size_t)params[2];
if (idx >= vec->size())
{
LogError(amx, AMX_ERR_NATIVE, "Invalid index %d (count: %d)", idx, vec->size());
return 0;
}
cell *blk = vec->at(idx);
int len;
char *str = get_amxstring(amx, params[3], 0, len);
return strncopy(blk, str, ke::Min((size_t)len + 1, vec->blocksize()));
}
// native ArrayPushArray(Array:which, const any:input[], size = -1);
static cell AMX_NATIVE_CALL ArrayPushArray(AMX* amx, cell* params)
{
CellArray* vec = ArrayHandles.lookup(params[1]);
if (!vec)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", params[1]);
return 0;
}
cell *blk = vec->push();
if (!blk)
{
LogError(amx, AMX_ERR_NATIVE, "Failed to grow array");
return 0;
}
cell *addr = get_amxaddr(amx, params[2]);
size_t indexes = vec->blocksize();
if (*params / sizeof(cell) == 3)
{
if (params[3] != -1 && (size_t)params[3] <= vec->blocksize())
{
indexes = params[3];
}
}
memcpy(blk, addr, sizeof(cell) * indexes);
return static_cast<cell>((vec->size() - 1));
}
// native ArrayPushCell(Array:which, any:input);
static cell AMX_NATIVE_CALL ArrayPushCell(AMX* amx, cell* params)
{
CellArray* vec = ArrayHandles.lookup(params[1]);
if (!vec)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", params[1]);
return 0;
}
cell *blk = vec->push();
if (!blk)
{
LogError(amx, AMX_ERR_NATIVE, "Failed to grow array");
return 0;
}
*blk = params[2];
return static_cast<cell>((vec->size() - 1));
}
// native ArrayPushString(Array:which, const input[]);
static cell AMX_NATIVE_CALL ArrayPushString(AMX* amx, cell* params)
{
CellArray* vec = ArrayHandles.lookup(params[1]);
if (!vec)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", params[1]);
return 0;
}
cell *blk = vec->push();
if (!blk)
{
LogError(amx, AMX_ERR_NATIVE, "Failed to grow array");
return 0;
}
strncopy(blk, get_amxaddr(amx, params[2]), vec->blocksize());
return static_cast<cell>((vec->size() - 1));
}
// native DoNotUse : ArrayGetStringHandle(Array : which, item);
static cell AMX_NATIVE_CALL ArrayGetStringHandle(AMX* amx, cell* params)
{
CellArray* vec = ArrayHandles.lookup(params[1]);
if (!vec)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", params[1]);
return 0;
}
size_t idx = (size_t)params[2];
if (idx >= vec->size())
{
LogError(amx, AMX_ERR_NATIVE, "Invalid index %d (count: %d)", idx, vec->size());
return 0;
}
cell* ptr = vec->at(idx);
if (ptr == NULL)
{
return 0;
}
return reinterpret_cast<cell>(ptr);
}
// native ArrayInsertArrayAfter(Array:which, item, const any:input[]);
static cell AMX_NATIVE_CALL ArrayInsertArrayAfter(AMX* amx, cell* params)
{
CellArray* vec = ArrayHandles.lookup(params[1]);
if (!vec)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", params[1]);
return 0;
}
size_t idx = params[2] + 1;
if (idx > vec->size())
{
LogError(amx, AMX_ERR_NATIVE, "Invalid item specified in ArrayInsertArrayAfter (%d:%d)", idx, vec->size());
return 0;
}
cell *addr = get_amxaddr(amx, params[3]);
memcpy(vec->insert_at(idx), addr, sizeof(cell) * vec->blocksize());
return 1;
}
// native ArrayInsertCellAfter(Array:which, item, any:input);
static cell AMX_NATIVE_CALL ArrayInsertCellAfter(AMX* amx, cell* params)
{
CellArray* vec = ArrayHandles.lookup(params[1]);
if (!vec)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", params[1]);
return 0;
}
size_t idx = params[2] + 1;
if (idx > vec->size())
{
LogError(amx, AMX_ERR_NATIVE, "Invalid item specified in ArrayInsertCellAfter (%d:%d)", idx, vec->size());
return 0;
}
*vec->insert_at(idx) = params[3];
return 1;
}
// native ArrayInsertStringAfter(Array:which, item, const input[]);
static cell AMX_NATIVE_CALL ArrayInsertStringAfter(AMX* amx, cell* params)
{
CellArray* vec = ArrayHandles.lookup(params[1]);
if (!vec)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", params[1]);
return 0;
}
size_t idx = params[2] + 1;
if (idx > vec->size())
{
LogError(amx, AMX_ERR_NATIVE, "Invalid item specified in ArrayInsertStringAfter (%d:%d)", idx, vec->size());
return 0;
}
int len;
const char *str = get_amxstring(amx, params[3], 0, len);
return strncopy(vec->insert_at(idx), str, ke::Min((size_t)len + 1, vec->blocksize()));
}
// native ArrayInsertArrayBefore(Array:which, item, const any:input[]);
static cell AMX_NATIVE_CALL ArrayInsertArrayBefore(AMX* amx, cell* params)
{
CellArray* vec = ArrayHandles.lookup(params[1]);
if (!vec)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", params[1]);
return 0;
}
size_t idx = params[2];
if (idx >= vec->size())
{
LogError(amx, AMX_ERR_NATIVE, "Invalid item specified in ArrayInsertArrayBefore (%d:%d)", idx, vec->size());
return 0;
}
cell *addr = get_amxaddr(amx, params[3]);
memcpy(vec->insert_at(idx), addr, vec->blocksize() * sizeof(cell));
return 1;
}
// native ArrayInsertCellBefore(Array:which, item, const any:input);
static cell AMX_NATIVE_CALL ArrayInsertCellBefore(AMX* amx, cell* params)
{
CellArray* vec = ArrayHandles.lookup(params[1]);
if (!vec)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", params[1]);
return 0;
}
size_t idx = params[2];
if (idx >= vec->size())
{
LogError(amx, AMX_ERR_NATIVE, "Invalid item specified in ArrayInsertCellBefore (%d:%d)", idx, vec->size());
return 0;
}
*vec->insert_at(idx) = params[3];
return 1;
}
// native ArrayInsertStringBefore(Array:which, item, const input[]);
static cell AMX_NATIVE_CALL ArrayInsertStringBefore(AMX* amx, cell* params)
{
CellArray* vec = ArrayHandles.lookup(params[1]);
if (!vec)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", params[1]);
return 0;
}
size_t idx = params[2];
if (idx >= vec->size())
{
LogError(amx, AMX_ERR_NATIVE, "Invalid item specified in ArrayInsertStringBefore (%d:%d)", idx, vec->size());
return 0;
}
int len;
const char *str = get_amxstring(amx, params[3], 0, len);
return strncopy(vec->insert_at(idx), str, ke::Min((size_t)len + 1, vec->blocksize()));
}
// native ArraySwap(Array:which, item1, item2);
static cell AMX_NATIVE_CALL ArraySwap(AMX* amx, cell* params)
{
CellArray* vec = ArrayHandles.lookup(params[1]);
if (!vec)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", params[1]);
return 0;
}
size_t idx1 = (size_t)params[2];
size_t idx2 = (size_t)params[3];
if (idx1 >= vec->size())
{
LogError(amx, AMX_ERR_NATIVE, "Invalid index %d (count: %d)", idx1, vec->size());
return 0;
}
if (idx2 >= vec->size())
{
LogError(amx, AMX_ERR_NATIVE, "Invalid index %d (count: %d)", idx2, vec->size());
return 0;
}
vec->swap(idx1, idx2);
return 1;
}
// native ArrayDeleteItem(Array:which, item);
static cell AMX_NATIVE_CALL ArrayDeleteItem(AMX* amx, cell* params)
{
CellArray* vec = ArrayHandles.lookup(params[1]);
if (!vec)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", params[1]);
return 0;
}
size_t idx = (size_t)params[2];
if (idx >= vec->size())
{
LogError(amx, AMX_ERR_NATIVE, "Invalid index %d (count: %d)", idx, vec->size());
return 0;
}
vec->remove(idx);
return 1;
}
// native ArrayDestroy(&Array:which);
static cell AMX_NATIVE_CALL ArrayDestroy(AMX* amx, cell* params)
{
cell *handle = get_amxaddr(amx, params[1]);
CellArray* vec = ArrayHandles.lookup(*handle);
if (!vec)
{
return 0;
}
if (ArrayHandles.destroy(*handle))
{
*handle = 0;
return 1;
}
return 1;
}
struct ArraySort_s
{
int func;
cell array_hndl;
cell* array_base;
cell array_bsize;
cell data;
cell size;
cell addr1;
cell addr2;
AMX *amx;
};
ArraySort_s SortInfo;
int SortArrayList(const void *elem1, const void *elem2)
{
return executeForwards(
SortInfo.func,
SortInfo.array_hndl,
((cell)((cell *)elem1 - SortInfo.array_base)) / SortInfo.array_bsize,
((cell)((cell *)elem2 - SortInfo.array_base)) / SortInfo.array_bsize,
SortInfo.data,
SortInfo.size
);
}
// native ArraySort(Array:array, const comparefunc[], data[]="", data_size=0);
static cell AMX_NATIVE_CALL ArraySort(AMX* amx, cell* params)
{
cell handle = params[1];
CellArray* vec = ArrayHandles.lookup(handle);
if (!vec)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", handle);
return 0;
}
int len;
char* funcName = get_amxstring(amx, params[2], 0, len);
// MySortFunc(Array:array, item1, item2, const data[], data_size)
int func = registerSPForwardByName(amx, funcName, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_DONE);
if (func < 0)
{
LogError(amx, AMX_ERR_NATIVE, "The public function \"%s\" was not found.", funcName);
return 0;
}
size_t arraysize = vec->size();
size_t blocksize = vec->blocksize();
cell *array = vec->base();
ArraySort_s oldinfo = SortInfo;
SortInfo.func = func;
SortInfo.array_base = array;
SortInfo.array_bsize = static_cast<cell>(blocksize);
SortInfo.array_hndl = handle;
SortInfo.data = params[3];
SortInfo.size = params[4];
qsort(array, arraysize, blocksize * sizeof(cell), SortArrayList);
SortInfo = oldinfo;
unregisterSPForward(func);
return 1;
}
int SortArrayListExCell(const void *elem1, const void *elem2)
{
size_t index1 = ((cell)((cell *)elem1 - SortInfo.array_base)) / SortInfo.array_bsize;
size_t index2 = ((cell)((cell *)elem2 - SortInfo.array_base)) / SortInfo.array_bsize;
return executeForwards(
SortInfo.func,
SortInfo.array_hndl,
*&SortInfo.array_base[index1 * SortInfo.array_bsize],
*&SortInfo.array_base[index2 * SortInfo.array_bsize],
SortInfo.data,
SortInfo.size
);
}
int SortArrayListExArray(const void *elem1, const void *elem2)
{
size_t index1 = ((cell)((cell *)elem1 - SortInfo.array_base)) / SortInfo.array_bsize;
size_t index2 = ((cell)((cell *)elem2 - SortInfo.array_base)) / SortInfo.array_bsize;
cell *addr1 = get_amxaddr(SortInfo.amx, SortInfo.addr1);
cell *addr2 = get_amxaddr(SortInfo.amx, SortInfo.addr2);
memcpy(addr1, &SortInfo.array_base[index1 * SortInfo.array_bsize], SortInfo.array_bsize * sizeof(cell));
memcpy(addr2, &SortInfo.array_base[index2 * SortInfo.array_bsize], SortInfo.array_bsize * sizeof(cell));
return executeForwards(
SortInfo.func,
SortInfo.array_hndl,
SortInfo.addr1,
SortInfo.addr2,
SortInfo.data,
SortInfo.size
);
}
// native ArraySortEx(Array:array, const comparefunc[], data[]="", data_size=0);
static cell AMX_NATIVE_CALL ArraySortEx(AMX* amx, cell* params)
{
CellArray* vec = ArrayHandles.lookup(params[1]);
if (!vec)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", params[1]);
return 0;
}
int len;
char* funcName = get_amxstring(amx, params[2], 0, len);
int func = registerSPForwardByName(amx, funcName, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_DONE);
if (!func)
{
LogError(amx, AMX_ERR_NATIVE, "The public function \"%s\" was not found.", funcName);
return 0;
}
size_t arraysize = vec->size();
size_t blocksize = vec->blocksize();
cell *array = vec->base();
cell amx_addr1 = 0, amx_addr2 = 0, *phys_addr = NULL;
if (blocksize > 1)
{
int err;
if ((err = amx_Allot(amx, blocksize, &amx_addr1, &phys_addr)) != AMX_ERR_NONE
|| ( err = amx_Allot(amx, blocksize, &amx_addr2, &phys_addr)) != AMX_ERR_NONE)
{
LogError(amx, err, "Ran out of memory");
return 0;
}
}
ArraySort_s oldinfo = SortInfo;
SortInfo.func = func;
SortInfo.array_base = array;
SortInfo.array_bsize = static_cast<cell>(blocksize);
SortInfo.array_hndl = params[1];
SortInfo.data = params[3];
SortInfo.size = params[4];
SortInfo.amx = amx;
SortInfo.addr1 = amx_addr1;
SortInfo.addr2 = amx_addr2;
qsort(array, arraysize, blocksize * sizeof(cell), blocksize > 1 ? SortArrayListExArray : SortArrayListExCell);
SortInfo = oldinfo;
if (blocksize > 1)
{
amx_Release(amx, amx_addr1);
amx_Release(amx, amx_addr2);
}
unregisterSPForward(func);
return 1;
}
extern bool fastcellcmp(cell *a, cell *b, cell len);
extern int amxstring_len(cell* a);
// native ArrayFindString(Array:which, const item[]);
static cell AMX_NATIVE_CALL ArrayFindString(AMX* amx, cell* params)
{
CellArray* vec = ArrayHandles.lookup(params[1]);
if (!vec)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", params[1]);
return -1;
}
cell *b, *a = get_amxaddr(amx, params[2]);
size_t cellcount = vec->blocksize();
size_t a_len = ke::Max(1, amxstring_len(a));
size_t len = a_len > cellcount ? cellcount : a_len;
for (size_t i = 0; i < vec->size(); i++)
{
b = vec->at(i);
if (fastcellcmp(a, b, len))
{
return static_cast<cell>(i);
}
}
return -1;
}
// native ArrayFindValue(Array:which, any:item);
static cell AMX_NATIVE_CALL ArrayFindValue(AMX* amx, cell* params)
{
CellArray* vec = ArrayHandles.lookup(params[1]);
if (!vec)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", params[1]);
return -1;
}
for (size_t i = 0; i < vec->size(); i++)
{
if (params[2] == *vec->at(i))
{
return static_cast<cell>(i);
}
}
return -1;
}
AMX_NATIVE_INFO g_DataStructNatives[] =
{
{ "ArrayCreate" , ArrayCreate },
{ "ArrayClear" , ArrayClear },
{ "ArrayClone" , ArrayClone },
{ "ArraySize" , ArraySize },
{ "ArrayResize" , ArrayResize },
{ "ArrayGetArray" , ArrayGetArray },
{ "ArrayGetCell" , ArrayGetCell },
{ "ArrayGetString" , ArrayGetString },
{ "ArraySetArray" , ArraySetArray },
{ "ArraySetCell" , ArraySetCell },
{ "ArraySetString" , ArraySetString },
{ "ArrayPushArray" , ArrayPushArray },
{ "ArrayPushCell" , ArrayPushCell },
{ "ArrayPushString" , ArrayPushString },
{ "ArrayInsertArrayAfter" , ArrayInsertArrayAfter },
{ "ArrayInsertCellAfter" , ArrayInsertCellAfter },
{ "ArrayInsertStringAfter" , ArrayInsertStringAfter },
{ "ArrayInsertArrayBefore" , ArrayInsertArrayBefore },
{ "ArrayInsertCellBefore" , ArrayInsertCellBefore },
{ "ArrayInsertStringBefore", ArrayInsertStringBefore },
{ "ArraySwap" , ArraySwap },
{ "ArrayDeleteItem" , ArrayDeleteItem },
{ "ArrayGetStringHandle" , ArrayGetStringHandle },
{ "ArrayDestroy" , ArrayDestroy },
{ "ArraySort" , ArraySort },
{ "ArraySortEx" , ArraySortEx },
{ "ArrayFindString" , ArrayFindString },
{ "ArrayFindValue" , ArrayFindValue },
{ nullptr , nullptr }
};

197
amxmodx/datastructs.h Normal file
View File

@ -0,0 +1,197 @@
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#ifndef DATASTRUCTS_H
#define DATASTRUCTS_H
#include "natives_handles.h"
class CellArray
{
public:
CellArray(size_t blocksize, size_t basesize = 0) : m_Data(nullptr), m_BlockSize(blocksize), m_AllocSize(0), m_BaseSize(basesize > 0 ? basesize : 8), m_Size(0)
{
}
~CellArray()
{
free(m_Data);
}
size_t size() const
{
return m_Size;
}
cell *push()
{
if (!GrowIfNeeded(1))
{
return NULL;
}
cell *arr = &m_Data[m_Size * m_BlockSize];
m_Size++;
return arr;
}
cell *at(size_t b) const
{
return &m_Data[b * m_BlockSize];
}
size_t blocksize() const
{
return m_BlockSize;
}
void clear()
{
m_Size = 0;
}
bool swap(size_t item1, size_t item2)
{
/* Make sure there is extra space available */
if (!GrowIfNeeded(1))
{
return false;
}
cell *pri = at(item1);
cell *alt = at(item2);
/* Get our temporary array 1 after the limit */
cell *temp = &m_Data[m_Size * m_BlockSize];
memcpy(temp, pri, sizeof(cell)* m_BlockSize);
memcpy(pri, alt, sizeof(cell)* m_BlockSize);
memcpy(alt, temp, sizeof(cell)* m_BlockSize);
return true;
}
void remove(size_t index)
{
/* If we're at the end, take the easy way out */
if (index == m_Size - 1)
{
m_Size--;
return;
}
/* Otherwise, it's time to move stuff! */
size_t remaining_indexes = (m_Size - 1) - index;
cell *src = at(index + 1);
cell *dest = at(index);
memmove(dest, src, sizeof(cell)* m_BlockSize * remaining_indexes);
m_Size--;
}
cell *insert_at(size_t index)
{
/* Make sure it'll fit */
if (!GrowIfNeeded(1))
{
return nullptr;
}
/* move everything up */
cell *src = at(index);
cell *dst = at(index + 1);
memmove(dst, src, sizeof(cell)* m_BlockSize * (m_Size - index));
m_Size++;
return src;
}
bool resize(size_t count)
{
if (count <= m_Size)
{
m_Size = count;
return true;
}
if (!GrowIfNeeded(count - m_Size))
{
return false;
}
m_Size = count;
return true;
}
CellArray *clone()
{
CellArray *array = new CellArray(m_BlockSize);
array->m_AllocSize = m_AllocSize;
array->m_Size = m_Size;
array->m_Data = (cell *)malloc(sizeof(cell)* m_BlockSize * m_AllocSize);
if (!array->m_Data)
{
delete array;
return nullptr;
}
memcpy(array->m_Data, m_Data, sizeof(cell)* m_BlockSize * m_Size);
return array;
}
cell *base()
{
return m_Data;
}
size_t mem_usage()
{
return m_AllocSize * m_BlockSize * sizeof(cell);
}
private:
bool GrowIfNeeded(size_t count)
{
/* Shortcut out if we can store this */
if (m_Size + count <= m_AllocSize)
{
return true;
}
/* Set a base allocation size of 8 items */
if (!m_AllocSize)
{
m_AllocSize = m_BaseSize;
}
/* If it's not enough, keep doubling */
while (m_Size + count > m_AllocSize)
{
m_AllocSize *= 2;
}
/* finally, allocate the new block */
if (m_Data)
{
m_Data = (cell *)realloc(m_Data, sizeof(cell)* m_BlockSize * m_AllocSize);
}
else {
m_Data = (cell *)malloc(sizeof(cell)* m_BlockSize * m_AllocSize);
}
return (m_Data != NULL);
}
private:
cell *m_Data;
size_t m_BlockSize;
size_t m_AllocSize;
size_t m_BaseSize;
size_t m_Size;
};
extern NativeHandle<CellArray> ArrayHandles;
#endif

View File

@ -1,42 +1,16 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#include "amxmodx.h"
#include "debugger.h"
#include "binlog.h"
#if !defined WIN32 && !defined _WIN32
#define _snprintf snprintf
#endif
/**
* AMX Mod X Debugging Engine
* Written by David "BAILOPAN" Anderson
@ -285,11 +259,11 @@ void Debugger::BeginExec()
m_Top++;
assert(m_Top >= 0);
if (m_Top >= (int)m_pCalls.size())
if (m_Top >= (int)m_pCalls.length())
{
Tracer *pTracer = new Tracer();
m_pCalls.push_back(pTracer);
assert(m_Top == (m_pCalls.size() - 1));
m_pCalls.append(pTracer);
assert(m_Top == static_cast<int>(m_pCalls.length() - 1));
}
m_pCalls[m_Top]->Reset();
@ -297,7 +271,7 @@ void Debugger::BeginExec()
void Debugger::EndExec()
{
assert(m_Top >= 0 && m_Top < (int)m_pCalls.size());
assert(m_Top >= 0 && m_Top < (int)m_pCalls.length());
m_pCalls[m_Top]->Reset();
@ -306,7 +280,7 @@ void Debugger::EndExec()
void Debugger::StepI()
{
assert(m_Top >= 0 && m_Top < (int)m_pCalls.size());
assert(m_Top >= 0 && m_Top < (int)m_pCalls.length());
#if defined BINLOG_ENABLED
if (g_binlog_level & 32)
@ -332,21 +306,21 @@ void Debugger::Reset()
int Debugger::GetTracedError()
{
assert(m_Top >= 0 && m_Top < (int)m_pCalls.size());
assert(m_Top >= 0 && m_Top < (int)m_pCalls.length());
return m_pCalls[m_Top]->m_Error;
}
void Debugger::SetTracedError(int error)
{
assert(m_Top >= 0 && m_Top < (int)m_pCalls.size());
assert(m_Top >= 0 && m_Top < (int)m_pCalls.length());
m_pCalls[m_Top]->m_Error = error;
}
trace_info_t *Debugger::GetTraceStart() const
{
assert(m_Top >= 0 && m_Top < (int)m_pCalls.size());
assert(m_Top >= 0 && m_Top < (int)m_pCalls.length());
return m_pCalls[m_Top]->GetEnd();
}
@ -372,7 +346,7 @@ trace_info_t *Debugger::GetNextTrace(trace_info_t *pTraceInfo)
bool Debugger::ErrorExists()
{
assert(m_Top >= 0 && m_Top < (int)m_pCalls.size());
assert(m_Top >= 0 && m_Top < (int)m_pCalls.length());
return (m_pCalls[m_Top]->m_Error != AMX_ERR_NONE);
}
@ -382,7 +356,7 @@ int Debugger::FormatError(char *buffer, size_t maxLength)
if (!ErrorExists())
return -1;
assert(m_Top >= 0 && m_Top < (int)m_pCalls.size());
assert(m_Top >= 0 && m_Top < (int)m_pCalls.length());
Tracer *pTracer = m_pCalls[m_Top];
int error = pTracer->m_Error;
@ -391,9 +365,9 @@ int Debugger::FormatError(char *buffer, size_t maxLength)
//trace_info_t *pTrace = pTracer->GetEnd();
//cell cip = _CipAsVa(m_pAmx->cip);
//cell *p_cip = NULL;
int amx_err = AMX_ERR_NONE;
//int amx_err = AMX_ERR_NONE;
size += _snprintf(buffer, maxLength, "Run time error %d: %s ", error, gen_err);
size += ke::SafeSprintf(buffer, maxLength, "Run time error %d: %s ", error, gen_err);
buffer += size;
maxLength -= size;
@ -410,13 +384,13 @@ int Debugger::FormatError(char *buffer, size_t maxLength)
}*/
//New code only requires this...
num = (int)(_INT_PTR)m_pAmx->usertags[UT_NATIVE];
amx_err = amx_GetNative(m_pAmx, num, native_name);
/*amx_err = */amx_GetNative(m_pAmx, num, native_name);
/*if (num)
amx_err = amx_GetNative(m_pAmx, (int)*p_cip, native_name);
else
amx_err = AMX_ERR_NOTFOUND;*/
//if (!amx_err)
size += _snprintf(buffer, maxLength, "(native \"%s\")", native_name);
size += ke::SafeSprintf(buffer, maxLength, "(native \"%s\")", native_name);
}
return size;
@ -547,8 +521,10 @@ int AMXAPI Debugger::DebugHook(AMX *amx)
void Debugger::Clear()
{
for (size_t i=0; i<m_pCalls.size(); i++)
delete m_pCalls[i];
for (size_t i = 0; i < m_pCalls.length(); i++)
{
delete m_pCalls[i];
}
m_pCalls.clear();
}
@ -559,12 +535,17 @@ void Debugger::DisplayTrace(const char *message)
AMXXLOG_Error("%s", message);
char buffer[512];
FormatError(buffer, sizeof(buffer)-1);
int length = FormatError(buffer, sizeof(buffer)-1);
const char *filename = _GetFilename();
const char *version = _GetVersion();
AMXXLOG_Error("[AMXX] Displaying debug trace (plugin \"%s\")", filename);
AMXXLOG_Error("[AMXX] %s", buffer);
AMXXLOG_Error("[AMXX] Displaying debug trace (plugin \"%s\", version \"%s\")", filename, version);
if (length != -1) // Don't show blank line if AMX_ERR_NONE is set since there is no error message.
{
AMXXLOG_Error("[AMXX] %s", buffer);
}
int count = 0;
long lLine;
@ -587,51 +568,76 @@ void Debugger::DisplayTrace(const char *message)
const char *Debugger::_GetFilename()
{
if (m_FileName.size() < 1)
{
const char *filename = "";
CPluginMngr::CPlugin *pl = g_plugins.findPluginFast(m_pAmx);
if (pl)
{
filename = pl->getName();
} else {
CList<CScript,AMX*>::iterator a = g_loadedscripts.find(m_pAmx);
if (a)
filename = (*a).getName();
}
m_FileName.assign(filename);
}
if (m_FileName.length() < 1)
{
CPluginMngr::CPlugin *pl = g_plugins.findPluginFast(m_pAmx);
if (pl)
{
m_FileName = pl->getName();
}
else
{
for (auto script : g_loadedscripts)
{
if (script->getAMX() == m_pAmx)
{
m_FileName = script->getName();
break;
}
}
}
}
return m_FileName.chars();
}
return m_FileName.c_str();
const char *Debugger::_GetVersion()
{
if (m_Version.length() < 1)
{
const char *version = "";
CPluginMngr::CPlugin *pl = g_plugins.findPluginFast(m_pAmx);
if (pl)
{
version = pl->getVersion();
}
m_Version = version;
}
return m_Version.chars();
}
void Debugger::FmtGenericMsg(AMX *amx, int error, char buffer[], size_t maxLength)
{
const char *filename = "";
char native[sNAMEMAX+1];
const char *filename = "";
char native[sNAMEMAX+1];
for (auto script : g_loadedscripts)
{
if (script->getAMX() == amx)
{
filename = script->getName();
break;
}
}
size_t len = strlen(filename);
for (size_t i=len-1; i<len; i--)
{
if ((filename[i] == '/' || filename[i] == '\\') && i != len - 1)
{
filename = &(filename[i+1]);
break;
}
}
CList<CScript,AMX*>::iterator a = g_loadedscripts.find(amx);
if (a)
filename = (*a).getName();
size_t len = strlen(filename);
for (size_t i=len-1; i>=0; i--)
{
if (filename[i] == '/' || filename[i] == '\\' && i != len - 1)
{
filename = &(filename[i+1]);
break;
}
}
if (error == AMX_ERR_EXIT)
{
_snprintf(buffer, maxLength, "Run time error %d (plugin \"%s\") - %s", error, filename, GenericError(AMX_ERR_EXIT));
} else if (error == AMX_ERR_NATIVE) {
amx_GetNative(amx, reinterpret_cast<long>(amx->usertags[UT_NATIVE]), native);
_snprintf(buffer, maxLength, "Run time error %d (plugin \"%s\") (native \"%s\") - debug not enabled!", error, filename, native);
} else {
_snprintf(buffer, maxLength, "Run time error %d (plugin \"%s\") - debug not enabled!", error, filename);
}
if (error == AMX_ERR_EXIT)
{
ke::SafeSprintf(buffer, maxLength, "Run time error %d (plugin \"%s\") - %s", error, filename, GenericError(AMX_ERR_EXIT));
} else if (error == AMX_ERR_NATIVE) {
amx_GetNative(amx, reinterpret_cast<long>(amx->usertags[UT_NATIVE]), native);
ke::SafeSprintf(buffer, maxLength, "Run time error %d (plugin \"%s\") (native \"%s\") - debug not enabled!", error, filename, native);
} else {
ke::SafeSprintf(buffer, maxLength, "Run time error %d (plugin \"%s\") - debug not enabled!", error, filename);
}
}
void Debugger::GenericMessage(AMX *amx, int err)
@ -691,17 +697,17 @@ int Handler::SetNativeFilter(const char *function)
void Handler::SetErrorMsg(const char *msg)
{
if (!msg)
m_MsgCache.clear();
m_MsgCache = nullptr;
else
m_MsgCache.assign(msg);
m_MsgCache = msg;
}
const char *Handler::GetLastMsg()
{
if (m_MsgCache.size() < 1)
if (m_MsgCache.length() < 1)
return NULL;
return m_MsgCache.c_str();
return m_MsgCache.chars();
}
int Handler::HandleModule(const char *module, bool isClass)
@ -722,7 +728,7 @@ int Handler::HandleModule(const char *module, bool isClass)
m_pAmx->flags |= AMX_FLAG_PRENIT;
amx_Push(m_pAmx, isClass ? 1 : 0);
amx_PushString(m_pAmx, &hea_addr, &phys_addr, module, 0, 0);
int err = amx_Exec(m_pAmx, &retval, m_iModFunc);
int err = amx_ExecPerf(m_pAmx, &retval, m_iModFunc);
amx_Release(m_pAmx, hea_addr);
m_pAmx->flags &= ~AMX_FLAG_PRENIT;
@ -762,7 +768,7 @@ int Handler::HandleNative(const char *native, int index, int trap)
amx_Push(m_pAmx, trap);
amx_Push(m_pAmx, index);
amx_PushString(m_pAmx, &hea_addr, &phys_addr, native, 0, 0);
int err = amx_Exec(m_pAmx, &retval, m_iNatFunc);
int err = amx_ExecPerf(m_pAmx, &retval, m_iNatFunc);
if (err != AMX_ERR_NONE)
{
//LogError() took care of something for us.
@ -808,8 +814,8 @@ int Handler::HandleError(const char *msg)
return 0;
m_Handling = true;
m_pTrace = NULL;
m_FmtCache.clear();
m_pTrace = nullptr;
m_FmtCache = nullptr;
Debugger *pDebugger = (Debugger *)m_pAmx->userdata[UD_DEBUGGER];
@ -821,11 +827,11 @@ int Handler::HandleError(const char *msg)
pDebugger->SetTracedError(error);
m_pTrace = pDebugger->GetTraceStart();
pDebugger->FormatError(_buffer, sizeof(_buffer)-1);
m_FmtCache.assign(_buffer);
m_FmtCache = _buffer;
pDebugger->BeginExec();
} else {
Debugger::FmtGenericMsg(m_pAmx, error, _buffer, sizeof(_buffer)-1);
m_FmtCache.assign(_buffer);
m_FmtCache = _buffer;
}
SetErrorMsg(msg);
@ -835,7 +841,7 @@ int Handler::HandleError(const char *msg)
amx_PushString(m_pAmx, &hea_addr, &phys_addr, msg, 0, 0);
amx_Push(m_pAmx, pDebugger ? 1 : 0);
amx_Push(m_pAmx, error);
int err = amx_Exec(m_pAmx, &result, m_iErrFunc);
int err = amx_ExecPerf(m_pAmx, &result, m_iErrFunc);
if (err != AMX_ERR_NONE)
{
//handle this manually.
@ -857,8 +863,8 @@ int Handler::HandleError(const char *msg)
amx_Release(m_pAmx, hea_addr);
m_Handling = false;
m_pTrace = NULL;
m_FmtCache.clear();
m_pTrace = nullptr;
m_FmtCache = nullptr;
if (err != AMX_ERR_NONE || !result)
return 0;

View File

@ -1,38 +1,15 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#ifndef _INCLUDE_DEBUGGER_H_
#define _INCLUDE_DEBUGGER_H_
#include "CVector.h"
#include "amxdbg.h"
/**
@ -138,15 +115,17 @@ private:
cell _CipAsVa(cell cip);
const char *_GetFilename();
const char *_GetVersion();
public:
AMX *m_pAmx;
AMX_DBG *m_pAmxDbg;
int m_Top;
cell *m_pOpcodeList;
String m_FileName;
ke::AString m_FileName;
ke::AString m_Version;
CVector<Tracer *> m_pCalls;
ke::Vector<Tracer *> m_pCalls;
};
typedef Debugger::Tracer::trace_info trace_info_t;
@ -174,9 +153,9 @@ public:
const char *GetLastMsg();
trace_info_t *GetTrace() const { return m_pTrace; }
const char *GetFmtCache() { return m_FmtCache.c_str(); }
const char *GetFmtCache() { return m_FmtCache.chars(); }
bool IsNativeFiltering() { return (m_iNatFunc > 0); }
bool IsNativeFiltering() { return (m_iNatFunc > -1); }
bool InNativeFilter() { return m_InNativeFilter; }
private:
AMX *m_pAmx;
@ -190,8 +169,8 @@ private:
//in the future, make this a stack!
bool m_InNativeFilter;
String m_MsgCache;
String m_FmtCache;
ke::AString m_MsgCache;
ke::AString m_FmtCache;
trace_info_t *m_pTrace;
};

View File

@ -1,35 +1,14 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
* originally developed by OLO
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#include "amxmodx.h"
#include "CMenu.h"
int gmsgAmmoPickup;
int gmsgAmmoX;
@ -51,6 +30,8 @@ int gmsgWeaponList;
int gmsgintermission;
int gmsgResetHUD;
int gmsgRoundTime;
int gmsgSayText;
int gmsgInitHUD;
TeamIds g_teamsIds;
WeaponsVault g_weaponsData[MAX_WEAPONS];
@ -92,9 +73,10 @@ void Client_ShowMenu(void* mValue)
}
}
extern bool g_bmod_tfc;
void Client_TeamInfo(void* mValue)
{
if (mPlayer) return;
if (mPlayer && !g_bmod_tfc) return;
static int index;
switch (mState++)
@ -105,8 +87,48 @@ void Client_TeamInfo(void* mValue)
case 1:
if (index < 1 || index > gpGlobals->maxClients) break;
char* msg = (char*)mValue;
g_players[index].team.assign(msg);
if (!msg) break;
auto pPlayer = GET_PLAYER_POINTER_I(index);
pPlayer->team = msg;
g_teamsIds.registerTeam(msg, -1);
pPlayer->teamId = g_teamsIds.findTeamId(msg);
if (pPlayer->teamId == -1)
{
/**
* CS fix for SPECTATOR team.
* -
* When a player chooses spectator, ScoreInfo is sent before TeamInfo and with 0 as index.
* This means for the first round of first spectator, SPECTATOR name is not associated with its index.
* The following fix manually sets the team index when we hit SPECTATOR team.
*/
if (g_bmod_cstrike && !strcmp(msg, "SPECTATOR"))
{
pPlayer->teamId = 3;
g_teamsIds.registerTeam(msg, 3);
}
/**
* Fixes in-between situation where the team name is not yet associated with a valid index
* and ScoreInfo is executed later (used to retrieve the index). E.g. a player is dead,
* then changes team. Index will return -1 until ScoreInfo is sent, usually at the next spawn.
*/
else if ((g_bmod_cstrike || g_bmod_dod || g_bmod_tfc || g_bmod_gearbox || g_bmod_valve)
&& pPlayer->pEdict->pvPrivateData
&& !pPlayer->IsAlive())
{
GET_OFFSET_NO_ERROR("CBasePlayer", m_iTeam);
const auto teamId = get_pdata<int>(pPlayer->pEdict, m_iTeam);
pPlayer->teamId = teamId;
g_teamsIds.registerTeam(msg, teamId);
}
}
break;
}
}
@ -188,7 +210,7 @@ void Client_WeaponList(void* mValue)
wpnList |= (1<<iId);
g_weaponsData[iId].iId = iId;
g_weaponsData[iId].ammoSlot = iSlot;
g_weaponsData[iId].fullName.assign(wpnName);
g_weaponsData[iId].fullName = wpnName;
}
}
@ -209,9 +231,15 @@ void Client_CurWeapon(void* mValue)
case 2:
if (!mPlayer) return;
if (!iState || (iId < 1 || iId >= MAX_WEAPONS)) break;
mPlayer->weapons[iId].clip = *(int*)mValue;
mPlayer->current = iId;
mPlayer->lastHit = mPlayer->lastTrace;
if (*(int*)mValue < mPlayer->weapons[iId].clip && // Only update the lastHit vector if the clip size is decreasing
*(int*)mValue != -1) // But not if it's a melee weapon
{
mPlayer->lastHit = mPlayer->lastTrace;
}
mPlayer->weapons[iId].clip = *(int*)mValue;
}
}
@ -268,7 +296,7 @@ void Client_ScoreInfo(void* mValue)
pPlayer->deaths = deaths;
pPlayer->teamId = *(int*)mValue;
if (g_teamsIds.isNewTeam())
g_teamsIds.registerTeam(pPlayer->team.c_str(), pPlayer->teamId);
g_teamsIds.registerTeam(pPlayer->team.chars(), pPlayer->teamId);
}
}
@ -282,7 +310,7 @@ void Client_DamageEnd(void* mValue)
g_events.parseValue(dead->death_killer);
g_events.parseValue(dead->index);
g_events.parseValue(dead->death_headshot);
g_events.parseValue(dead->death_weapon.c_str());
g_events.parseValue(dead->death_weapon.chars());
g_events.parseValue(dead->death_tk ? 1 : 0);
g_events.executeEvents();
dead->death_killer = 0;
@ -313,11 +341,31 @@ void Client_DeathMsg(void* mValue)
case 3:
if (!killer || !victim) break;
victim->death_killer = killer_id;
victim->death_weapon.assign((char*)mValue);
victim->death_weapon = (char*)mValue;
victim->death_headshot = hs;
victim->death_tk = (killer->teamId == victim->teamId);
}
}
void Client_InitHUDEnd(void* mValue)
{
if (!g_bmod_cstrike)
return;
CPlayer *pPlayer = mPlayer;
if (!pPlayer->teamIdsInitialized && !pPlayer->IsBot())
{
// This creates specific indexes (> maxplayers) for print_chat_color().
// 33 : print_team_grey / spectator
// 34 : print_team_red / terrorist
// 35 : print_team_blue / ct
UTIL_TeamInfo(pPlayer->pEdict, 33 + 1, "TERRORIST"); // print_team_red
UTIL_TeamInfo(pPlayer->pEdict, 33 + 2, "CT"); // print_team_blue
pPlayer->teamIdsInitialized = true;
}
}
/*
void Client_SendAudio(void* mValue)
{

View File

@ -1,32 +1,11 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#include "amxmodx.h"
#include "fakemeta.h"

View File

@ -1,32 +1,11 @@
/* AMX Mod X
*
* by the AMX Mod X Development Team
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*/
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#ifndef __FAKEMETA_H__
#define __FAKEMETA_H__

File diff suppressed because it is too large Load Diff

View File

@ -20,7 +20,7 @@
#include <stdlib.h> /* for atof() */
#include <stdio.h> /* for NULL */
#include <assert.h>
#include <math.h>
#include <cmath>
// this file does not include amxmodx.h, so we have to include the memory manager here
#ifdef MEMORY_TEST

View File

@ -1,6 +1,15 @@
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#include "amxmodx.h"
#include "format.h"
#include "amxmod_compat.h"
#include "datastructs.h"
//Adapted from Quake3's vsprintf
// thanks to cybermind for linking me to this :)
@ -18,6 +27,7 @@
#define SHORTINT 0x00000040 /* short integer */
#define ZEROPAD 0x00000080 /* zero (as opposed to blank) pad */
#define FPT 0x00000100 /* floating point number */
#define UPPERDIGITS 0x00000200 /* make alpha digits uppercase */
#define to_digit(c) ((c) - '0')
#define is_digit(c) ((unsigned)to_digit(c) <= 9)
#define to_char(n) ((n) + '0')
@ -27,58 +37,85 @@
return 0; \
}
THash<String, lang_err> BadLang_Table;
template size_t atcprintf<cell, cell>(cell *, size_t, const cell *, AMX *, cell *, int *);
template size_t atcprintf<char, cell>(char *, size_t, const cell *, AMX *, cell *, int *);
template size_t atcprintf<cell, char>(cell *, size_t, const char *, AMX *, cell *, int *);
template size_t atcprintf<char, char>(char *, size_t, const char *, AMX *, cell *, int *);
static cvar_t *amx_mldebug = NULL;
static cvar_t *amx_cl_langs = NULL;
THash<ke::AString, lang_err> BadLang_Table;
const char *translate(AMX *amx, cell amxaddr, const char *key)
static cvar_t *amx_mldebug = nullptr;
static cvar_t *amx_cl_langs = nullptr;
const char *playerlang(const cell index)
{
const char *pLangName = NULL;
const char *def = NULL;
int status;
cell *addr = get_amxaddr(amx, amxaddr);
char name[4];
if (addr[0] == LANG_PLAYER)
const char *pLangName = nullptr;
if (index == LANG_PLAYER)
{
if (!amx_cl_langs)
amx_cl_langs = CVAR_GET_POINTER("amx_client_languages");
if ( (int)amx_cl_langs->value == 0 )
{
pLangName = g_vault.get("server_language");
} else {
amx_cl_langs = CVAR_GET_POINTER("amx_client_languages");
}
if (static_cast<int>(amx_cl_langs->value) == 0)
{
pLangName = amxmodx_language->string;
}
else
{
pLangName = ENTITY_KEYVALUE(GET_PLAYER_POINTER_I(g_langMngr.GetDefLang())->pEdict, "lang");
}
} else if (addr[0] == LANG_SERVER) {
pLangName = g_vault.get("server_language");
} else if (addr[0] >= 1 && addr[0] <= gpGlobals->maxClients) {
if (!amx_cl_langs)
amx_cl_langs = CVAR_GET_POINTER("amx_client_languages");
if ( (int)amx_cl_langs->value == 0 )
{
pLangName = g_vault.get("server_language");
} else {
pLangName = ENTITY_KEYVALUE(GET_PLAYER_POINTER_I(addr[0])->pEdict, "lang");
}
} else {
get_amxstring_r(amx, amxaddr, name, 3);
pLangName = name;
}
else if (index == LANG_SERVER)
{
pLangName = amxmodx_language->string;
}
else if (index >= 1 && index <= gpGlobals->maxClients)
{
if (!amx_cl_langs)
{
amx_cl_langs = CVAR_GET_POINTER("amx_client_languages");
}
if (static_cast<int>(amx_cl_langs->value) == 0)
{
pLangName = amxmodx_language->string;
}
else
{
pLangName = ENTITY_KEYVALUE(GET_PLAYER_POINTER_I(index)->pEdict, "lang");
}
}
return pLangName;
}
const char *translate(AMX *amx, const char *lang, const char *key)
{
auto pLangName = lang;
int status;
if (!pLangName || !isalpha(pLangName[0]))
pLangName = "en";
//next parameter!
def = g_langMngr.GetDef(pLangName, key, status);
{
pLangName = amxmodx_language->string;
}
auto def = g_langMngr.GetDef(pLangName, key, status);
if (!amx_mldebug)
{
amx_mldebug = CVAR_GET_POINTER("amx_mldebug");
}
bool debug = (amx_mldebug && amx_mldebug->string && (amx_mldebug->string[0] != '\0'));
auto debug = (amx_mldebug && amx_mldebug->string && (amx_mldebug->string[0] != '\0'));
if (debug)
{
int debug_status;
bool validlang = true;
const char *testlang = amx_mldebug->string;
auto validlang = true;
auto testlang = amx_mldebug->string;
if (!g_langMngr.LangExists(testlang))
{
AMXXLOG_Error("[AMXX] \"%s\" is an invalid debug language", testlang);
@ -88,36 +125,46 @@ const char *translate(AMX *amx, cell amxaddr, const char *key)
g_langMngr.GetDef(testlang, key, debug_status);
if (validlang && debug_status == ERR_BADKEY)
{
AMXXLOG_Error("[AMXX] Language key \"%s\" not found for language \"%s\", check \"%s\"", key, testlang, GetFileName(amx));
}
}
if (def == NULL)
if (!def)
{
if (debug)
if (debug && status == ERR_BADLANG)
{
if (status == ERR_BADLANG && (BadLang_Table.AltFindOrInsert(pLangName).last + 120.0f < gpGlobals->time))
ke::AString langName(pLangName);
auto &err = BadLang_Table.AltFindOrInsert(ke::Move(langName));
if (err.last + 120.0f < gpGlobals->time)
{
AMXXLOG_Error("[AMXX] Language \"%s\" not found", pLangName);
BadLang_Table.AltFindOrInsert(pLangName).last = gpGlobals->time;
err.last = gpGlobals->time;
}
}
if (addr[0] != LANG_SERVER)
def = g_langMngr.GetDef(g_vault.get("server_language"), key, status);
if (strcmp(pLangName, amxmodx_language->string) != 0)
{
def = g_langMngr.GetDef(amxmodx_language->string, key, status);
}
if (!def && (strcmp(pLangName, "en") != 0 && strcmp(g_vault.get("server_language"), "en") != 0))
if (!def && (strcmp(pLangName, "en") != 0 && strcmp(amxmodx_language->string, "en") != 0))
{
def = g_langMngr.GetDef("en", key, status);
}
}
return def;
}
template <typename U>
void AddString(U **buf_p, size_t &maxlen, const cell *string, int width, int prec)
template <typename U, typename S>
void AddString(U **buf_p, size_t &maxlen, const S *string, int width, int prec)
{
int size = 0;
U *buf;
static cell nlstr[] = {'(','n','u','l','l',')','\0'};
static S nlstr[] = {'(','n','u','l','l',')','\0'};
buf = *buf_p;
@ -142,6 +189,12 @@ void AddString(U **buf_p, size_t &maxlen, const cell *string, int width, int pre
if (size > (int)maxlen)
size = maxlen;
/* If precision is provided, make sure we don't truncate a multi-byte character */
if (prec >= size && (string[size - 1] & 1 << 7))
{
size -= UTIL_CheckValidChar((cell *)string + size - 1);
}
maxlen -= size;
width -= size;
@ -158,71 +211,177 @@ void AddString(U **buf_p, size_t &maxlen, const cell *string, int width, int pre
}
template <typename U>
void AddFloat(U **buf_p, size_t &maxlen, double fval, int width, int prec)
void AddFloat(U **buf_p, size_t &maxlen, double fval, int width, int prec, int flags)
{
U text[32];
int digits;
double signedVal;
U *buf;
int val;
int digits; // non-fraction part digits
double tmp; // temporary
U *buf = *buf_p; // output buffer pointer
int val; // temporary
int sign = 0; // 0: positive, 1: negative
int fieldlength; // for padding
int significant_digits = 0; // number of significant digits written
const int MAX_SIGNIFICANT_DIGITS = 16;
// default precision
if (prec < 0)
{
prec = 6;
}
// get the sign
signedVal = fval;
if (fval < 0)
{
fval = -fval;
sign = 1;
}
// compute whole-part digits count
digits = (int)log10(fval) + 1;
// Only print 0.something if 0 < fval < 1
if (digits < 1)
{
digits = 1;
}
// compute the field length
fieldlength = digits + prec + ((prec > 0) ? 1 : 0) + sign;
// minus sign BEFORE left padding if padding with zeros
if (sign && maxlen && (flags & ZEROPAD))
{
*buf++ = '-';
maxlen--;
}
// right justify if required
if ((flags & LADJUST) == 0)
{
while ((fieldlength < width) && maxlen)
{
*buf++ = (flags & ZEROPAD) ? '0' : ' ';
width--;
maxlen--;
}
}
// minus sign AFTER left padding if padding with spaces
if (sign && maxlen && !(flags & ZEROPAD))
{
*buf++ = '-';
maxlen--;
}
// write the whole part
tmp = pow(10.0, digits-1);
while ((digits--) && maxlen)
{
if (++significant_digits > MAX_SIGNIFICANT_DIGITS)
{
*buf++ = '0';
}
else
{
val = (int)(fval / tmp);
*buf++ = '0' + val;
fval -= val * tmp;
tmp *= 0.1;
}
maxlen--;
}
// write the fraction part
if (maxlen && prec)
{
*buf++ = '.';
maxlen--;
}
tmp = pow(10.0, prec);
fval *= tmp;
while (prec-- && maxlen)
{
if (++significant_digits > MAX_SIGNIFICANT_DIGITS)
{
*buf++ = '0';
}
else
{
tmp *= 0.1;
val = (int)(fval / tmp);
*buf++ = '0' + val;
fval -= val * tmp;
}
maxlen--;
}
// left justify if required
if (flags & LADJUST)
{
while ((fieldlength < width) && maxlen)
{
// right-padding only with spaces, ZEROPAD is ignored
*buf++ = ' ';
width--;
maxlen--;
}
}
// update parent's buffer pointer
*buf_p = buf;
}
template <typename U>
void AddBinary(U **buf_p, size_t &maxlen, unsigned int val, int width, int flags)
{
char text[32];
int digits;
U *buf;
// write the float number
digits = 0;
val = (int)fval;
do {
text[digits++] = '0' + val % 10;
val /= 10;
do
{
if (val & 1)
{
text[digits++] = '1';
}
else
{
text[digits++] = '0';
}
val >>= 1;
} while (val);
if (signedVal < 0)
text[digits++] = '-';
buf = *buf_p;
while (digits < width && maxlen)
if (!(flags & LADJUST))
{
*buf++ = ' ';
width--;
maxlen--;
while (digits < width && maxlen)
{
*buf++ = (flags & ZEROPAD) ? '0' : ' ';
width--;
maxlen--;
}
}
while (digits-- && maxlen)
{
*buf++ = text[digits];
width--;
maxlen--;
}
if (flags & LADJUST)
{
while (width-- && maxlen)
{
*buf++ = (flags & ZEROPAD) ? '0' : ' ';
maxlen--;
}
}
*buf_p = buf;
if (prec < 0)
prec = 6;
// write the fraction
digits = 0;
while (digits < prec)
{
fval -= (int) fval;
fval *= 10.0;
val = (int) fval;
text[digits++] = '0' + val % 10;
}
if (digits > 0 && maxlen)
{
buf = *buf_p;
*buf++ = '.';
maxlen--;
for (prec = 0; maxlen && prec < digits; prec++)
{
*buf++ = text[prec];
maxlen--;
}
*buf_p = buf;
}
}
template <typename U>
@ -326,6 +485,66 @@ void AddInt(U **buf_p, size_t &maxlen, int val, int width, int flags)
*buf_p = buf;
}
template <typename U>
void AddHex(U **buf_p, size_t &maxlen, unsigned int val, int width, int flags)
{
U text[32];
int digits;
U *buf;
U digit;
int hexadjust;
if (flags & UPPERDIGITS)
{
hexadjust = 'A' - '9' - 1;
} else {
hexadjust = 'a' - '9' - 1;
}
digits = 0;
do
{
digit = ('0' + val % 16);
if (digit > '9')
{
digit += hexadjust;
}
text[digits++] = digit;
val /= 16;
} while (val);
buf = *buf_p;
if( !(flags & LADJUST) )
{
while (digits < width && maxlen)
{
*buf++ = (flags & ZEROPAD) ? '0' : ' ';
width--;
maxlen--;
}
}
while (digits-- && maxlen)
{
*buf++ = text[digits];
width--;
maxlen--;
}
if (flags & LADJUST)
{
while (width-- && maxlen)
{
*buf++ = (flags & ZEROPAD) ? '0' : ' ';
maxlen--;
}
}
*buf_p = buf;
}
template <typename D, typename S>
size_t atcprintf(D *buffer, size_t maxlen, const S *format, AMX *amx, cell *params, int *param)
{
@ -337,7 +556,7 @@ size_t atcprintf(D *buffer, size_t maxlen, const S *format, AMX *amx, cell *para
int width;
int prec;
int n;
char sign;
//char sign;
const S *fmt;
size_t llen = maxlen;
@ -365,7 +584,7 @@ size_t atcprintf(D *buffer, size_t maxlen, const S *format, AMX *amx, cell *para
flags = 0;
width = 0;
prec = -1;
sign = '\0';
//sign = '\0';
rflag:
ch = static_cast<D>(*fmt++);
@ -403,6 +622,12 @@ reswitch:
case 'c':
CHECK_ARGS(0);
*buf_p++ = static_cast<D>(*get_amxaddr(amx, params[arg]));
llen--;
arg++;
break;
case 'b':
CHECK_ARGS(0);
AddBinary(&buf_p, llen, *get_amxaddr(amx, params[arg]), width, flags);
arg++;
break;
case 'd':
@ -418,43 +643,64 @@ reswitch:
break;
case 'f':
CHECK_ARGS(0);
AddFloat(&buf_p, llen, amx_ctof(*get_amxaddr(amx, params[arg])), width, prec);
AddFloat(&buf_p, llen, amx_ctof(*get_amxaddr(amx, params[arg])), width, prec, flags);
arg++;
break;
case 'X':
CHECK_ARGS(0);
flags |= UPPERDIGITS;
AddHex(&buf_p, llen, static_cast<unsigned int>(*get_amxaddr(amx, params[arg])), width, flags);
arg++;
break;
case 'x':
CHECK_ARGS(0);
AddHex(&buf_p, llen, static_cast<unsigned int>(*get_amxaddr(amx, params[arg])), width, flags);
arg++;
break;
case 'a':
{
CHECK_ARGS(0);
// %a is passed a pointer directly to a cell string.
cell* ptr=reinterpret_cast<cell*>(*get_amxaddr(amx, params[arg]));
if (!ptr)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid vector string handle provided (%d)", *get_amxaddr(amx, params[arg]));
return 0;
}
AddString(&buf_p, llen, ptr, width, prec);
arg++;
break;
}
case 's':
CHECK_ARGS(0);
if (amx->flags & AMX_FLAG_OLDFILE)
{
cell *addr = get_amxaddr(amx, params[arg]);
if (*addr & BCOMPAT_TRANSLATE_BITS)
{
const char *key, *def;
if (!translate_bcompat(amx, addr, &key, &def))
{
goto break_to_normal_string;
}
arg++;
size_t written = atcprintf(buf_p, llen, def, amx, params, &arg);
buf_p += written;
llen -= written;
break;
}
}
break_to_normal_string:
AddString(&buf_p, llen, get_amxaddr(amx, params[arg]), width, prec);
arg++;
break;
case 'L':
case 'l':
{
CHECK_ARGS(1);
cell addr = params[arg++];
const char *lang;
int len;
if (ch == 'L')
{
CHECK_ARGS(1);
auto currParam = params[arg++];
lang = playerlang(*get_amxaddr(amx, currParam));
if (!lang)
lang = get_amxstring(amx, currParam, 2, len);
}
else
{
CHECK_ARGS(0);
lang = playerlang(g_langMngr.GetDefLang());
}
const char *key = get_amxstring(amx, params[arg++], 3, len);
const char *def = translate(amx, addr, key);
const char *def = translate(amx, lang, key);
if (!def)
{
static char buf[255];
snprintf(buf, sizeof(buf)-1, "ML_NOTFOUND: %s", key);
ke::SafeSprintf(buf, sizeof(buf), "ML_NOTFOUND: %s", key);
def = buf;
}
size_t written = atcprintf(buf_p, llen, def, amx, params, &arg);
@ -462,6 +708,72 @@ break_to_normal_string:
llen -= written;
break;
}
case 'N':
{
CHECK_ARGS(0);
cell *addr = get_amxaddr(amx, params[arg]);
char buffer[255];
if (*addr)
{
CPlayer *player = NULL;
if (*addr >= 1 && *addr <= gpGlobals->maxClients)
{
player = GET_PLAYER_POINTER_I(*addr);
}
if (!player || !player->initialized)
{
LogError(amx, AMX_ERR_NATIVE, "Client index %d is invalid", *addr);
return 0;
}
const char *auth = GETPLAYERAUTHID(player->pEdict);
if (!auth || auth[0] == '\0')
{
auth = "STEAM_ID_PENDING";
}
int userid = GETPLAYERUSERID(player->pEdict);
ke::SafeSprintf(buffer, sizeof(buffer), "%s<%d><%s><%s>", player->name.chars(), userid, auth, player->team.chars());
}
else
{
ke::SafeSprintf(buffer, sizeof(buffer), "Console<0><Console><Console>");
}
AddString(&buf_p, llen, buffer, width, prec);
arg++;
break;
}
case 'n':
{
CHECK_ARGS(0);
cell *addr = get_amxaddr(amx, params[arg]);
const char *name = "Console";
if (*addr)
{
CPlayer *player = NULL;
if (*addr >= 1 && *addr <= gpGlobals->maxClients)
{
player = GET_PLAYER_POINTER_I(*addr);
}
if (!player || !player->initialized)
{
LogError(amx, AMX_ERR_NATIVE, "Client index %d is invalid", *addr);
return 0;
}
name = player->name.chars();
}
AddString(&buf_p, llen, name, width, prec);
arg++;
break;
}
case '%':
*buf_p++ = static_cast<D>(ch);
if (!llen)
@ -487,6 +799,14 @@ break_to_normal_string:
done:
*buf_p = static_cast<D>(0);
*param = arg;
/* if max buffer length consumed, make sure we don't truncate a multi-byte character */
if (llen <= 0 && *(buf_p - 1) & 1 << 7)
{
llen += UTIL_CheckValidChar(buf_p - 1);
*(buf_p - llen) = static_cast<D>(0);
}
return maxlen-llen;
}

View File

@ -1,3 +1,12 @@
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#ifndef _INCLUDE_FORMATTING_H
#define _INCLUDE_FORMATTING_H
@ -5,7 +14,7 @@
template <typename D, typename S>
size_t atcprintf(D *buffer, size_t maxlen, const S *format, AMX *amx, cell *params, int *param);
const char *translate(AMX *amx, cell amxaddr, const char *key);
bool translate_bcompat(AMX *amx, cell *source, const char **_key, const char **_def);
const char *playerlang(const cell index);
const char *translate(AMX *amx, const char *lang, const char *key);
#endif //_INCLUDE_FORMATTING_H

175
amxmodx/gameconfigs.cpp Normal file
View File

@ -0,0 +1,175 @@
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#include "gameconfigs.h"
#include "amxmodx.h"
#include "CGameConfigs.h"
NativeHandle<GameConfigNative> GameConfigHandle;
// native GameConfig:LoadGameConfigFile(const file[]);
static cell AMX_NATIVE_CALL LoadGameConfigFile(AMX *amx, cell *params)
{
int length;
const char *filename = get_amxstring(amx, params[1], 0, length);
IGameConfig *config = nullptr;
char error[128];
if (!ConfigManager.LoadGameConfigFile(filename, &config, error, sizeof(error)))
{
ConfigManager.CloseGameConfigFile(config);
LogError(amx, AMX_ERR_NATIVE, "Unable to open %s: %s", filename, error);
return 0;
}
int handle = GameConfigHandle.create();
auto configHandle = GameConfigHandle.lookup(handle);
if (!configHandle)
{
return 0;
}
configHandle->m_config = config;
return handle;
}
// native GameConfGetOffset(GameConfig:handle, const key[]);
static cell AMX_NATIVE_CALL GameConfGetOffset(AMX *amx, cell *params)
{
GameConfigNative *handle = GameConfigHandle.lookup(params[1]);
if (!handle)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid game config handle %d", params[1]);
return 0;
}
int length;
TypeDescription value;
const char *key = get_amxstring(amx, params[2], 0, length);
if (!handle->m_config->GetOffset(key, &value))
{
return -1;
}
return value.fieldOffset;
}
// native GameConfGetClassOffset(GameConfig:handle, const classname[], const key[]);
static cell AMX_NATIVE_CALL GameConfGetClassOffset(AMX *amx, cell *params)
{
GameConfigNative *handle = GameConfigHandle.lookup(params[1]);
if (!handle)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid game config handle %d", params[1]);
return 0;
}
int length;
TypeDescription value;
const char *classname = get_amxstring(amx, params[2], 0, length);
const char *key = get_amxstring(amx, params[3], 1, length);
if (!handle->m_config->GetOffsetByClass(classname, key, &value))
{
return -1;
}
return value.fieldOffset;
}
// native bool:GameConfGetKeyValue(GameConfig:handle, const key[], buffer[], maxlen);
static cell AMX_NATIVE_CALL GameConfGetKeyValue(AMX *amx, cell *params)
{
GameConfigNative *handle = GameConfigHandle.lookup(params[1]);
if (!handle)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid game config handle %d", params[1]);
return 0;
}
int length;
const char *value;
const char *key = get_amxstring(amx, params[2], 0, length);
if (!(value = handle->m_config->GetKeyValue(key)))
{
return 0;
}
set_amxstring_utf8(amx, params[3], value, strlen(value), params[4]);
return 1;
}
// native GameConfGetAddress(GameConfig:handle, const name[]);
static cell AMX_NATIVE_CALL GameConfGetAddress(AMX *amx, cell *params)
{
GameConfigNative *handle = GameConfigHandle.lookup(params[1]);
if (!handle)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid game config handle %d", params[1]);
return 0;
}
int length;
void *value;
const char *key = get_amxstring(amx, params[2], 0, length);
if (!handle->m_config->GetAddress(key, &value))
{
return 0;
}
return reinterpret_cast<cell>(value);
}
// native CloseGameConfigFile(&GameConfig:handle);
static cell AMX_NATIVE_CALL CloseGameConfigFile(AMX *amx, cell *params)
{
cell *address = get_amxaddr(amx, params[1]);
GameConfigNative *handle = GameConfigHandle.lookup(*address);
if (!handle)
{
return 0;
}
if (GameConfigHandle.destroy(*address))
{
*address = 0;
return 1;
}
return 0;
}
AMX_NATIVE_INFO g_GameConfigNatives[] =
{
{ "LoadGameConfigFile" , LoadGameConfigFile },
{ "GameConfGetOffset" , GameConfGetOffset },
{ "GameConfGetClassOffset", GameConfGetClassOffset },
{ "GameConfGetKeyValue" , GameConfGetKeyValue },
{ "GameConfGetAddress" , GameConfGetAddress },
{ "CloseGameConfigFile" , CloseGameConfigFile },
{ nullptr , nullptr }
};

18
amxmodx/gameconfigs.h Normal file
View File

@ -0,0 +1,18 @@
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
#include "IGameConfigs.h"
#include "natives_handles.h"
struct GameConfigNative
{
IGameConfig *m_config;
};
extern NativeHandle<GameConfigNative> GameConfigHandle;

Some files were not shown because too many files have changed in this diff Show More