Compare commits

...

2344 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
rtxa
df6b589ba1
nextmap.sma - Fix mp_chattime getting increased on quick map change (#1044) 2022-06-30 23:16:05 -07:00
Rustam Zigandarov
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
Rustam Zigandarov
49a8b959b3
Update newmenus.inc (#1043) 2022-04-05 00:32:55 -07:00
Unreal Karaulov
ec82e3f34c
now amxmodx can use std (#1026) 2021-12-06 10:38:46 -08:00
Unreal Karaulov
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
Unreal Karaulov
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
Unreal Karaulov
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
Unreal Karaulov
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
Hedel Nasser
e8909c1583
Fixed value check in json_object_set_value (#1015)
Regression from #983
2021-12-02 19:32:04 -08:00
Unreal Karaulov
3cda059669
Fix some errors (#1020)
Fix some critical errors
2021-12-02 13:47:57 -08:00
Harsha Raghu
5dcda02b65
[Build] Implement CI for MacOS via appveyor (#1013) 2021-10-24 17:22:56 -07:00
pizzahut2
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
Adam Richard
2563bf6c26
Updated get_user_flags documentation (#1007) 2021-10-07 17:12:04 -07:00
Harsha Raghu
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
Harsha Raghu
cac80584a0
Setup Github Actions (#1003) 2021-10-05 23:39:38 -07:00
Harsha Raghu
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
pizzahut2
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
Harsha Raghu
8fefd48af2
Create FUNDING.yml and add a ❤️Sponser button (#994) 2021-09-23 10:12:43 -07:00
shel
f37f9d1c66
Fix gcc 9.2 compilation. (#835)
Fix gcc 9.2 compilation.
2021-09-22 17:01:35 -07:00
Daniele386
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
Smilex_Gamer
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
OciXCrom
fb7ab6d08d
Add missing kRenderFx constant (#928)
* Add missing kRenderFx constant

* Change constant name to match SDK
2021-09-17 13:11:17 +02:00
OciXCrom
01e60834fa
Use precache_generic() for sounds that are played client-side (#934) 2021-09-17 13:10:46 +02:00
Franco Romaniello
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
FEDERICOMB
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
Franco Romaniello
51c3f1b195
Fix typo in message_const.inc TE_FIZZ comment (#990) 2021-09-17 13:03:37 +02:00
Harsha Raghu
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
pizzahut2
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
pizzahut2
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
OciXCrom
36d5aa97b1
Add missing set_task_* callback info (#952) 2021-08-07 17:31:18 +02:00
OciXCrom
b8c490b5e6
Fix newmenus.inc documentation (#942) 2021-08-07 17:30:07 +02:00
OciXCrom
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
Fysiks
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
TibyXD
6c9c37eb45
Fixed Romanian translation, and added diacritics (#974) 2021-08-07 17:20:50 +02:00
Fysiks
d88b7e3c98
Change default chat time to 0.0 (#977) 2021-08-07 17:19:38 +02:00
Sergey Shorokhov
6b9d82fa60
Add TIME_ELEMENT_* Romanian language keys in time.txt (#971) 2021-07-26 10:45:55 +02:00
David Anderson
08494d0d66 macOS build fix. 2021-07-11 22:14:16 -07:00
David Anderson
97b03ea567 Another macOS build fix. 2021-07-11 22:10:02 -07:00
David Anderson
344fb3d410 Fix mac build. 2021-07-11 22:08:37 -07:00
David Anderson
37cbccef6a Quell warning on macOS. 2021-07-11 22:08:36 -07:00
David Anderson
7fb6440ce9 Update minimum macOS to 10.7. 2021-07-11 20:55:09 -07:00
David Anderson
1a1b16614a Switch to libc++ on mac. 2021-07-11 20:51:19 -07:00
David Anderson
af32a9790b Switch to Python3 for bootstrapping. 2021-07-11 17:30:38 -07:00
Sergey Shorokhov
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
FEDERICOMB
c58daeafca
Fix stock "SQL_QueryAndIgnore" documentation (#965) 2021-06-19 10:38:25 +02:00
Fysiks
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
Fysiks
3c1856f7af
Add ignore for amxx binaries (#960) 2021-05-06 20:40:48 -07:00
ArKaNeMaN
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
Vincent Herbet
3d517d69e2
Revert "Update meta_api.cpp (#883)" (#950)
This reverts commit 7cb045c688b4774fc6502e01ab7049216e5d3359.
2021-03-12 18:36:40 +01:00
shel
70d1aff519
Revert "Resolve old bot's connection state issues (#917)" (#949)
This reverts commit bee4b47b0767abf9e5643263de0cf5a239ee3dc7.
2021-03-12 18:31:01 +01:00
shel
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
David Anderson
8c6b0f84bb Fix Windows build. 2021-02-10 13:32:02 -08:00
shel
a4e929eedc
Possible memory leaks on deattach (#912)
Co-authored-by: shel <2@shelru.ru>
2020-12-06 12:09:57 -08:00
Franco Romaniello
c81f68aac3
Update cvars.inc (#919) 2020-12-06 12:01:52 -08:00
shel
03f4c7dd2c
Update checkout-deps.sh (#915) 2020-12-06 11:59:11 -08:00
shel
7cb045c688
Update meta_api.cpp (#883)
Fixes: #875
2020-11-22 18:02:53 -08:00
shel
73f3afa95f
push (#911)
Co-authored-by: shel <2@shelru.ru>
2020-11-22 15:43:17 -08:00
shel
2fadf887e6
Return max heap size note (#910)
Co-authored-by: shel <2@shelru.ru>
2020-11-22 15:12:54 -08:00
WildCard65
1027df054a
Updated 'checkout-deps' to check for 'pip'/'pip3' prior to installing 'AMBuild' (#897) 2020-07-31 14:33:28 -07:00
shel
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
shel
ff2fc19b08
Update newmenus.cpp (#884)
Fixes: #881

Co-authored-by: shel <2@shelru.ru>
2020-07-17 01:57:29 +02:00
shel
f4fefd0bb4
Fix uninitialized member unexpected results (#896)
Co-authored-by: shel <2@shelru.ru>
2020-07-16 16:40:31 -07:00
Vincent Herbet
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
Vincent Herbet
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
Vincent Herbet
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
shel
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
KAWAI
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
regener
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
Juice
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
Juice
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
diamond-optic
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
Eren Kaya
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
Vincent Herbet
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
Vincent Herbet
18a5f6f5ea
Fix MySQL connector link (#844) 2020-03-04 21:10:41 +01:00
shel
d3ef881f31 Fix unreachable code warning in constraint_offset() (#784) 2019-12-20 11:17:08 +01:00
Cleverson
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
Vitaly Karpenko
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
Vincent Herbet
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
Arkshine
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
Juice
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
Vincent Herbet
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
Vincent Herbet
d01aa5762f
Fix behavior change about endianness check in maxmind/libmaxminddb#123 (#770) 2019-10-20 23:21:57 +02:00
twisterniq
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
Smilex_Gamer
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
Vincent Herbet
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
Vincent Herbet
7a44e6ec66
Fix GeoIP2 database file extraction (#764) 2019-10-17 15:42:27 +02:00
Dmitry Novikov
0bd69445f9 CSPForward::execute: Fix uninitialized retVal (#747) 2019-08-02 09:47:38 +02:00
Vincent Herbet
5a257a7a42
Merge pull request #664 from IgnacioFDM/add-sqdistance
Add square distance functions to xs.inc
2019-06-19 22:37:56 +02:00
Vincent Herbet
136cc23463
Merge pull request #698 from CrXane/master
Albanian Language translation support
2019-06-19 22:36:06 +02:00
Vincent Herbet
024003d6f0
Fix MPROP_SHOWPAGE option not working as expected (#726)
Typo from #473.
2019-06-19 22:26:03 +02:00
Adam Richard
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
Pjeter Jetishi
16c5e4b34b
Merge pull request #15 from lspublic/patch-46
Update miscstats.txt
2019-06-11 15:04:04 +02:00
Pjeter Jetishi
132277bfdc
Merge pull request #16 from lspublic/patch-47
Update multilingual.txt
2019-06-11 15:03:56 +02:00
Pjeter Jetishi
f1332bb4af
Merge pull request #17 from lspublic/patch-48
Update nextmap.txt
2019-06-11 15:03:46 +02:00
Pjeter Jetishi
d659761195
Merge pull request #18 from lspublic/patch-49
Update pausecfg.txt
2019-06-11 15:03:37 +02:00
Pjeter Jetishi
8a57a94480
Merge pull request #19 from lspublic/patch-50
Update plmenu.txt
2019-06-11 15:03:27 +02:00
Pjeter Jetishi
0409910e1f
Merge pull request #20 from lspublic/patch-51
Update restmenu.txt
2019-06-11 15:03:18 +02:00
Pjeter Jetishi
c392d358a7
Merge pull request #21 from lspublic/patch-52
Update scrollmsg.txt
2019-06-11 15:03:10 +02:00
Pjeter Jetishi
a901a127eb
Merge pull request #22 from lspublic/patch-53
Update stats_dod.txt
2019-06-11 15:02:46 +02:00
Pjeter Jetishi
2f90940c3f
Merge pull request #23 from lspublic/patch-54
Update statscfg.txt
2019-06-11 15:02:38 +02:00
Pjeter Jetishi
e66b466745
Merge pull request #24 from lspublic/patch-55
Update statsx.txt
2019-06-11 15:02:29 +02:00
Pjeter Jetishi
9068f3c95a
Merge pull request #25 from lspublic/patch-56
Update telemenu.txt
2019-06-11 15:02:18 +02:00
Pjeter Jetishi
d2e71dd1f2
Merge pull request #26 from lspublic/patch-57
Update time.txt
2019-06-11 15:02:06 +02:00
Pjeter Jetishi
58e552ceff
Merge pull request #27 from lspublic/patch-58
Update timeleft.txt
2019-06-11 15:01:55 +02:00
Pjeter Jetishi
8a19774edd
Merge pull request #14 from lspublic/patch-45
Update menufront.txt
2019-06-11 15:01:30 +02:00
Pjeter Jetishi
66876f89cd
Merge pull request #13 from lspublic/patch-44
Update mapsmenu.txt
2019-06-11 15:01:17 +02:00
Pjeter Jetishi
d18cc72510
Merge pull request #12 from lspublic/patch-43
Update mapchooser.txt
2019-06-11 15:00:45 +02:00
Pjeter Jetishi
179b802c7b
Merge pull request #11 from lspublic/patch-42
Update languages.txt
2019-06-11 15:00:15 +02:00
Pjeter Jetishi
aba5897818
Merge pull request #10 from lspublic/patch-41
Update imessage.txt
2019-06-11 14:59:46 +02:00
Pjeter Jetishi
ee2d846e0d
Merge pull request #9 from lspublic/patch-40
Update common.txt
2019-06-11 14:59:20 +02:00
Pjeter Jetishi
a6897ec39b
Update common.txt 2019-06-11 14:58:19 +02:00
Pjeter Jetishi
8aabf09067
Merge pull request #8 from lspublic/patch-39
Update cmdmenu.txt
2019-06-11 14:57:23 +02:00
Pjeter Jetishi
b5fb4611cd
Merge pull request #7 from lspublic/patch-38
Update antiflood.txt
2019-06-11 14:57:03 +02:00
Pjeter Jetishi
f41aeef8b0
Merge pull request #4 from lspublic/patch-35
Update adminhelp.txt
2019-06-11 14:56:25 +02:00
Pjeter Jetishi
7561426bd4
Merge pull request #5 from lspublic/patch-36
Update adminslots.txt
2019-06-11 14:56:06 +02:00
Pjeter Jetishi
1bac8319c4
Merge pull request #6 from lspublic/patch-37
Update adminvote.txt
2019-06-11 14:55:36 +02:00
Pjeter Jetishi
c6eb8a11d8
Merge pull request #3 from lspublic/patch-34
Update admincmd.txt
2019-06-11 14:54:31 +02:00
Pjeter Jetishi
6aa012f062
Merge pull request #2 from lspublic/patch-33
Update adminchat.txt
2019-06-11 14:52:26 +02:00
Pjeter Jetishi
887dd5b6d1
Update admincmd.txt 2019-06-11 14:47:44 +02:00
Pjeter Jetishi
703a6872bc
Update admincmd.txt 2019-06-11 14:44:41 +02:00
Pjeter Jetishi
71eb9fe0d8
Update adminchat.txt 2019-06-11 14:42:04 +02:00
Vincent Herbet
096dae9095
Fix MPROP_SHOWPAGE option not working as expected
Typo from #473.
2019-05-29 11:47:57 +02:00
Pjeter Jetishi
1eb8a7f8c2
Update timeleft.txt
Some file change
2019-05-23 19:30:14 +02:00
Pjeter Jetishi
8cbbf71f0c
Update time.txt
Some file change
2019-05-23 19:29:24 +02:00
Pjeter Jetishi
6923c1b209
Update telemenu.txt
Some file change
2019-05-23 19:28:37 +02:00
Pjeter Jetishi
de93fa0824
Update statsx.txt
Some file change
2019-05-23 19:27:52 +02:00
Pjeter Jetishi
118f33a83e
Update statscfg.txt
Some file change
2019-05-23 19:27:02 +02:00
Pjeter Jetishi
bc0d83bc92
Update stats_dod.txt
Some file change
2019-05-23 19:26:03 +02:00
Pjeter Jetishi
bc36bb23df
Update scrollmsg.txt
Some file change
2019-05-23 19:24:53 +02:00
Pjeter Jetishi
00967632d5
Update restmenu.txt
Some file change
2019-05-23 19:24:35 +02:00
Pjeter Jetishi
74171687f7
Update plmenu.txt
Some file change
2019-05-23 19:22:57 +02:00
Pjeter Jetishi
88d9145524
Update pausecfg.txt
Some file change
2019-05-23 19:22:06 +02:00
Pjeter Jetishi
50971fd9d0
Update nextmap.txt
Some file change
2019-05-23 19:21:06 +02:00
Pjeter Jetishi
45c2e90a3f
Update multilingual.txt
Update some file change
2019-05-23 19:20:19 +02:00
Pjeter Jetishi
a6ccf82419
Update miscstats.txt
Some file change
2019-05-23 19:19:04 +02:00
Pjeter Jetishi
3c3ac7a36c
Update menufront.txt
Some file changes
2019-05-23 19:18:00 +02:00
Pjeter Jetishi
41abeb3322
Update mapsmenu.txt
Some file changes
2019-05-23 19:17:13 +02:00
Pjeter Jetishi
1e89e4c685
Update mapchooser.txt
Some file changes
2019-05-23 19:16:17 +02:00
Pjeter Jetishi
653c5edcf4
Update languages.txt
Some files change in text
2019-05-23 19:15:28 +02:00
Pjeter Jetishi
302d127f6f
Update imessage.txt
Some file changes in text
2019-05-23 19:14:34 +02:00
Pjeter Jetishi
0eeda72922
Update common.txt
Some file changes in text
2019-05-23 19:12:51 +02:00
Pjeter Jetishi
cb1941c99a
Update cmdmenu.txt
Some file changes in text
2019-05-23 19:11:47 +02:00
Pjeter Jetishi
51adc75e96
Update antiflood.txt
Some changes in text
2019-05-23 19:10:37 +02:00
Pjeter Jetishi
8882bd5ca0
Update adminvote.txt
Some changes in text
2019-05-23 19:09:13 +02:00
Pjeter Jetishi
0928d7a6fe
Update adminslots.txt
Some changes in file
2019-05-23 19:07:45 +02:00
Pjeter Jetishi
e502c61f2c
Update adminhelp.txt
Some changes in text
2019-05-23 19:06:18 +02:00
Pjeter Jetishi
38848ff636
Update admincmd.txt
Some changes in text
2019-05-23 19:05:07 +02:00
Pjeter Jetishi
59ce7064c7
Update adminchat.txt
Some changes in text
2019-05-23 19:01:09 +02:00
Relaxing
8cee128e50
Added Albanian translation: timeleft.txt 2019-05-16 22:26:59 +04:00
Relaxing
7ddc462135
Added Albanian translation: time.txt 2019-05-16 22:26:05 +04:00
Relaxing
cd76998995
Added Albanian translation: time.txt 2019-05-16 22:25:46 +04:00
Relaxing
48c0ae1711
Added Albanian translation: statsx.txt 2019-05-16 22:24:36 +04:00
Relaxing
85124d3417
Added Albanian translation: statscfg.txt 2019-05-16 22:20:46 +04:00
Relaxing
8b1a83f085
Added Albanian translation: stats_dod.txt 2019-05-16 22:11:15 +04:00
Relaxing
3fb981f6be
Added Albanian translation: miscstats.txt 2019-05-16 22:03:59 +04:00
Relaxing
388a68e694
Added Albanian translation: scrollmsg.txt 2019-05-16 21:55:16 +04:00
Relaxing
60e2109b4f
Added Albanian translation: restmenu.txt 2019-05-16 21:53:48 +04:00
Relaxing
ca7e289273
Added Albanian translation: plmenu.txt 2019-05-16 21:36:18 +04:00
Relaxing
437ad0f8ec
Added Albanian translation: pausecfg.txt 2019-05-16 21:33:25 +04:00
Relaxing
32ff785d85
Added Albanian translation: nextmap.txt 2019-05-16 21:17:47 +04:00
Relaxing
2d607b6d68
Added Albanian translation: multilingual.txt 2019-05-16 21:16:02 +04:00
Relaxing
9c21bcd18b
Added Albanian translation: miscstats.txt 2019-05-16 21:13:14 +04:00
Relaxing
dcdd5a1442
Added Albanian translation: menufront.txt 2019-05-16 21:00:55 +04:00
Relaxing
072095445e
Added Albanian translation: mapsmenu.txt 2019-05-16 20:56:34 +04:00
regener
486da2f44b Hungarian language update (#719)
Thanks for the help to Norbee. @ ebateam
2019-05-16 15:11:10 +02:00
Vincent Herbet
681acffee9
Bump ReHLDS API version to 3.6 (#721) 2019-05-16 14:55:41 +02:00
regener
dfd835eba5 String changes for missing path exception messages (#718)
Resolves #652
2019-05-14 00:37:49 +02:00
Relaxing
ecbff2e8f1
Added Albanian translation: mapchooser.txt 2019-05-12 14:55:46 +04:00
Relaxing
55f01c9488
Added Albanian translation: imessage.txt 2019-05-12 14:50:43 +04:00
Relaxing
49c219e6a2
Added Albanian translation: common.txt 2019-05-12 14:48:39 +04:00
Relaxing
cccb8c84af
Added Albanian translation: cmdmenu.txt 2019-05-12 14:43:46 +04:00
Relaxing
3dc5ec0331
Added Albanian translation: antiflood.txt 2019-05-12 14:42:24 +04:00
Relaxing
12664d9427
Added Albanian translation: adminvote.txt 2019-05-12 14:41:25 +04:00
Relaxing
365a0559b3
Added Albanian translation: adminhelp.txt 2019-05-12 14:33:37 +04:00
Relaxing
62052ee590
Added Albanian language: adminslots.txt 2019-05-12 14:29:29 +04:00
Relaxing
0aa97dee3f
Added Albanian language: adminhelp.txt 2019-05-12 14:27:33 +04:00
Relaxing
4c55da4de9
Added Albanian translation: admincmd.txt 2019-05-12 14:19:20 +04:00
Relaxing
0f667692b1
Added Albanian translation: adminchat.txt 2019-05-12 13:22:40 +04:00
Relaxing
6addd9c074
Added Albanian translation: admin.txt 2019-05-12 13:20:57 +04:00
Adam Richard
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
KAWAI
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
Relaxing
f301fbaf08
Accidentally deleted 2019-04-14 12:02:24 +02:00
Relaxing
05cd0af3a5
Delete restmenu.txt 2019-04-14 11:52:49 +02:00
Relaxing
97fc80dd03
Merge branch 'master' into master 2019-04-14 10:12:59 +02:00
Relaxing
d3ca82411a
Added Albanian translation 2019-04-14 10:04:22 +02:00
Relaxing
3e91def7f0
Added Albanian translation 2019-04-14 10:03:46 +02:00
Relaxing
96a74ec654
Added Albanian translation 2019-04-14 10:03:09 +02:00
Relaxing
4f3b9e7a60
Added Albanian translation 2019-04-14 10:02:37 +02:00
Relaxing
df819beab5
Added Albanian translation 2019-04-14 10:01:56 +02:00
Relaxing
7ecc62aaef
Added Albanian translation 2019-04-14 10:01:19 +02:00
Relaxing
ef570a987a
Added Albanian translation 2019-04-14 10:00:20 +02:00
Relaxing
09548bfd2c
Added Albanian translation 2019-04-14 09:59:16 +02:00
Relaxing
2e0c240573
Added Albanian translation 2019-04-14 09:47:12 +02:00
Relaxing
dc59d826a3
Added Albanian translation 2019-04-14 09:46:38 +02:00
Relaxing
35788efa07
Added Albanian translation 2019-04-14 09:46:05 +02:00
Relaxing
ac6364bfdc
Added Albanian translation 2019-04-14 09:45:39 +02:00
Relaxing
6655fe7c28
Added Albanian translation 2019-04-14 09:45:06 +02:00
Relaxing
bb31835dea
Added Albanian translation 2019-04-14 09:44:34 +02:00
Relaxing
bd67978c3a
Added Albanian translation 2019-04-14 09:44:05 +02:00
Relaxing
ede7b69b25
Added Albanian translation 2019-04-14 09:43:10 +02:00
Relaxing
7b2ef405a3
Added Albanian translation 2019-04-14 09:42:35 +02:00
Relaxing
8264328235
Added Albanian translation 2019-04-14 09:42:02 +02:00
Relaxing
113c50b1fa
Added Albanian translation 2019-04-14 09:41:30 +02:00
Relaxing
340e2b9df2
Added Albanian translation 2019-04-14 09:40:46 +02:00
Relaxing
3486a7d7fc
Added Albanian translation 2019-04-14 09:40:18 +02:00
Relaxing
e1d1004cd6
Added Albanian translation 2019-04-14 09:39:46 +02:00
Relaxing
8940de5956
Added Albanian translation 2019-04-14 09:38:58 +02:00
Relaxing
304af5055e
Added Albanian translation 2019-04-14 09:38:06 +02:00
Relaxing
7c07ae6099
Added Albanian translation 2019-04-14 09:32:25 +02:00
Relaxing
1c39c85929
Added Albanian translation 2019-04-14 09:29:46 +02:00
Relaxing
5b07b25d62
Added Albanian translation 2019-04-14 09:28:49 +02:00
CrazY
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
Cleverson
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
voed
f623126fe1 Improve documentation in engine_const.inc (#665) 2019-02-11 12:15:45 +01:00
Cleverson
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
PartialCloning
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
regener
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
voed
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
IgnacioDM
ea7ffafd88 Add square distance functions to xs.inc 2019-01-26 09:41:45 -03:00
voed
ba083deb1e Removed garbage generated by VS (#658) 2019-01-24 21:13:48 +01:00
regener
f365c943b7 Updated Hungarian translation in miscstats.txt with latest additions (#661) 2019-01-24 21:12:32 +01:00
Adam Richard
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
Vincent Herbet
af56d964c1
Bump ReHLDS version to 3.5 (#647) 2018-12-18 10:16:33 +01:00
Vincent Herbet
7c7ad3d3c0
Fix again a menu regression (behavior change) due to typos in #471 (#636) 2018-11-02 14:16:57 +01:00
Vincent Herbet
bb84a43a7b
Fix a navigation bug in Plugin Cvars menu (#637) 2018-11-02 14:16:36 +01:00
Artem Golubikhin
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
Vitaly Karpenko
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
Vincent Herbet
75cf5f55f9
Make UTF-8 safe others strings natives (#610) 2018-10-14 17:44:15 +02:00
Vincent Herbet
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
Daniele386
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
Vincent Herbet
87b6f274a0
CS Miscstats: Fix enemy remaining option displaying the message to the wrong team (#611) 2018-10-11 11:12:06 +02:00
Arkshine
0b5584a334 Fix missing files in PackageScript from previous commit 2018-09-28 18:31:48 +02:00
Vincent Herbet
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
Vincent Herbet
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
OciXCrom
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
Vincent Herbet
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
justgo97
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
justgo97
22fd09efea Add constants for get_user_origin() (#604) 2018-09-28 16:22:21 +02:00
Arkshine
e8c8111178 Put back <time.h> from previous commit 2018-09-23 23:14:33 +02:00
Duko
08213d8ead GeoIP: Add "reload" command (#588)
* Add reload option

* Adjust logic

* Modernize the code a little
2018-09-23 23:01:49 +02:00
PartialCloning
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
Vincent Herbet
dfbeec069c
Fix invalid handle passed in the SMC/INI parser callbacks (#592) 2018-09-20 23:32:41 +02:00
IgnacioFDM
a54b9f05a7 Compiler: Fix broken UTF8 support (#329) 2018-09-20 20:27:15 +02:00
Vincent Herbet
1f0dc33875
Fix typo in json_object_get_value_at documentation (#587) 2018-09-16 20:03:39 +02:00
Vincent Herbet
8d1f924248
Upload amxmodx-latest-<package>-<os> text file when packaging. (#585) 2018-09-14 20:21:47 +02:00
Vincent Herbet
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
OciXCrom
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
Arkshine
b1b053c205 Bump version 2018-09-11 00:48:15 +02:00
Arkshine
c9e9ef905e Promote git revision number to 4th version string component 2018-09-11 00:46:07 +02:00
Nicholas Hastings
8a720a7d6a
Another stab at Windows build fix. 2018-09-09 07:40:58 -04:00
Vincent Herbet
d2d121619f
Another attempt to fix windows compilation (#556) 2018-09-08 21:12:57 +02:00
Vincent Herbet
9a2c586720
Attempt to fix windows compilation (#555)
* Attempt to fix windows compilation

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

* Add missing *

* Fix typos
2018-09-08 09:42:17 +02:00
Vincent Herbet
b4927bfb1f
Revert 1e3832a942ade577d39463979441651b13a5eee4 (#554) 2018-09-08 09:41:29 +02:00
HamletEagle
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
Vincent Herbet
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
voed
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
Vincent Herbet
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
Vincent Herbet
c16bd47b30
Remove GetModelCollisionBox, SetModelCollisionBox and SetModelBoundingBox natives (#536) 2018-09-03 18:49:49 +02:00
Vincent Herbet
c6c4e79b96
Don't reset m_iMenu if player is not fully joined (#537) 2018-09-03 18:39:08 +02:00
Vincent Herbet
76e92ae3a1
Add CONTRIBUTING and ISSUE_TEMPLATE (#534) 2018-09-02 20:35:42 +02:00
Vincent Herbet
80cf45d234
Adjust version for manual build and update VS projects (#543) 2018-09-02 20:34:40 +02:00
Arkshine
736efdb370 Adjust version 2018-09-02 13:12:59 +02:00
Vincent Herbet
8c0f97d6bb
Fix typo in fun include (#541) 2018-09-01 18:51:14 +02:00
Vincent Herbet
e0ca2c967c
Fix a windows compilation warning in socket module (#538) 2018-09-01 12:30:12 +02:00
OciXCrom
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
Vincent Herbet
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
Vincent Herbet
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
justgo97
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
OciXCrom
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
Vincent Herbet
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
Vincent Herbet
8762b578ff
Update SQLite library to v3.24.0. (#525) 2018-08-27 18:21:57 +02:00
Vincent Herbet
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
Vincent Herbet
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
Vincent Herbet
1ddf199e71
Fix AppVeyor (#528) 2018-08-27 14:36:38 +02:00
David Anderson
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
Vincent Herbet
9bcabfeb1f
Add or adjust a bunch of safety checks (#433) 2018-08-26 17:18:39 +02:00
OciXCrom
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
Vincent Herbet
197db8c82b
Update AMTL from upstream (#521) 2018-08-25 11:29:54 +02:00
Vincent Herbet
f822cc610f
Update ReSDK API to latest version (#520) 2018-08-25 09:20:06 +02:00
Vincent Herbet
ce14df0c77
CStrike: Fix a missing RemoveEntityHashValue function address check (#519) 2018-08-25 09:18:51 +02:00
Vincent Herbet
605d1a5b1e
Fix callback from amx_clientcmd not working properly (#518) 2018-08-25 09:18:39 +02:00
OciXCrom
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
OciXCrom
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
OciXCrom
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
Vincent Herbet
eff74fe862
Execute amxx.cfg before plugin_init to keep compatibility (#512) 2018-08-20 19:46:26 +02:00
justgo97
05b74111d3 Allow arrayset to accept any type (#516) 2018-08-20 19:46:00 +02:00
OciXCrom
0bfc65c635 Add default values for menu_item_getinfo (#511) 2018-08-09 15:38:58 +02:00
OciXCrom
a784a34561 Fix documentation (#513) 2018-08-09 15:37:24 +02:00
Vincent Herbet
faf7da4c2c
Fix a buffer issue in EngFunc_LightStyle (#508) 2018-07-28 21:35:34 +02:00
Vincent Herbet
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
OciXCrom
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
Vincent Herbet
57abc4a1c5
Fix a compilation regression in LookupLangKey (introduced with #222) (#499) 2018-07-24 10:37:56 +02:00
justgo97
7062d210a7 fix hlsdk_const.inc identation (#502)
a copy past from reapi hlsdk_const.inc file
2018-07-24 10:37:19 +02:00
Vincent Herbet
a9ce39dee0
Fix a buffer issue in server_changelevel forward caused by engine_changelevel native (#503) 2018-07-24 10:37:05 +02:00
KliPPy
98ab26671c Add MPROP_SHOWPAGE (#473) 2018-07-18 17:10:37 +02:00
Arkshine
fba3d706fc Normalize EOL of few files changed in #489 2018-07-18 14:39:53 +02:00
Vincent Herbet
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
Vincent Herbet
975d877800
Fix typos in few localinfo identifiers for the AMXX config directory retrieval (#496) 2018-07-13 12:18:16 +02:00
regener
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
voed
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
Cleverson
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
OciXCrom
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
voed
651745b1d4 Updated compiler exitcodes (#486) 2018-07-10 12:27:27 +02:00
regener
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
Vincent Herbet
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
OciXCrom
528fec1a29 Macedonian & Bulgarian translation fix (#477)
* Macedonian & Bulgarian translations fix

* Macedonian & Bulgarian translations fix
2018-07-10 12:02:47 +02:00
voed
339a27579d Improved mprop description (#478) 2018-07-10 11:59:53 +02:00
IgnacioFDM
66e3fa6db2 Fix typo (#488) 2018-07-10 11:57:37 +02:00
voed
42b351127d Fix for precache_event (#490) 2018-07-10 11:50:31 +02:00
IgnacioFDM
2559fcf00a Fix: fakemeta hook not being unregistered (#483) 2018-03-09 19:39:14 +01:00
IgnacioFDM
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
IgnacioFDM
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
KliPPy
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
KliPPy
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
Karol Szuster
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
KliPPy
d2e736b10a Strip whitespace when reading product.version (#470) 2017-12-06 15:29:06 +01:00
Vincent Herbet
a69a015189
Fix open_dir not working properly when called recursively (#467) 2017-11-27 12:08:51 +01:00
Vincent Herbet
ac3e2f48d1
Fix mac build 2017-11-26 20:43:20 +01:00
Vincent Herbet
6d8975f9fc
Add -ltr flag to mysql in order to lower glibc requirement (#468) 2017-11-26 20:34:40 +01:00
Vincent Herbet
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
Dmitry Novikov
7fe7cd746f Fix unreachable code (#465) 2017-10-28 16:27:39 +02:00
Vincent Herbet
5a2d940631 Fix utf8rewind compilation with GCC 2017-10-14 14:25:21 +02:00
Artem Golubikhin
0689c664d7 Fixed passing a temporary string to LIGHT_STYLE (#464) 2017-10-08 21:57:12 +02:00
Vincent Herbet
779a4d9e59 Fix #395 backward compatibility issue by adding SetParamEntity2 native (#463) 2017-10-05 11:46:05 +02:00
Vincent Herbet
97df408d51 Fix a crash on the same newmenu overlapping (#462) 2017-10-03 20:43:30 +02:00
Karol Szuster
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
Karol Szuster
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
Karol Szuster
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
Vincent Herbet
feba821306 Fix a typo in equali, strcmp and strncmp natives (#459) 2017-09-12 21:00:26 +02:00
Freeman-AM
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
KliPPy
38008a8e03 Fix amx_plugins throwing errors (#456) 2017-09-01 15:18:23 +02:00
Vincent Herbet
ba58cb045f Adjust 'amxx cvars' command output (#453) 2017-08-07 23:42:41 +02:00
Vincent Herbet
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
Vincent Herbet
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
Vincent Herbet
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
PartialCloning
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
Vincent Herbet
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
Vincent Herbet
304e992942 Fix broken cs_set_user_model update_index parameter for the default engine (#450) 2017-07-29 17:01:34 +02:00
Vincent Herbet
4fcfc913d3 Fix Ham_Item_GetItemInfo incorrect associated handler (#449) 2017-07-26 20:36:17 +02:00
Artem Golubikhin
c6eb62ccbc Make module loading more safe 2017-07-22 14:36:13 +03:00
Vincent Herbet
6bd2f1feec Fix a engclient_cmd and amxclient_cmd buffer issue (#438) 2017-07-21 23:44:05 +02:00
Artem Golubikhin
aa9ec3f872 Fix client_disconnected isn't called on mapchange when ReHLDS API enabled (#446) 2017-07-03 21:52:38 +02:00
In-line
f7f86fb040 Rename suki to key_index (#445) 2017-06-28 18:31:59 +02:00
In-line
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
Vincent Herbet
b7cb555cee Fix a comment typo in core.ini 2017-05-28 22:48:56 +02:00
IgnacioFDM
66cc8dcdaf Minor flagman cleanups (#442)
* Document disableflagman

* Add disabled check, random cleanups
2017-05-28 22:39:44 +02:00
KliPPy
c0011891e6 Fix temporary ban flags, add lang keys (#440) 2017-05-27 21:47:24 +02:00
KliPPy
ac7de68ac7 Fix amx_addban and amx_unban, make them safe (#441) 2017-05-27 16:28:15 +02:00
In-line
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
Artem Golubikhin
7794f27dc2 Fixed bug in cmd_access with usage printing (#434) 2017-05-02 12:54:07 +02:00
Vincent Herbet
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
Vadim
be3ae83c44 Update get_func_id description (#430)
Return id 0 on success too
2017-04-29 21:13:29 +02:00
justgo97
398983fc49 Update amxmodx.inc (#432) 2017-04-29 20:56:20 +02:00
In-line
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
Karol Szuster
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
IgnacioFDM
2d049b7ff3 Fix signed/unsigned mismatch warning (#428)
* Fix signed/unsigned mismatch warning

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

* Update test plugin
2017-04-04 10:29:18 +02:00
IgnacioFDM
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
Vincent Herbet
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
Karol Szuster
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
Freeman-AM
fa3d28872e Replace s/get_pdata* with s/get_ent_data* in plmenu.sma (#424) 2017-03-11 14:58:10 +01:00
Vincent Herbet
d23d9b1ba8 Fix missing ReGameDLL check in GetItemPrice() (#423) 2017-03-11 10:49:37 +01:00
Vincent Herbet
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
Vincent Herbet
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
Vincent Herbet
1c3e8de57a Introduce a datapack position tag (#419) 2017-03-06 21:08:16 +01:00
Karol Szuster
b7773ba11f Fix sockets crash (#418) 2017-03-04 14:14:08 +01:00
Javivi
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
Vincent Herbet
7a7d0442aa Fix VS project file (#416) 2017-02-26 21:15:53 +01:00
Vincent Herbet
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
Vincent Herbet
b973d24081 Add missing buffer size check to SQLite QuoteString implementation (#411) 2017-02-23 13:56:58 +01:00
Vincent Herbet
074af44ead Fix a potential crash in ArrayClone for too large arrays (#408) 2017-02-23 13:27:16 +01:00
KliPPy
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
Vincent Herbet
3a73e12550 Update to the latest AMTL (#410) 2017-02-19 15:01:58 +01:00
Artem Golubikhin
c27bfcd7fe Fix client_death forward called on kill command if sent by a spectator (#404) 2017-02-18 19:53:58 +01:00
Vincent Herbet
38b8dc338d Fix missing backward compatibility check in TrieGetString() and TrieGetArray() (#406) 2017-02-05 11:52:04 +01:00
Nicholas Hastings
7bb1849968 Sanitize servercfgfile and lservercfgfile values with amx_cvar (bug 6578). 2017-01-22 08:01:08 -05:00
Nicholas Hastings
ed672847f3 Remove support for %name% replacement in plmenu (bug 6578). 2017-01-21 22:58:03 -05:00
Nicholas Hastings
56210f3e96 Quote custom vote winning value (bug 6578). 2017-01-21 22:57:37 -05:00
Nicholas Hastings
5519dd0a14 Do case-insensitive compare when filtering password vars in votes (bug 6578). 2017-01-21 22:38:38 -05:00
Nicholas Hastings
7589c6c578 Quote args in amx_addban, amx_unban, & amx_exec (bug 6578). 2017-01-21 22:36:57 -05:00
souvikdas95
a7c3e34fbe Fix Warning from MSVC: 'Double to Float precision loss' (#402) 2017-01-21 20:58:33 +01:00
Artem Golubikhin
f5e734f636 Fixed is_visible native (#392) 2017-01-17 15:52:49 +01:00
souvikdas95
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
Vincent Herbet
9b3839de70 Fix missing CS_NORESET constant (#400) 2017-01-10 18:51:41 +01:00
Vincent Herbet
faa9f6ea9f Fix returning strings from variadic functions (lost changes) (#399) 2017-01-09 20:40:28 +01:00
IgnacioFDM
3e660011b2 Fix typo in TE_STREAK_SPLASH description (#398) 2017-01-06 21:05:36 +01:00
Evandro Coan
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
Artem Golubikhin
6473118b24 Fixed entity param changing in hamsandwich (#395) 2017-01-02 09:38:43 +01:00
Evandro Coan
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
Karol Szuster
79d9fc530d Update AMTL (#390) 2016-12-31 23:49:46 +01:00
Karol Szuster
e3ae451c09 Add missing format param (#391) 2016-11-25 11:26:58 +01:00
s1lentq
4c8ef63383 Fix: leak memory from unregister_forward (#388) 2016-10-12 23:26:21 +02:00
Karol Szuster
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
IgnacioFDM
732a05dde0 Back out changes in #366 and introduce read_argv_int/float()
* Revert "Extend "read_argv" native"

This reverts commit aaa2934595379c371513cb9dd23de8f3c5e16d93.

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
Alexander Petrov
a9557fe53d Use exponentiation by squaring instead of n-times multiplications in power() (#385) 2016-08-27 10:12:02 +02:00
Karol Szuster
ea43a61094 Update hashing library (#384) 2016-08-22 11:21:46 +02:00
Vincent Herbet
e24b9548d4 Update to the latest AMTL (#381)
* Update to latest AMTL.

* Update .gitignore for VS2015
2016-08-12 15:30:06 +02:00
IgnacioFDM
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
KliPPy
a53e7905db Extend amxx list command (#377) 2016-06-26 14:04:33 +02:00
Vincent Herbet
861011fa24 Merge pull request #375 from voed/patch-1
Fixed some natives descriptions
2016-06-14 08:52:36 +02:00
voed
575d215c77 Fixed some natives descriptions 2016-06-14 04:49:46 +03:00
Vincent Herbet
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
Arkshine
2099a88ddf Fix UTIL_ReplaceAll not properly tracking length. 2016-06-06 12:09:42 +02:00
Vincent Herbet
1662b47f7e Merge pull request #372 from Ni3znajomy/gcc6-fix-compilation
Fix compilation error for GCC 6
2016-06-05 19:51:27 +02:00
Vincent Herbet
f3c58b7cd6 Merge pull request #369 from Ni3znajomy/forwards/value-by-reference
Values by reference in forwards
2016-06-05 19:50:40 +02:00
luxxxoor
ce59a62f72 Update mapsmenu.txt 2016-05-11 16:27:50 +03:00
luxxxoor
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
Karol Szuster
446a1a5108 Fix compilation error for GCC 6.1
Fix compilation error due -Wmisleading-indentation
2016-05-04 15:01:29 +02:00
Vincent Herbet
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
Arkshine
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
Vincent Herbet
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
Vincent Herbet
af0afabfa0 Merge pull request #366 from Ni3znajomy/read_argv2
Extend "read_argv" native
2016-04-15 20:29:44 +02:00
Vincent Herbet
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
Vincent Herbet
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
Arkshine
253dec94d1 Fix a crash after cs_set_user_model is used with model_index set. 2016-04-07 20:27:27 +02:00
Karol Szuster
53f9144fc3 Values by reference in forwards 2016-04-05 18:51:18 +02:00
Arkshine
d91144a10d Fix typos in entity_intersects() and get_global_edict2() natives 2016-03-31 19:37:12 +02:00
Karol Szuster
aaa2934595 Extend "read_argv" native 2016-03-28 20:05:56 +02:00
Vincent Herbet
21c4886f90 Merge pull request #365 from Ni3znajomy/fix-docs
Fix description of "set_user_info" native
2016-03-23 17:43:56 +01:00
Karol Szuster
5ad1efd698 Fix description of "set_user_info" native 2016-03-23 17:27:15 +01:00
Vincent Herbet
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
Arkshine
94599e9b4e Update TravisCI build to use Clang 3.7 2016-03-20 23:02:15 +01:00
Vincent Herbet
fdebeab612 Merge pull request #361 from alliedmodders/compile-fixups
Compile fixups for Clang 3.8
2016-03-20 22:36:56 +01:00
Vincent Herbet
e6a2bc545c Merge pull request #362 from Ni3znajomy/update-message-stocks
message_stocks.inc: Cache messages id
2016-03-20 13:13:58 +01:00
Karol Szuster
5a3f4be04e message_stocks.inc: Cache messages id 2016-03-20 13:04:48 +01:00
Nicholas Hastings
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
Nicholas Hastings
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
Vincent Herbet
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
Arkshine
aa2caacf4c Replace INDEXENT and ENTINDEX by TypeConversion for consistency 2016-03-16 21:40:43 +01:00
Arkshine
ae4368a3ca Remove inline comment support in multilingual INI parser 2016-03-16 19:50:46 +01:00
Arkshine
4c7375555a Fix typo in cs_get_translated_item_alias() 2016-03-16 16:29:56 +01:00
Arkshine
28a0b0626b Fix incomplete sanity check in cs_get_weapon_info() 2016-03-16 16:29:56 +01:00
Arkshine
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
Vincent Herbet
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
Arkshine
c3a52b366e Add cs_get_item_alias() native & cleanup alias datas 2016-03-16 12:29:33 +01:00
Vincent Herbet
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
Arkshine
494444a433 Allow null invoker to be passed in EngFunc_PlayBackEvent 2016-03-02 14:55:23 +01:00
Vincent Herbet
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
Arkshine
c6024b93ce Fix typo in find_ent_in_sphere 2016-02-24 23:47:17 +01:00
Vincent Herbet
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
Arkshine
be06e2448b Add fmt() native to format and return inline a string 2016-02-23 19:56:02 +01:00
Vincent Herbet
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
Arkshine
2c73268668 Fix issue where native functions returning an array would not compile 2016-02-22 23:37:09 +01:00
Vincent Herbet
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
Arkshine
141f5effa3 Fix TFC virtual functions indexes under linux 2016-02-19 17:29:21 +01:00
Vincent Herbet
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
Karol Szuster
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
Vincent Herbet
c11d8f033e Merge pull request #348 from Arkshine/update/ambuildscript
Refactor and cleanup the AMBuildScript a bit
2016-02-12 02:10:53 +01:00
Arkshine
23080b7455 Refactor and cleanup the AMBuildScript a bit 2016-02-12 02:05:17 +01:00
Vincent Herbet
1d5fb4b9d1 Merge pull request #346 from Arkshine/featire/entindex-cleanup
Engine: Replace ENTINDEX with TypeConversion
2016-02-11 22:20:08 +01:00
Arkshine
1234528521 Engine: Replace ENTINDEX with TypeConversion 2016-02-11 22:07:01 +01:00
Vincent Herbet
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
Vincent Herbet
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
Vincent Herbet
2a90fc0fe8 Merge pull request #336 from Arkshine/update/gameconfigs
Update GameConfig
2016-02-09 11:27:10 +01:00
Arkshine
2928c622f9 Add cs_set_ent_class native 2016-02-09 11:27:02 +01:00
Arkshine
696d842b07 Add info message when loading custom gamedata 2016-02-09 11:19:35 +01:00
Vincent Herbet
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
Vincent Herbet
6b5d26c9ce Merge pull request #352 from Ni3znajomy/fix-gamedata
Fix linux/mac GiveNamedItem and GiveDefaultItems symbols
2016-02-08 13:39:19 +01:00
Karol Szuster
f3ebe71dd1 Fix gamedata 2016-02-08 13:24:51 +01:00
Arkshine
07f87990ef Remove use of Vendor.behavior in AMBuild scripts 2016-02-03 22:53:40 +01:00
Arkshine
86d34e9bc5 Engine: Fix more bcompat for CHECK_ENTITY 2016-02-03 13:34:03 +01:00
Vincent Herbet
664c25bdac Merge pull request #343 from Arkshine/fix/typo-lookuplangkey
Fix LookupLangKey retrieving invalid index
2016-02-01 21:32:23 +01:00
Arkshine
78619d3710 Fix LookupLangKey retrieving invalid index 2016-02-01 14:48:32 +01:00
Vincent Herbet
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
WPMGPRoSToTeMa
3c74e72242 Fakemeta: fixed bug with recursive pre hooks (one returned supercede can supercede several hooks) 2016-01-26 01:34:45 +03:00
Vincent Herbet
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
Vincent Herbet
209ff4d527 Merge pull request #339 from IgnacioFDM/fix-whitespace
Normalize line endings and whitespace
2016-01-23 22:56:46 +01:00
Vincent Herbet
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
Arkshine
fafa1f11f0 Fix CS_OnBuy* not triggered from alias containing uppercase letters 2016-01-23 00:09:04 +01:00
Vincent Herbet
06290483da Merge pull request #337 from Ni3znajomy/cvar_directset
Move Cvar_DirectSet to gamedata
2016-01-22 01:25:21 +01:00
Karol Szuster
0e8d876c5d Move Cvar_DirectSet to gamedata 2016-01-21 23:50:07 +01:00
IgnacioDM
e502e12e07 Normalize line endings and whitespace 2016-01-16 21:15:52 -03:00
Vincent Herbet
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
Vincent Herbet
307dab47c8 Merge pull request #326 from Arkshine/feature/enable-disable-logevent
Add enable/disable_logevent() natives
2016-01-16 12:18:59 +01:00
Vincent Herbet
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
Vincent Herbet
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
Arkshine
240c81e626 Improve client_print_color by inserting default color code at the start of string 2016-01-16 12:09:13 +01:00
Arkshine
33768740fa Fix LoadGameConfigFile returning valid handle on invalid path 2016-01-15 17:35:21 +01:00
Arkshine
f1a2a00d38 Allow gameconfig without master for convenience 2016-01-15 17:33:42 +01:00
Arkshine
e634e512c8 Fix recursion issue with show_menu and newmenus 2016-01-15 12:56:16 +01:00
Arkshine
98fb03dd30 Enable detours in ServerActivate to avoid sig conflict with third-party AMXX modules 2016-01-11 23:25:02 +01:00
Vincent Herbet
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
Arkshine
9df5bd708e Ignore .opendb extension introduced with VS 2015 Update 1 2016-01-11 19:58:35 +01:00
Vincent Herbet
5b54a24b4e Merge pull request #325 from flaviommedeiros/master
Avoiding directives that split up parts of statements.
2016-01-11 19:38:13 +01:00
Arkshine
4662109980 Fix an out of bound buffer index 2016-01-07 19:42:47 +01:00
WPMGPRoSToTeMa
b85b37192e New natives: cs_get_user_weapon_entity and cs_get_user_weapon 2016-01-06 23:10:31 +03:00
Vincent Herbet
0af2c0e4c1 Merge pull request #328 from WPMGPRoSToTeMa/selinuxcompatibility
SELinux compatibility: memalign -> mmap
2016-01-04 17:27:09 +01:00
WPMGPRoSToTeMa
48d7a04c73 SELinux compatibility: memalign -> mmap 2016-01-03 21:38:31 +03:00
Vincent Herbet
866339eff6 Merge pull request #327 from Arkshine/fix/replace_stringex
Fix typo in replace_stringex native
2015-12-24 23:13:04 +01:00
Arkshine
b0e5e8d331 Fix typo in replace_stringex native 2015-12-24 19:12:55 +01:00
Arkshine
17a31b75d7 Add enable/disable_logevent() natives 2015-12-24 19:08:00 +01:00
Flavio Medeiros
f796df783c Avoiding directives that split up parts of statements. 2015-12-24 12:42:34 -03:00
Vincent Herbet
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
Vincent Herbet
01d703cdbb Merge pull request #323 from luxxxoor/patch-1
Adding flag parameter to user_silentkill.
2015-12-24 14:45:45 +01:00
Vincent Herbet
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
Karol Szuster
62a5c54a18 Add client_connectex & extend client_authorized forward 2015-12-22 16:36:51 +01:00
luxxxoor
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
Arkshine
6a18f8007d Fix incorrect translation language for %l format identifier 2015-12-13 20:02:13 +01:00
Vincent Herbet
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
Arkshine
cc9f679a85 Enable hook detour on cvar with bounds regardless current value 2015-12-11 10:33:54 +01:00
Vincent Herbet
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
WPMGPRoSToTeMa
5c8c925e8a Hamsandwich: fix HAM_OVERRIDE in post hooks (bug 6443) 2015-12-09 21:38:08 +03:00
Vincent Herbet
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
Arkshine
5b0191f691 Make sure client is alive before checking buying commands 2015-12-07 19:20:48 +01:00
Vincent Herbet
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
Arkshine
6190582f16 Fix missing master.games.txt reference in PackageScript 2015-12-05 18:43:33 +01:00
Vincent Herbet
4cea082303 Merge pull request #314 from Th3-822/fix-strncmp-case-sensitivity
Fix strncmp case sensitivity
2015-12-03 00:55:20 +01:00
Th3-822
578a2f9852 Fix strncmp case sensitivity
strncmp was using case insensitive call when ignorecase == false
2015-12-02 19:08:10 -04:30
Vincent Herbet
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
Arkshine
02ac6fa2d7 Update to the latest AMTL - Rename Ref to RefPtr. 2015-11-23 14:45:07 +01:00
Vincent Herbet
2971bb65fd Merge pull request #309 from Arkshine/refactor-gamerules-retrieval
Refactor gamerules address retrieval
2015-11-23 00:58:37 +01:00
Vincent Herbet
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
Arkshine
42a09f8593 Fix missing meta return in ServerActivate 2015-11-23 00:35:44 +01:00
Arkshine
87b1833f73 Refactor gamerules address retrieval 2015-11-23 00:29:43 +01:00
Vincent Herbet
664c85106f Merge pull request #278 from Arkshine/feature/cstrike-update-2
Update cstrike module - 2
2015-11-21 00:19:01 +01:00
Arkshine
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
Vincent Herbet
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
Arkshine
6d9fe60608 Fix shifted warning messages from compiler due to missing comma in array 2015-11-12 20:13:54 +01:00
Vincent Herbet
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
IgnacioDM
72d3f21816 Allow wordspawn in edict/entvars->index type conversion and EHANDLE edict get/set 2015-11-06 07:44:14 -03:00
Arkshine
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
Arkshine
eb0222455a Cstrike: Fix spaces/tabulations/typo 2015-11-03 10:45:51 +01:00
Arkshine
b6910667a8 Cstrike: Remove parsing error and update native error message 2015-11-03 10:45:50 +01:00
Arkshine
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
Arkshine
ffe8b7761e Cstrike: Move CSW_* constants from amxconst.inc to cstrike_const.inc 2015-11-03 10:45:49 +01:00
Arkshine
2c5cc4289e Cstrike: Add cs_is_valid_itemid() stock 2015-11-03 10:45:49 +01:00
Arkshine
75853dae60 Cstrike: Add cs_find_ent_by_owner() native 2015-11-03 10:45:48 +01:00
Arkshine
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
Arkshine
600a15a57b Cstrike: Add cs_get_weapon_info() native 2015-11-03 10:45:47 +01:00
Arkshine
60cdbeb219 Cstrike: Add CS_OnGetItemPrice forward to get/alter an item price on purchase 2015-11-03 10:45:46 +01:00
Arkshine
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
Arkshine
e6a2434887 Cstrike: Add cs_get_item_id() and cs_get_translated_item_alias() natives 2015-11-03 10:45:45 +01:00
Arkshine
c6628f22ee Cstrike: Add more known constants from game 2015-11-03 10:45:44 +01:00
Arkshine
d3e5957215 Cstrike: Add cstrike_const.inc and move existing constants there 2015-11-03 10:45:44 +01:00
Vincent Herbet
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
Arkshine
49184c86a3 Refactor 5 - Rename original file/var for gamerules 2015-11-02 20:10:40 +01:00
Arkshine
4333255571 Refactor 4 - Move entities natives to its own file and reflect changes 2015-11-02 20:10:39 +01:00
Arkshine
1032fbdbd0 Refactor 3 - Simplify macros and move them to shared file as well 2015-11-02 20:10:39 +01:00
Arkshine
dc6f171f20 Refactor 2 - Duplicate get_member_* for each set of natives for consistency 2015-11-02 20:10:38 +01:00
Arkshine
c07b269c94 Refactor 1 - Move shared code to its own file and reflect changes 2015-11-02 20:10:38 +01:00
Arkshine
02c1b20ed7 Rename get_ent_data_size/info/basetype to be more generic 2015-11-02 20:10:37 +01:00
Arkshine
68f99bc2d5 Add get/Set_gamerules_* natives 2015-11-02 20:10:37 +01:00
Arkshine
df507a675b Reflect changes on get/set_data* natives 2015-11-02 20:10:36 +01:00
Arkshine
d9c7e72d4b Update macros to support gamerules configs 2015-11-02 20:10:36 +01:00
Arkshine
234b537ad9 Factorize gamerules data code 2015-11-02 20:10:35 +01:00
Arkshine
483ef98af3 Load gamerules address and offsets 2015-11-02 20:10:34 +01:00
Arkshine
f31e0e405f Add gamerules offsets for supported mods 2015-11-02 20:10:34 +01:00
Vincent Herbet
7db6e9355d Merge pull request #305 from IgnacioFDM/master
Remove extra semicolon
2015-10-20 10:47:50 +02:00
IgnacioFDM
b78c239395 Remove extra semicolon 2015-10-20 05:34:18 -03:00
Vincent Herbet
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
Arkshine
42fb860077 Fix a potential crash if SV_DropClient address could not be found 2015-10-15 12:50:58 +02:00
Vincent Herbet
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
Arkshine
85f03c4a06 Fix linux compilation with gcc-4.8 and higher. 2015-10-13 20:25:09 +02:00
Vincent Herbet
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
Arkshine
b3e5e10473 Fix retrieval of sv address not working under linux 2015-10-11 13:25:31 +02:00
Vincent Herbet
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
Arkshine
9997c31703 Fix (get/set)_pdata_(int/float) using the wrong offset value (typo from #297) 2015-10-09 20:30:45 +02:00
Vincent Herbet
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
Arkshine
9bee1f7edf Consistency: Replace GETEDICT with HLTypeConversion in core 2015-10-08 19:36:42 +02:00
Arkshine
b65a0600ee Consistency: Replace GETEDICT and variants with HLTypeConversion in cstrike module 2015-10-08 19:25:00 +02:00
Arkshine
6f301b5cea Consistency: Replace GETEDICT, INDEXENT2 and others things with HLTypeConversion in hamsandwich module 2015-10-08 19:24:49 +02:00
Arkshine
bf5fdc2b5c Consistency: Replace GetPlayerEdict with HLTypeConversion in fun module 2015-10-07 23:27:58 +02:00
Arkshine
e52fc14114 Consistency: Replace INDEXENT2 with HLTypeConversion in engine module 2015-10-07 23:27:57 +02:00
Arkshine
429a4596c1 Consistency: Replace INDEXENT2 and others things with HLTypeConversion in fakemeta module 2015-10-07 23:27:56 +02:00
Arkshine
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
Vincent Herbet
fd0f6cc429 Merge pull request #296 from Arkshine/feature/update-to-latest-amtl
Update to latest AMTL
2015-10-05 19:49:10 +02:00
Arkshine
c29eabec50 Fix max length inconsistencies + typo 2015-10-05 19:12:30 +02:00
Arkshine
138b9e1510 Remove UTIL_Format() and UTIL_VarArgs() 2015-10-05 19:12:08 +02:00
Arkshine
f22dc769f4 Replace some LibraySys usage with AMTL primitives 2015-10-02 23:22:22 +02:00
Arkshine
f976861e21 Fix AMBuild and VS projects files 2015-10-02 23:22:22 +02:00
Arkshine
2d910838a2 Fix AMTL internal paths 2015-10-02 23:22:21 +02:00
Arkshine
f811bab608 Update AMTL to latest revision 2015-10-02 23:22:20 +02:00
Vincent Herbet
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
Arkshine
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
Vincent Herbet
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
Vincent Herbet
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
Vincent Herbet
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
Vincent Herbet
5b3a5a0153 Merge pull request #289 from alliedmodders/fix/typo-autoexeconfig
Fix typo in AutoExecConfig native
2015-09-05 08:49:04 +02:00
Vincent Herbet
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
Vincent Herbet
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
Arkshine
0005d1a6b5 Update AMTL submodule from upstream and reflect changes 2015-08-26 11:15:07 +02:00
Vincent Herbet
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
Arkshine
5b8bbddbc1 AutoExecConfig: Adjust few things 2015-08-26 10:38:31 +02:00
Vincent Herbet
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
Iván Lo Giudice
e4b635f5be Update CstrikeNatives.cpp 2015-08-22 17:54:00 -03:00
Iván Lo Giudice
f95f2032fc Update cstrike.inc 2015-08-22 17:51:48 -03:00
Arkshine
78b1154b8d AutoExecConfig: Do not traumatize Travis and Nextra 2015-08-14 16:38:29 +02:00
Arkshine
1f3ba35140 AutoExecConfig: Remove config code in admin.sma 2015-08-14 16:38:28 +02:00
Arkshine
1f3c7cf272 AutoExecConfig: Update documentation 2015-08-14 16:38:28 +02:00
Arkshine
9a1dc5d179 AutoExecConfig: Add AutoExecConfig native 2015-08-14 16:38:27 +02:00
Arkshine
f22185d646 AutoExecConfig: Enable the configs 2015-08-14 16:38:27 +02:00
Arkshine
517a08e134 AutoExecConfig: Add CoreConfig class + OnAutoConfigsBuffered / OnConfigsExecuted forwards 2015-08-14 16:37:48 +02:00
Vincent Herbet
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
Arkshine
ed4faf7c11 Fix player not being internally disconnected in some situation + add client_disconnected forward 2015-08-14 00:08:50 +02:00
Vincent Herbet
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
Vincent Herbet
83a72a6e3a Fix MPROP_NOCOLORS menu property not working 2015-08-13 12:04:31 +02:00
Arkshine
5f0b92f7c3 Fix typos 2015-08-12 10:43:59 +02:00
Arkshine
c270243b56 Replace "time" type name by a more generic one "float" 2015-08-10 18:06:06 +02:00
Arkshine
a6e587f0f0 Update Opfor offsets 2015-08-10 18:06:04 +02:00
Arkshine
a50b1e17d8 Update TFC offsets 2015-08-10 18:06:03 +02:00
Arkshine
9a83db66f5 Update HLDM offsets 2015-08-10 18:06:02 +02:00
Arkshine
2fa53badd9 Update DoD offsets 2015-08-10 18:06:01 +02:00
Arkshine
db14b0eae8 Update CS offsets 2015-08-10 18:06:00 +02:00
Arkshine
f4f4d966f3 Reflect changes where game config functions are used 2015-08-10 18:05:59 +02:00
Arkshine
7423ac6824 Modify game config parser to support more offset datas (type, size, etc.) 2015-08-10 18:05:59 +02:00
Vincent Herbet
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
Vincent Herbet
4563f56e77 Merge pull request #277 from Arkshine/fix/potential-issues
Fix some potential issues
2015-08-10 15:28:32 +02:00
Vincent Herbet
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
Vincent Herbet
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
Arkshine
8f90f30b07 Gamedata: keep "class" comment for unknown type 2015-08-09 16:33:21 +02:00
Arkshine
222b1c651b Gamedata: Add HLDM entities classes 2015-08-09 16:25:18 +02:00
Arkshine
e0d80639b3 Gamedata: Remove any static members 2015-08-07 20:41:38 +02:00
Arkshine
0baa7d47b6 Gamedata: Add Opfor entites offsets 2015-08-07 20:36:55 +02:00
Arkshine
c80d6e5284 Gamedata: Add TFC entites offsets 2015-08-07 20:20:55 +02:00
Arkshine
ad63658f9e Gamedata: Add DoD entities offsets 2015-08-07 20:13:54 +02:00
Arkshine
ffb9bc92d6 Gamedata: Fix Master and PackageScript to reflect changes 2015-08-07 20:01:11 +02:00
Arkshine
672c519378 Gamedata: Move more CS classes not linked an entity to /others.games 2015-08-07 18:06:32 +02:00
Arkshine
cfd8526961 Gamedata: Move CS hostage-related classes not linked to an entity to /hostages.games 2015-08-07 18:02:54 +02:00
Arkshine
00de99b839 Gamedata: Add missing CS classes associated to an entity 2015-08-07 17:38:18 +02:00
Arkshine
fb1189fd31 Gamedata: Add CS class hierarchy as comment for convenience 2015-08-07 17:35:29 +02:00
Arkshine
7dff2749ec Gamedata: Remove CS classes with no members 2015-08-07 17:30:49 +02:00
Arkshine
4d3e31cf6c Fix an SortADTArray() issue where strings are not properly sorted 2015-08-04 17:08:40 +02:00
Arkshine
5987f389c6 Fix some potiental issues 2015-07-31 15:46:16 +02:00
Vincent Herbet
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
Arkshine
73e84e9963 Fix "ham hooks" command not displaying all current hooks of a plugin 2015-07-31 14:25:19 +02:00
Vincent Herbet
8c0534a055 Fix typo 2015-07-30 19:54:40 +02:00
Vincent Herbet
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
Pavel Djundik
79bb453bb6 Return an error on Err_OldFile instead of falling through to default case 2015-07-30 15:59:01 +03:00
Vincent Herbet
6b1650ae4f Merge pull request #274 from xPaw/patch-1
Fix resource leak when reading hamdata.ini
2015-07-30 13:23:03 +02:00
Pavel Djundik
378d89af2f Fix resource leak when reading hamdata.ini 2015-07-30 14:02:46 +03:00
Vincent Herbet
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
Vincent Herbet
fc4455d837 Merge pull request #273 from Arkshine/fix/newmenu-typo
Fix typo in newmenus (bug 6394)
2015-07-30 10:43:36 +02:00
Arkshine
5f83f77b2e Fix typo in newmenus 2015-07-30 00:28:18 +02:00
Arkshine
6d6a1c1ab0 Add a data argument in INI/SMC_ParseFile() to pass through to callbacks (bug 6228) 2015-07-29 22:23:13 +02:00
Arkshine
aa5c340029 NS: Fix ns_remove_upgrade() native 2015-07-29 20:49:14 +02:00
Arkshine
a35af02494 NS: Refactor some bits 2015-07-29 20:21:09 +02:00
Vincent Herbet
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
Arkshine
2d583aa83a Fix a ML parser crash on key with an associated empty value 2015-07-28 15:41:16 +02:00
Vincent Herbet
57037740fd Merge pull request #269 from Arkshine/update-libmaxminddb
Update libmaxminddb to v1.1.0
2015-07-22 12:57:46 +02:00
Arkshine
8efa1ba067 Update libmaxminddb to v1.1.0 2015-07-22 00:21:44 +02:00
Vincent Herbet
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
Arkshine
6b3b351c9a Rename Handle class to avoid name collision in mac 2015-07-21 00:18:54 +02:00
Vincent Herbet
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
Arkshine
df5d935194 Add enable/disable_event() native 2015-07-20 23:06:32 +02:00
Vincent Herbet
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
Arkshine
109b3481a7 Retrieve log type in MetaAttach to allow log to be written earlier 2015-07-18 09:55:13 +02:00
Vincent Herbet
83bc3f518b Fix wrong buffer length 2015-07-17 19:12:02 +02:00
Vincent Herbet
717735311b Fix typo 2015-07-17 17:53:52 +02:00
Vincent Herbet
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
Arkshine
9223989a01 Fix consistency 2015-07-16 08:11:19 +02:00
Vincent Herbet
4ed80b88de Merge pull request #255 from Arkshine/feature/cstrike-gamedata
Update cstrike module - 1
2015-07-15 22:21:08 +02:00
Arkshine
662fa61fc7 Cstrike: Fix typos and improve things 2015-07-15 16:40:07 +02:00
Arkshine
dcc2d91b14 Cstrike: cs_get_user_driving - Add the associated constants from HLSDK 2015-07-14 19:44:10 +02:00
Arkshine
86e33d0cb1 Cstrike: cs_set_user_model - Add a param to choose whether modelindex should be updated 2015-07-14 19:44:10 +02:00
Arkshine
5d6f829624 Cstrike: Rename file for consistency 2015-07-14 19:44:09 +02:00
Arkshine
1ed354890b Cstrike: Add CSI_SHIELD for convenience and fix typos 2015-07-14 19:44:08 +02:00
Arkshine
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
Arkshine
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
Arkshine
aedde87f42 Cstrike: cs_set_user_zoom - Use a more event-based approach when mode is 0 2015-07-14 19:44:07 +02:00
Arkshine
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
Arkshine
81f9a23d16 Cstrike: cs_get_user_armor - Make optional armortype param 2015-07-14 19:44:06 +02:00
Arkshine
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
Arkshine
87d740b92a Cstrike: Add CZ support for some hostage natives 2015-07-14 19:44:05 +02:00
Arkshine
d9a9b7a74e Cstrike: Add support for monster_scientist entity (alias of hostage_entity) 2015-07-14 19:44:05 +02:00
Arkshine
27d6a0cc08 Cstrike: cs_get_hostage_id - Fix error check, an hostage can't be a player 2015-07-14 19:44:04 +02:00
Arkshine
b82588f081 Cstrike: cs_set_user_deaths - Add a param to choose whether scoreboard should be updated 2015-07-14 19:44:04 +02:00
Arkshine
71c6ac8c2e Cstrike: cs_set_no_knives - pfnCreateNamedEntity is now hooked only when needed 2015-07-14 19:44:03 +02:00
Arkshine
2de1f9a33b Cstrike: Do some more cleanup 2015-07-14 19:44:03 +02:00
Arkshine
f13461caee Cstrike: Cache GET_USER_MSG_ID calls 2015-07-14 19:44:02 +02:00
Arkshine
84c320d539 Cstrike: Do some cleanup for the sake of consistency and readability 2015-07-14 19:44:02 +02:00
Arkshine
864e0b88eb Cstrike: Move all hardcoded datas to its own gamedata files 2015-07-14 19:44:01 +02:00
Vincent Herbet
6555ecf6b8 Merge pull request #263 from Sylvert0/master
Fix CS_OnBuyAttempt
2015-07-14 15:55:07 +02:00
Iván Lo Giudice
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
Vincent Herbet
b8dd9d19dd Merge pull request #261 from Arkshine/feature/datapack-memory
Improve DataPack memory allocation
2015-07-14 00:40:15 +02:00
Vincent Herbet
fab9dbf294 Merge pull request #262 from Arkshine/remove-makefile
Remove MakeFile
2015-07-14 00:40:02 +02:00
Arkshine
c0b9b91a06 Remove MakeFile 2015-07-14 00:13:24 +02:00
Arkshine
f7c4ed050f Improve DataPack memory allocation 2015-07-13 23:49:51 +02:00
Arkshine
c775cfca73 More AMTL conversion - 🔥 CString and CVector 2015-07-13 23:37:20 +02:00
Vincent Herbet
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
Valentin Grünbacher
a68df8de7f Engine: Fix bcompat and consistency for CHECK_ENTITY 2015-07-13 15:38:37 +02:00
Vincent Herbet
de71cf469c Merge pull request #258 from Ni3znajomy/fix-mistake-gconfigparser
Fix mistake
2015-07-11 20:40:09 +02:00
Ni3znajomy
cc12f0a0a4 Fix mistake 2015-07-11 20:18:43 +02:00
Vincent Herbet
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
Arkshine
dbc9c7e0da Remove duplicated code of native handles 2015-07-11 18:14:16 +02:00
Arkshine
883c852897 Synchronize AMTL submodule 2015-07-11 14:57:06 +02:00
Vincent Herbet
989034bd41 Attempt to fix mac build 2015-07-11 13:33:30 +02:00
Vincent Herbet
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
Arkshine
f38c726faf Gameconfig: Add game configs natives 2015-07-11 13:16:45 +02:00
Vincent Herbet
b8cc1ac79d Merge pull request #256 from DmitriyS/master
Plugins: Close Array/Trie handles on map end
2015-07-11 00:12:51 +02:00
DmitriyS
e98ab37806 fix memory leaks 2015-07-11 00:39:34 +03:00
Vincent Herbet
846238fe99 Merge pull request #250 from Nextra/enginew
Engine Update
2015-07-02 18:43:35 +02:00
Arkshine
14513e6f70 Gameconfig: Export game config manager to AMXX API 2015-06-29 13:38:34 +02:00
Arkshine
4b2ba10300 Gameconfig: Add game configs parser 2015-06-29 13:38:34 +02:00
Vincent Herbet
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
Arkshine
8633337bbd Fix set_amxstring_utf8 insconsistency 2015-06-29 12:42:57 +02:00
Vincent Herbet
f68a53e46a Fix mac compilation 2015-06-27 16:26:39 +02:00
Vincent Herbet
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
Vincent Herbet
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
WPMGPRoSToTeMa
391991bfce https://bugs.alliedmods.net/show_bug.cgi?id=6372 bugfix 2015-06-15 18:54:29 +03:00
Valentin Grünbacher
7059f5b3b9 Engine: Detour LightStyle to catch all calls, restores set_lights() functionality 2015-06-11 20:49:00 +02:00
Vincent Herbet
3792e7dc20 Merge pull request #248 from Arkshine/fix/update-compiler3
Update compiler - 3
2015-06-01 21:45:04 +02:00
Arkshine
934e0208bf Fix a clang-3.6 compilation issue 2015-06-01 20:19:10 +02:00
Vincent Herbet
26d0f3f2de Merge pull request #247 from ShootingKing-AM/master
Correcting years in MSVS project solutions.
2015-05-19 17:31:58 +02:00
Shooting King
4a58365b2c Correcting SolutionFileFormat version as well 2015-05-19 18:31:19 +05:30
Arkshine
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
Arkshine
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
Shooting King
ad23638913 Correcting years in MSVS project solutions. 2015-05-18 21:54:06 +05:30
Vincent Herbet
b364506cbc Merge pull request #241 from luxxxoor/patch-2
Update cmdmenu.sma
2015-05-17 20:10:22 +02:00
luxxxoor
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
Vincent Herbet
ffa12bfe54 Merge pull request #244 from Arkshine/fix/fakemeta-changelevel
Fix EngFunc_ChangeLevel
2015-05-15 21:29:25 +02:00
Arkshine
e305009e9a Fix EngFunc_ChangeLevel 2015-05-15 19:14:34 +02:00
Vincent Herbet
af7a6e3c87 Merge pull request #243 from Arkshine/fix/namehashset-add-return
Correct NameHashSet::add() return type
2015-05-15 13:27:54 +02:00
Arkshine
6620aa97a8 Correct NameHashSet::add() return type 2015-05-15 10:45:08 +02:00
Valentin Grünbacher
8b6d85eb78 Engine: Add a bunch of missing CHECK_ENTITY() and CHECK_ENTITY_SIMPLE() 2015-05-11 16:15:44 +02:00
Valentin Grünbacher
dc73473394 Engine: Fix CHECK_ENTITY() logic error (0 is not a player) 2015-05-11 16:15:44 +02:00
Valentin Grünbacher
7bf47f90d9 Engine: Use UTF-8 functions where KeyValueData is touched 2015-05-11 16:15:43 +02:00
Valentin Grünbacher
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
Valentin Grünbacher
702f784e44 Engine: Fix get_info_keybuffer() not being able to retrieve local keybuffer 2015-05-11 16:15:43 +02:00
Valentin Grünbacher
679714c8be Engine: Add error path for remove_entity() and unsafe entity ids 2015-05-11 16:15:43 +02:00
Valentin Grünbacher
ff0ca9ba67 Engine: Remove inconsistent error path from entity_get_int() 2015-05-11 16:15:42 +02:00
Valentin Grünbacher
ee0bcc39f1 Engine: Clarify difference between the engine module trace handle and the "real" global trace 2015-05-11 16:15:42 +02:00
Valentin Grünbacher
ebdd015aae Restore traceresult() functionality by writing to g_tr in trace functions 2015-05-11 16:15:42 +02:00
Valentin Grünbacher
3c1022af99 Engine: Add a destination parameter to trace_hull() to make it more useful 2015-05-11 16:15:42 +02:00
Valentin Grünbacher
add4867d21 Engine: Add safe get_global_edict2() and entity_get_edict2() 2015-05-10 23:56:06 +02:00
Valentin Grünbacher
d69fddf8b4 Engine/Core: Move precache_event() to core 2015-05-10 23:45:01 +02:00
Valentin Grünbacher
218fb9c794 Engine: Add unregister_[touch|think|impulse]() 2015-05-10 23:40:22 +02:00
Valentin Grünbacher
c531ad756d Engine: Dynamically hook StartFrame for set_lights() 2015-05-10 23:21:12 +02:00
Vincent Herbet
c5f6e26802 Merge pull request #239 from Nextra/inc-doc3
Update include documentation #3 (mostly engine.inc)
2015-05-10 17:12:50 +02:00
Valentin Grünbacher
fbcbbd8421 hlsdk_const: Add MoveToOrigin move type constants 2015-05-10 14:37:40 +02:00
Valentin Grünbacher
00f9b62ffb cstrike: Add create_entity() note from engine, rewording 2015-05-10 14:37:39 +02:00
Valentin Grünbacher
59d8d2807f engine_const: Add sections and comments 2015-05-10 14:37:36 +02:00
Valentin Grünbacher
d9f792b712 engine: Add documentation, group similar natives 2015-05-10 14:37:16 +02:00
Vincent Herbet
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
Valentin Grünbacher
abf7f1a41b Expose get_amxstring_null and get_amxvector_null to modules 2015-05-06 12:01:15 +02:00
Valentin Grünbacher
fdb180e062 Add NULL_VECTOR 2015-05-06 11:28:54 +02:00
Vincent Herbet
39cc240a4e Merge pull request #240 from Nextra/kvd
Improve handling of KeyValueData
2015-05-05 12:01:29 +02:00
Valentin Grünbacher
79189c86ab Add basic kvd doc to fakemeta.inc and fix ham_const.inc lies 2015-05-05 11:16:26 +02:00
Arkshine
9fd0f1c231 Sync AMTL submodule 2015-04-22 00:55:23 +02:00
Valentin Grünbacher
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
Vincent Herbet
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
Vincent Herbet
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
Vincent Herbet
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
Arkshine
54223e9a99 Use the new Travis-CI Container environment 2015-04-19 20:10:04 +02:00
Arkshine
871e14178b Fix a tag typo in datapack.inc 2015-04-19 19:58:57 +02:00
Arkshine
1c1b949648 Fix potential crash using ke::AString and given null string 2015-04-19 19:52:53 +02:00
Arkshine
b88841c6ef Fix missing SQL_SetCharset native in SQLite 2015-04-12 21:08:03 +02:00
Vincent Herbet
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
Arkshine
10c0204b16 Fix fgets native not setting the plugin buffer on null result 2015-04-12 20:20:21 +02:00
Valentin Grünbacher
a35bc43cab datapack.inc: Fix copy-pasted error description 2015-04-06 13:33:55 +02:00
Vincent Herbet
044e6b22b2 Merge pull request #233 from Ni3znajomy/update-copyright-year
Update copyright year
2015-03-30 13:44:55 +02:00
Vincent Herbet
0b2c33bcd2 Merge pull request #231 from Nextra/datapack-update
Datapack update
2015-03-30 13:43:50 +02:00
Valentin Grünbacher
081b683e03 Update datapack test plugin 2015-03-30 04:14:55 +02:00
Valentin Grünbacher
2166c32047 Make datapack natives error consistently, stop using IsPackReadable 2015-03-30 04:14:55 +02:00
Valentin Grünbacher
1d57677426 Add CanRead[Cell|Float|String|Memory] to CDataPack 2015-03-30 04:14:54 +02:00
Valentin Grünbacher
9abe6cd8f6 Add IsPackEnded native (IsPackReadable replacement) 2015-03-30 04:14:54 +02:00
Valentin Grünbacher
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
Ni3znajomy
92c2c84617 Update copyright year 2015-03-29 20:01:25 +02:00
Vincent Herbet
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
Arkshine
db9421d0be Fix crash in TFCX module when Infection weapon is used 2015-03-28 16:47:07 +01:00
Vincent Herbet
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
Arkshine
8831166705 Add %l format specifier and SetTranslationTarget() native 2015-03-26 22:42:55 +01:00
Vincent Herbet
bebe9f8e2e Merge pull request #230 from Ni3znajomy/fix-checking-cvar-bounds
Fix checking cvar's bounds
2015-03-26 21:49:33 +01:00
Vincent Herbet
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
Ni3znajomy
4d3c49f93b Fix checking cvar's bounds 2015-03-26 21:31:16 +01:00
Freeman-AM
f44ec00133 Plmenu: rollback macros 2015-03-26 21:17:46 +01:00
Vincent Herbet
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
Arkshine
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
Vincent Herbet
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
Arkshine
b6febae2fa Fix crash under linux in Hamsandwich module
Fix crash under linux in Hamsandwich module
2015-03-24 02:18:11 +01:00
Arkshine
8f6b8588c1 VFS: Do not traumatize Nextra 2015-03-23 18:30:22 +01:00
Arkshine
ba11085ddc VFS: Add constant in pawn include to define max path 2015-03-22 11:14:13 +01:00
Arkshine
71ab8d560e VFS: Add more sane FileRead/Write* natives to read/write a single value 2015-03-22 11:14:12 +01:00
Arkshine
a580c8c5e5 VFS: Add SetFilePermissions native 2015-03-22 11:13:36 +01:00
Arkshine
0eeb5942a1 VFS: Reflect changes in natives and documentation 2015-03-22 11:12:21 +01:00
Arkshine
6434c4db77 VFS: Update AMbuild and VS project files 2015-03-22 11:08:22 +01:00
Arkshine
4f4e322ad4 VFS: Add helpers to wrap default and valve system file 2015-03-22 11:00:33 +01:00
Arkshine
553963295f VFS: Add Valve file system interface 2015-03-22 11:00:33 +01:00
Arkshine
d69ddc7234 VFS: Add LibrarySys class helper 2015-03-22 11:00:32 +01:00
Freeman-AM
c156c220c4 Replace some arrays by bitfield macros 2015-03-21 16:14:14 +01:00
Vincent Herbet
a182ca62c8 Merge pull request #226 from Arkshine/fix/compiler
Fix compiler output
2015-03-21 15:38:25 +01:00
Arkshine
d397619939 Fix compiler output 2015-03-21 15:29:55 +01:00
Freeman-AM
5413c59bc7 plmenu: improve readability, more compliance to amxmodx style 2015-03-21 13:54:39 +01:00
Valentin Grünbacher
4fbf4ee03d Merge datapack updates from SoureMod 2015-03-15 22:38:49 +01:00
Arkshine
32e1908859 Add submodule support in checkout-deps.sh 2015-03-14 13:23:47 +01:00
Arkshine
dd6ef4811c Update compiler VS projects to reflect changes from #221 2015-03-14 12:53:43 +01:00
Arkshine
3d5a0c5a29 Normalize more line endings 2015-03-14 12:45:33 +01:00
Vincent Herbet
dbe79790dc Merge pull request #225 from xPaw/modules-folder
Move dlls/ to modules/
2015-03-13 14:38:42 +01:00
xPaw
fddebce313 Update modules paths 2015-03-13 15:23:05 +02:00
xPaw
e09f434ed8 Move dlls/ to modules/ 2015-03-13 15:18:47 +02:00
Vincent Herbet
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
Arkshine
2204a83ec0 Update AMBuilder, VS and MakeFile files 2015-03-13 11:13:42 +01:00
Arkshine
aa629a76e7 Move SQLite and GeoIP2 libs to /third_party 2015-03-13 11:12:53 +01:00
Vincent Herbet
f83e7f0071 Merge pull request #223 from 9iky6/patch-14
Add missing SVC Messages
2015-03-12 19:57:52 +01:00
9iky6
463de74865 Update message_const.inc 2015-03-12 22:50:49 +05:00
9iky6
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
Vincent Herbet
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
xPaw
0ccb99137a Make spcomp2 cry less 2015-03-11 15:19:27 +02:00
Vincent Herbet
a25090de4b Merge pull request #221 from xPaw/burn-scpack
Remove scpack
2015-03-10 19:52:29 +01:00
xPaw
8b06e5bdcd Remove strexpand 2015-03-10 20:37:57 +02:00
xPaw
a134a75572 Remove scpack 2015-03-10 20:03:57 +02:00
Vincent Herbet
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
Arkshine
48d6a3354a Normalize all the line endings 2015-03-10 16:51:45 +01:00
Vincent Herbet
afc3cac54d Merge pull request #219 from xPaw/gitattributes
Add gitattributes
2015-03-10 16:50:10 +01:00
Arkshine
acf910b64b Fix and clean up VS projects files
+ removed unused variable :P
2015-03-10 16:20:21 +01:00
Arkshine
aaafe0f3f2 Compile Hashing lib as static and link to AMXX 2015-03-10 12:15:46 +01:00
Arkshine
c03bb3693e Move Zlib and Hashing libs to third_party directory 2015-03-10 12:08:26 +01:00
xPaw
910c921d5d Add gitattributes 2015-03-10 11:11:49 +02:00
Vincent Herbet
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
Vincent Herbet
73cf46ff45 Merge pull request #216 from luxxxoor/patch-1
Some missing charsmax and more readability.
2015-03-10 00:27:35 +01:00
Vincent Herbet
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
Arkshine
9542fce9c5 Zlib: Update AMBuilder 2015-03-10 00:12:56 +01:00
Arkshine
5f6756cb4d Zlib: Remove unrelated changes 2015-03-10 00:06:30 +01:00
Arkshine
e60a2e9fcc Zlib: Fix compilation (implicit-function-declaration error) 2015-03-10 00:06:30 +01:00
Arkshine
a565e4a7b1 Zlib: Update library to 1.2.8 2015-03-10 00:06:29 +01:00
Arkshine
265e15116b Zlib: Adjust VS project files 2015-03-10 00:06:29 +01:00
Arkshine
85b7c26bb0 Zlib: Use the generated static library with MySQL module 2015-03-09 23:59:57 +01:00
Arkshine
9bbeb1f578 Zlib: Use the generated static library with AMXXPC 2015-03-09 23:59:12 +01:00
Arkshine
47cd091879 Zlib: Use the generated static library with AMXX 2015-03-09 23:59:11 +01:00
Arkshine
6ac5211062 Zlib: Compile as static library 2015-03-09 23:59:11 +01:00
Arkshine
25b1fa6fe0 Zlib: Add latest library version in /public directory 2015-03-09 23:59:10 +01:00
Vincent Herbet
dcae6a8a20 Merge pull request #218 from Arkshine/feature/amtl-upstream
Use upstream AMTL as a submodule
2015-03-09 23:25:15 +01:00
Arkshine
1ebd9044ca Fix AppVeyor 2015-03-09 23:12:27 +01:00
Arkshine
181cbae74c Use upstream AMTL as a submodule 2015-03-09 22:53:58 +01:00
luxxxoor
205a0eb2da admincmd.sma: Missing charsmax and more readability.
Fix charsmax and more readability
2015-03-09 23:35:04 +02:00
Vincent Herbet
22c3d62dec Merge pull request #208 from Nextra/inc-doc2
Update include documentation #2
2015-03-09 19:45:47 +01:00
Freeman-AM
a82f521633 amxmodx.inc: missing commas, typo errors... 2015-03-09 19:41:21 +01:00
Valentin Grünbacher
bc9710e8f2 inc-doc2 nits/finishing touches 2015-03-09 19:41:21 +01:00
Valentin Grünbacher
902cecb0c3 amxconst: Minor improvements on client_print natives 2015-03-09 19:41:20 +01:00
Valentin Grünbacher
950f3f97c1 datapack: Tabs->spaces, consistency, nuke IsPackReadable 2015-03-09 19:41:19 +01:00
Valentin Grünbacher
828d9971a4 cvars: Style touchups, add missing stuff, update notes about named access 2015-03-09 19:41:18 +01:00
Valentin Grünbacher
50fea6be75 cstrike/csx/csstats: Added documentation, consistency updates, typo fixes 2015-03-09 19:41:18 +01:00
Valentin Grünbacher
a1c5c20d7e amxmodx: Consistency updates, typo fixes, missing return/error added 2015-03-09 19:41:17 +01:00
Valentin Grünbacher
ae86152282 cellarray/celltrie/cellstack: Documentation fixes and consistency updates 2015-03-09 19:41:16 +01:00
Valentin Grünbacher
9eb0eaf6a6 core: Add documentation 2015-03-09 19:41:15 +01:00
Valentin Grünbacher
5f278eee7b amxmisc: Documentation updates and additions 2015-03-09 19:41:15 +01:00
Vincent Herbet
362a7e61f9 Merge pull request #214 from 9iky6/patch-13
Update menufront.sma
2015-03-09 14:47:08 +01:00
xPaw
379d9121b4 Remove version checks from all include files 2015-02-25 00:56:17 +02:00
9iky6
09ed8eb2b1 Update menufront.sma 2015-02-23 02:21:20 +05:00
9iky6
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
Vincent Herbet
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
Vincent Herbet
62413f6277 Merge pull request #213 from ClaudiuHKS/CLang_mTime
Replace CLang file hashing with .st_mtime
2015-02-19 21:11:10 +01:00
HttrckCldHKS
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
Arkshine
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
Vincent Herbet
2b9e9c79b9 Merge pull request #207 from ClaudiuHKS/MySQLThreadingFix
Fix SQL Modules Threading
2015-02-18 19:34:18 +01:00
HttrckCldHKS
3fc438ffd1 Fix SQL modules threading system. 2015-02-18 10:32:45 +02:00
Vincent Herbet
3b16c6be92 Merge pull request #210 from Nextra/destroy-invalid
Fix ArrayDestroy/DestroyStack erroring on invalid handle
2015-02-18 00:44:26 +01:00
Valentin Grünbacher
78f577686a Fix ArrayDestroy/DestroyStack erroring on null handle 2015-02-17 23:24:17 +01:00
Vincent Herbet
af6c6850ec Merge pull request #206 from ClaudiuHKS/master
Add new hashers and new natives
2015-02-17 14:34:38 +01:00
HttrckCldHKS
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
HttrckCldHKS
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
Vincent Herbet
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
HttrckCldHKS
ddb1af89e9 Added new FP_CELL to SQLite Forward
Added new FP_CELL to SQLite Forward.
2015-02-13 09:08:27 +02:00
Vincent Herbet
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
Arkshine
120e5b94f9 Fix crash by freeing memory the right way 2015-02-12 14:37:46 +01:00
Vincent Herbet
4ec11496e6 Fix missing new lines in "amxx version" command 2015-02-12 10:46:20 +01:00
Vincent Herbet
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
Arkshine
fb28b2d416 Fix missing parenthesis. 2015-02-11 00:18:22 +01:00
Arkshine
e99a1c8b09 Fix crash when cvar hook detour is not created 2015-02-10 23:19:03 +01:00
Vincent Herbet
0b80c4367d Merge pull request #201 from Arkshine/cleanup-geoip-code
Cleanup some code from previous commits
2015-02-08 11:24:37 +01:00
Arkshine
e95d5ed43c Cleanup some code from previous commits 2015-02-08 11:23:54 +01:00
Vincent Herbet
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
HttrckCldHKS
780ce669d0 >> RENAMED maxminddb.cpp (FILTERS)
RENAMED maxminddb.cpp TO maxminddb.c (FILTERS)
2015-02-07 18:42:01 -08:00
HttrckCldHKS
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
HttrckCldHKS
2bc6ced671 >> RENAMED maxminddb.cpp (MAKEFILE)
RENAMED maxminddb.cpp TO maxminddb.c (MAKEFILE)
2015-02-07 18:39:21 -08:00
HttrckCldHKS
f4738600b4 Merge pull request #1 from ClaudiuHKS/ClaudiuHKS-patch-1
>> RENAMED maxminddb.cpp (VCXPROJ)
2015-02-07 18:37:00 -08:00
HttrckCldHKS
83c0789246 >> RENAMED maxminddb.cpp (VCXPROJ)
>> RENAMED maxminddb.cpp TO maxminddb.c (VCXPROJ)
2015-02-07 18:34:46 -08:00
Vincent Herbet
0424aa7c19 Merge pull request #148 from Arkshine/update-sqllite
Update sqlite
2015-02-07 18:23:03 +01:00
Vincent Herbet
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
Arkshine
77762b9c2c Fix typo in documentation 2015-02-07 17:51:30 +01:00
Arkshine
34de3964e6 More cleanup 2015-02-07 16:33:48 +01:00
Arkshine
5241fdf673 Add geoip_country_ex, mark geoip_country as deprecated, and do some cleanup 2015-02-07 16:26:40 +01:00
Arkshine
51adb7385c Fix a compatibility issue with geoip_country native 2015-02-06 23:25:26 +01:00
Vincent Herbet
21edabf07f Merge pull request #197 from Arkshine/fix/osx-compilation-free
Fix OSX compilation
2015-02-06 22:10:43 +01:00
Arkshine
7d6705345d Fix OSX compilation 2015-02-06 22:08:32 +01:00
Vincent Herbet
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
Vincent Herbet
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
Arkshine
c93995a827 Fix missing libm linkage (math functions like floor, etc.) 2015-02-06 21:37:14 +01:00
Freeman-AM
35eeb6036d missing alignment 2015-02-06 01:36:32 +01:00
Freeman-AM
9e5810e615 amxmisc.inc: Missing charsmax, more readability, more compliance to amxmodx style 2015-02-06 01:32:33 +01:00
Vincent Herbet
a51904b13f Merge pull request #192 from Arkshine/fix/max_players
Change MAX_PLAYERS value to 32
2015-02-03 10:58:39 +01:00
Vincent Herbet
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
Arkshine
604f227751 Sqlite: Update broken VS project files 2015-02-02 11:22:45 +01:00
Arkshine
61063a54ef Sqlite: Update library to 3.8.8.2 2015-02-02 11:06:07 +01:00
Arkshine
162171618c Sqlite: Update library to 3.8.7.
Sqlite: Update project files.
2015-02-02 11:06:05 +01:00
Arkshine
14f06ca1bb MAX_PLAYERS: Fix moar 2015-02-01 21:45:16 +01:00
Arkshine
c47896232c CStrike: Fix crash 2015-02-01 20:43:06 +01:00
Arkshine
91c4b5d708 MAX_¨PLAYERS: Fix more. 2015-02-01 20:34:35 +01:00
Arkshine
e441908230 MAX_PLAYERS: Fix plugins 2015-02-01 19:25:36 +01:00
Arkshine
1b350b627b MAX_PLAYERS: Change value in includes 2015-02-01 18:40:20 +01:00
Vincent Herbet
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
Vincent Herbet
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
Vincent Herbet
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
Arkshine
30ee4df0fa Fix typo 2015-01-31 15:38:35 +01:00
Arkshine
4ceb767022 Add error messages and fix documentation 2015-01-31 14:45:37 +01:00
Arkshine
b0543a111d Fix tagof operator used as a default value for function arguments 2015-01-30 23:34:04 +01:00
Freeman-AM
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
Arkshine
e0426f10b2 Fix typo 2015-01-30 16:01:26 +01:00
Vincent Herbet
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
Arkshine
c87d46ad5b Add cs_find_ent_by_class and fix documentation 2015-01-30 15:53:25 +01:00
Vincent Herbet
7d084ee0bf Merge pull request #185 from Arkshine/feature/hooking-cvars
Introduce new features for cvars
2015-01-30 14:20:11 +01:00
Freeman-AM
cfc92ca3db Plmenu: small update: formatex, semicolon, missing things, remove useless TABs 2015-01-30 00:57:45 +01:00
Arkshine
1488b9747f Cvars: De-frenchify by Nextra 2015-01-29 21:44:53 +01:00
Arkshine
2446ff49f2 Add cs_create_entity native 2015-01-29 20:43:01 +01:00
Arkshine
98d4031b5c Add a new line at the end to not traumatize Nextra 2015-01-29 17:55:24 +01:00
Vincent Herbet
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
Vincent Herbet
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
Arkshine
9f93ff5168 Fix potential formatting issue with nvault_[p]set 2015-01-29 16:52:47 +01:00
Freeman-AM
839bb086b1 Wrong product version for amxmodx-installer.nsi 2015-01-29 14:58:07 +01:00
Arkshine
a5b5c7e9cd Cvars: Fix code to avoid Nextra be confused 2015-01-29 14:01:58 +01:00
Arkshine
f8ec7f94a4 Mysql: Establish a default timeout 2015-01-29 13:50:13 +01:00
Arkshine
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
Arkshine
187b187ef2 Cvars: To not traumatize Nextra 2015-01-28 00:58:07 +01:00
Arkshine
ac50f3ff34 Cvars: Check lower/upper bounds in create_cvar as well 2015-01-28 00:47:01 +01:00
Arkshine
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
Arkshine
1a5e1928ec Cvars: Fix field orders and linux compilation 2015-01-27 16:27:26 +01:00
Arkshine
d75b14d4af Cvars: Extend "amxx cvars" command output 2015-01-27 15:07:17 +01:00
Vincent Herbet
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
Arkshine
356a981164 Cvars: Add get/set_pcvar_bool natives 2015-01-26 14:26:48 +01:00
Arkshine
8a241ed0fd Cvars: Add new description param in get_plugins_cvar 2015-01-25 11:38:01 +01:00
Arkshine
cb0b9da51f Cvars: Add bind_pcvar_num/float/string 2015-01-24 21:31:00 +01:00
Arkshine
8ebb7be36d Cvars: Add get|set_pcvar_bounds natives 2015-01-24 15:04:49 +01:00
Arkshine
a05d0df50e Cvars: Add create_cvar native with more options (description, bounds) 2015-01-23 19:05:34 +01:00
Arkshine
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
Arkshine
768fa2c3bc Cvars: Add hook_cvar_change, [enable|disable]_cvar_hook natives 2015-01-23 19:05:33 +01:00
Arkshine
0db5963641 Cvars: Remove global forward 2015-01-23 19:05:33 +01:00
Arkshine
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
Arkshine
f973f5beb7 Cvars: Convert CString to ke::AString in CCVar class 2015-01-23 19:05:32 +01:00
Arkshine
6619176a76 Cvars: Move CCVar class to cvars.h 2015-01-23 19:05:31 +01:00
Arkshine
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
Arkshine
34d91789c4 Cvars: Hook Cvar_DirectSet from engine library 2015-01-23 19:05:30 +01:00
Arkshine
cdfd789f56 Rename change_level to engine_changelevel 2015-01-23 16:55:16 +01:00
Vincent Herbet
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
Vincent Herbet
c197b58734 Merge pull request #183 from Arkshine/fix/cstrike-remove-stringtolower
Remove use of UTIL_StringToLowwer
2015-01-20 12:04:06 +01:00
Arkshine
8072f90536 Remove use of UTIL_StringToLowwer 2015-01-20 11:53:46 +01:00
Vincent Herbet
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
Vincent Herbet
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
Arkshine
c3e0753455 Fix a mysql crash after CString -> ke::AString conversion 2015-01-18 18:13:39 +01:00
Arkshine
03e426fc28 Add FCVAR_NOEXTRAWHITEPACE in amxconst.inc 2015-01-16 23:21:01 +01:00
Vincent Herbet
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
Arkshine
314f2ec568 Geoip: Fix linux compilation 2015-01-14 12:37:43 +01:00
Arkshine
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
Vincent Herbet
6703841c35 Merge pull request #179 from Arkshine/fix/update-vs-projects
Update VS projects
2015-01-14 10:50:08 +01:00
Arkshine
dd9975cd67 Rename msvc10 directories to msvc12 2015-01-14 10:31:33 +01:00
Arkshine
97369c5d6c Upgrade VS projetcs to use v120_xp toolset and fix missing include paths 2015-01-14 10:25:46 +01:00
Vincent Herbet
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
Arkshine
16874378f1 Geoip: Update libmaxminddb to 1.0.4 2015-01-12 00:00:31 +01:00
Arkshine
a0cfa59e56 Compiler: Fix tautological warning with clang-3.5 2015-01-11 23:09:53 +01:00
Arkshine
b4399f42da Geoip: Move C99 headers in its own directory 2015-01-11 16:08:52 +01:00
Vincent Herbet
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
Arkshine
539823f565 Keep geoip_country backward compatible after #99 2015-01-10 14:07:51 +01:00
Vincent Herbet
4a3fcdb937 Merge pull request #171 from Arkshine/fix/geoip-invalid-memory
Geoip: Fix possible crash
2015-01-08 10:37:36 +01:00
Vincent Herbet
0bc20edb5b Merge pull request #174 from Arkshine/fix/mac-compilation
Attempt to fix OSX compilation
2015-01-07 19:22:23 +01:00
Arkshine
bab760897b Attempt to fix OSX compilation 2015-01-07 19:23:23 +01:00
Vincent Herbet
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
Arkshine
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
Arkshine
de2796508f Add string literal concatenation and stringizing operator 2015-01-06 23:39:46 +01:00
Vincent Herbet
aa8170ecfd Merge pull request #172 from Arkshine/fix/osx-compilation
Fix OSX compilation
2015-01-06 23:26:22 +01:00
Arkshine
4fc2b4ed64 Fix OSX compilation 2015-01-06 23:27:51 +01:00
Vincent Herbet
604200e905 Merge pull request #162 from Arkshine/feature/update-amtl-c++11
Add C++11 support
2015-01-06 22:38:19 +01:00
Arkshine
a543db5dc6 Geoip: Fix possible crash 2015-01-06 22:36:14 +01:00
Vincent Herbet
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
Freeman-AM
0c85f03f05 meta_api.cpp modify csstats_rank value to match amxx.cfg default value 2015-01-05 17:43:14 +01:00
Vincent Herbet
b883486308 Merge pull request #168 from Ni3znajomy/master
Updated dictionary plmenu.txt
2014-12-28 21:19:05 +01:00
Karol Szuster
e7e9994b73 Updated PL translations
Updated PL translations
2014-12-28 20:56:52 +01:00
Karol Szuster
47d6f849f2 Added missing dictionary's key to PL translation.
Added TRANSF_SILENT key to PL translation.
2014-12-28 20:55:54 +01:00
Vincent Herbet
59b7379db4 Merge pull request #167 from Freeman-AM/typo-errors
Users.ini: fix 2 typo errors
2014-12-23 19:31:53 +01:00
Freeman-AM
e042550ba4 Users.ini: fix 2 typo errors 2014-12-23 19:00:33 +01:00
Vincent Herbet
15528c9583 Merge pull request #166 from rsKliPPy/set_task
Set task
2014-12-17 14:33:28 +01:00
KliPPy
f3dfc6e4c6 Add any: tag to set_task parameter[] 2014-12-14 19:00:15 +01:00
Vincent Herbet
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
Arkshine
c068eed19d Simplify code. 2014-12-13 11:15:06 +01:00
Arkshine
ab4294f3ca Fix linux compilation 2014-12-10 15:41:52 +01:00
Arkshine
f4a3d07b0e Fix missing binary suffix 2014-12-10 15:05:47 +01:00
Arkshine
4b11a54345 Make sure overriden tag is done with _: 2014-12-09 22:59:57 +01:00
Arkshine
78940b46a4 Untabify code 2014-12-09 22:29:43 +01:00
Arkshine
45bf43d76e FIx regression with member tag of an enum not being checked on assigment 2014-12-09 22:26:59 +01:00
Vincent Herbet
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
Arkshine
5e622aa69f Remove static on 'disable' variable 2014-12-08 23:55:30 +01:00
Arkshine
a50f104fd3 Fix trailing commas in array literals changing the result of sizeof() 2014-12-08 20:45:33 +01:00
Arkshine
8443a836aa Add the actual version.rc file for all modules 2014-12-08 01:44:51 +01:00
Arkshine
f5e23903a2 Add version.rc in AMBuilder for all modules 2014-12-08 01:44:27 +01:00
Arkshine
291a33ce65 Update moduleconfig.h for all modules 2014-12-08 01:43:33 +01:00
Arkshine
7c96c30be8 Replace old SVN_* defines by the new ones 2014-12-08 01:42:42 +01:00
Arkshine
3594c11238 Update versioning 2014-12-08 01:39:10 +01:00
Arkshine
1977bf4d29 C++11: Update AMBuildScript 2014-12-06 14:33:22 +01:00
Arkshine
1146bcad2c C++11: Fix some code 2014-12-06 14:02:55 +01:00
Arkshine
1199863e47 C++11: Update StringHashMap 2014-12-06 14:01:17 +01:00
Arkshine
590e6b1258 C++11: Sync AMTL libraries from upstream 2014-12-06 14:00:15 +01:00
Vincent Herbet
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
9iky6
015e4f2f33 fix_alive_spectator
Fix invisible living the spectators
2014-11-21 20:56:06 +06:00
Vincent Herbet
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
Arkshine
4ffd847b7a Fix typo in get_user_name() where hostname was returned as blank string 2014-11-13 19:01:26 +01:00
Vincent Herbet
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
Arkshine
1a97b2cbe1 Improve more sizeof return on array without specifiying the dimension 2014-11-11 12:34:16 +01:00
Vincent Herbet
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
Semen Ermilov
3775ac40ad Revert "Done" text due to AMXX-Studio compatibility. 2014-11-09 04:04:33 +03:00
Vincent Herbet
666aaf013a Merge pull request #156 from 9iky6/patch-11
Fix stock regex_match_simple
2014-11-07 14:57:12 +01:00
9iky6
63aff82dc8 Update regex.inc 2014-11-07 18:11:55 +05:00
9iky6
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
Vincent Herbet
d5086f6a54 Merge pull request #154 from ClaudiuHKS/master
Add MySQL Reconnect Feature
2014-10-28 10:15:30 +01:00
HttrckCldHKS
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
Vincent Herbet
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
Vincent Herbet
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
Arkshine
b451fbd1c8 Fix specialbot not working with [Enable/Disable]HamForward natives 2014-10-25 20:44:17 +02:00
Vincent Herbet
419bdecc20 Merge pull request #149 from Arkshine/improve-get_map_objectives
Improve get_map_objectives native
2014-10-25 12:10:32 +02:00
Vincent Herbet
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
Vincent Herbet
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
Arkshine
cfcd6e9ac9 Allow find_ent_by_owner native to work in client_disconnect forward 2014-10-25 11:08:31 +02:00
Arkshine
1bd022305f Add MSG_INIT support in messsage_begin native (bug 6254) 2014-10-24 21:04:42 +02:00
Arkshine
d0ab27092c Allow show_menu native to send empty text and add reset_menu stock (bug 6244) 2014-10-24 20:36:38 +02:00
Arkshine
850ae540a9 Improve get_map_objectives native. 2014-10-24 12:58:24 +02:00
Vincent Herbet
b2aa84ddbd Merge pull request #147 from Arkshine/fix-linux-warning
Fix linux warning in previous commit
2014-10-24 11:43:04 +02:00
Arkshine
9cf4564057 Fix linux warning in previous commit 2014-10-24 11:25:52 +02:00
Vincent Herbet
d8fc093fd8 Merge pull request #143 from ClaudiuHKS/master
Colored Menus and GeoIP Bug Fix
2014-10-18 20:18:29 +02:00
HttrckCldHKS
3953db97cd Improving Code 2014-10-18 11:11:10 -07:00
HttrckCldHKS
d1c0b8fea6 Improving Code 2014-10-18 11:09:49 -07:00
HttrckCldHKS
7ced590cbc Improving Code 2014-10-18 11:04:10 -07:00
HttrckCldHKS
82cbc94f27 Improving Code 2014-10-18 10:58:26 -07:00
HttrckCldHKS
5d2b738ec1 Improving Code 2014-10-18 10:36:07 -07:00
HttrckCldHKS
59a1b018ed Improving Code 2014-10-18 10:34:03 -07:00
HttrckCldHKS
3615e717ca Adding New Game Modifications Due Colored Menus
Adding New Game Modifications Due Colored Menus.
2014-10-18 10:10:58 -07:00
HttrckCldHKS
e08e140c3c Fixed Switch Statement
Fixed Switch Statement.
2014-10-18 10:10:09 -07:00
HttrckCldHKS
aa963603ed Adding New Game Modifications Due Colored Menus
Adding New Game Modifications Due Colored Menus.
2014-10-18 10:09:11 -07:00
Vincent Herbet
3894e53cf6 Merge pull request #141 from Freeman-AM/master
Removal of many hardcoded contents (part 1)
2014-10-13 10:18:32 +02:00
Freeman-AM
94a4be95fe Nextmap: replace len hardcoded content by charsmax and sizeof 2014-10-12 02:11:07 +02:00
Freeman-AM
2db8156326 Plmenu: replace len hardcoded content by charsmax 2014-10-12 01:41:58 +02:00
Freeman-AM
6bb9052261 Mapchooser: missing MAX_NAME_LENGTH 2014-10-12 00:59:08 +02:00
Freeman-AM
c440929700 Stats: Replace len hardcoded contents by charsmax and sizeof 2014-10-11 23:17:20 +02:00
Freeman-AM
c2ee729380 Stats_logging: Replace len hardcoded contents by charsmax 2014-10-11 22:41:18 +02:00
Freeman-AM
4e343f65bd Stats_logging: Replace len hardcoded contents by charsmax 2014-10-11 22:31:11 +02:00
Freeman-AM
15b160e51a Stats: Replace len hardcoded contents by charsmax and sizeof 2014-10-11 21:29:10 +02:00
Freeman-AM
2a5fae43b8 Plmenu: replace len hardcoded content by charsmax 2014-10-11 20:55:24 +02:00
Freeman-AM
59cb65f47a Timeleft: replace len hardcoded content by charsmax and sizeof 2014-10-11 19:51:57 +02:00
Freeman-AM
93d37a6366 Plmenu: replace len hardcoded content by charsmax 2014-10-11 19:07:24 +02:00
Freeman-AM
6e183f3e64 Plmenu: fix typos errors from previous commit 2014-10-11 19:05:25 +02:00
Freeman-AM
3776650a38 Nscommands: remove an hardcoded value 2014-10-11 18:13:08 +02:00
Freeman-AM
7e9e2b7b58 Stats: more use of sizeof 2014-10-11 17:55:42 +02:00
Freeman-AM
6e525ea8fe Statsx: more use of sizeof 2014-10-11 17:46:29 +02:00
Freeman-AM
8d4a1ca359 Restmenu: more use of sizeof 2014-10-11 17:04:12 +02:00
Freeman-AM
ea23bdb579 Nscommands: replace len hardcoded content by charsmax 2014-10-11 16:20:49 +02:00
Freeman-AM
cff3ab867a Nextmap: replace len hardcoded content by charsmax and sizeof 2014-10-11 16:00:11 +02:00
Freeman-AM
8071b895d2 Idlekicker: replace len hardcoded content by sizeof 2014-10-11 14:39:34 +02:00
Freeman-AM
8b9c107a03 Stats: Replace len hardcoded contents by sizeof + fix typo error in previous commit 2014-10-11 14:31:56 +02:00
Freeman-AM
ee6285c79d Statsx: Replace len hardcoded contents by sizeof 2014-10-11 14:10:36 +02:00
Freeman-AM
54ab06493a Restmenu: fix a typo error induced by previous commit 2014-10-11 14:07:38 +02:00
Freeman-AM
97aac34dc9 Miscstats: replace len hardcoded content by sizeof 2014-10-11 14:02:15 +02:00
Vincent Herbet
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
Valentin Grünbacher
41d7554efd Fix recursion issues with show_menu and newmenus 2014-10-11 00:35:05 +02:00
Freeman-AM
d7911d8f3f Mapchooser: replace len hardcoded content by charsmax 2014-10-08 23:47:51 +02:00
Freeman-AM
7ba6f72825 Idlekicker: replace len hardcoded content by charsmax 2014-10-08 23:31:00 +02:00
Freeman-AM
9a9dd7a4ad Stats_logging: replace len hardcoded content by charsmax 2014-10-08 23:24:48 +02:00
Freeman-AM
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
Freeman-AM
0a4cd13622 Plmenu: replace len hardcoded content by charsmax 2014-10-08 21:49:00 +02:00
Freeman-AM
91dfec4ef7 Statsx: Replace len hardcoded contents by charsmax 2014-10-08 15:03:51 +02:00
Freeman-AM
0237153ddd Stats_logging: Replace len hardcoded contents by charsmax 2014-10-08 14:32:03 +02:00
Freeman-AM
71f011c70d Restmenu: replace len hardcoded content by charsmax and sizeof 2014-10-08 14:21:53 +02:00
Vincent Herbet
581f734099 Merge pull request #139 from 9iky6/patch-10
Update engine_stocks.inc
2014-10-05 15:42:21 +02:00
9iky6
8ea62d22cb Update engine_stocks.inc
When compiling was varningov , and the function itself was crooked written
2014-10-05 16:19:47 +06:00
Vincent Herbet
f8b2d26a00 Merge pull request #137 from Arkshine/update-compiler-2
Update compiler - 2
2014-09-29 20:42:17 +02:00
Arkshine
3b3e78d65b Compiler: Remove commented code in previous commit 2014-09-29 20:36:14 +02:00
Vincent Herbet
a8efe40293 Merge pull request #138 from Arkshine/sync-amtl
Sync AMTL from upstream
2014-09-29 19:05:58 +02:00
Arkshine
35e661fdf9 Sync AMTL from upstream 2014-09-29 18:36:37 +02:00
Vincent Herbet
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
Arkshine
199b41af0a Compiler: Treat pawn warnings as errors when building 2014-09-29 15:55:16 +02:00
Arkshine
e7c7313f77 Compiler: Add a flag for warnings-as-errors 2014-09-29 15:54:39 +02:00
Arkshine
ae2699ca98 Compiler: Disable estimated memory usage 2014-09-29 15:12:56 +02:00
Freeman-AM
2bae36e8eb Replace hardcoded defines in adminhelp with cvars 2014-09-28 18:02:16 +02:00
Freeman-AM
12c08ddcdb Update core to use amx_language cvar instead of vault 2014-09-28 17:59:01 +02:00
Freeman-AM
f1f2d9f98a Replace hardcoded defines in adminhelp with cvars 2014-09-28 17:48:16 +02:00
Freeman-AM
47d2da259b Update core to use amx_language cvar instead of vault 2014-09-28 17:41:48 +02:00
Vincent Herbet
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
Freeman-AM
83873aa7f7 Stats: Add full UTF-8 symbols support 2014-09-21 02:39:09 +02:00
Freeman-AM
9a1b7b0a63 Statsx: Add full UTF-8 symbols support 2014-09-21 00:42:03 +02:00
Vincent Herbet
a350be335b Merge pull request #134 from WildCard65/master
Fix typo in modules.cpp
2014-09-20 02:51:05 +02:00
WildCard65
a676d9ea52 Fix typo in modules.cpp
Ya...
2014-09-19 20:45:44 -04:00
Vincent Herbet
598936be46 Merge pull request #133 from Arkshine/sync-amtl
Sync AMTL
2014-09-18 19:41:51 +02:00
Vincent Herbet
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
Vincent Herbet
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
Arkshine
c1dca680f2 Don't remove this return 2014-09-18 19:35:29 +02:00
Arkshine
d4b0444d7a Sync AMTL 2014-09-18 19:29:58 +02:00
Arkshine
d9efe61030 Fix typo in #99 (reported by Hattrick) 2014-09-18 19:24:37 +02:00
Arkshine
a93886fb65 Fix unreachable code warning (reported by kwpd) 2014-09-18 19:17:00 +02:00
Vincent Herbet
87774ae21f Merge pull request #130 from Arkshine/fix-regression
Fix a crash regression in #112
2014-09-15 13:27:49 +02:00
Arkshine
19e06100b2 Fix a crash regression in #112 2014-09-15 09:57:38 +02:00
Vincent Herbet
e8acb93b99 Merge pull request #75 from LittleKu/patch-1
Add chinese language
2014-09-04 23:25:11 +02:00
LittleKu
4d0d865700 Update stats_dod.txt 2014-09-04 13:57:10 +08:00
LittleKu
8bd81ee883 Update restmenu.txt 2014-09-04 12:33:53 +08:00
LittleKu
8b0a8737b8 Update plmenu.txt 2014-09-04 12:19:59 +08:00
LittleKu
c111f59825 Update pausecfg.txt 2014-09-04 12:14:27 +08:00
LittleKu
f2ba295668 Update nextmap.txt 2014-09-04 11:59:54 +08:00
LittleKu
01dbd4093b Update statscfg.txt 2014-09-04 11:58:05 +08:00
Vincent Herbet
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
Arkshine
de85f2735e Fix compiler crash due to missing recursion message warning. 2014-08-31 14:52:24 +02:00
Vincent Herbet
39cf32879d Merge pull request #127 from Ni3znajomy/master
Fix a typo in the documentation.
2014-08-29 22:04:14 +02:00
Karol Szuster
47413928c8 Fix a typo in documentation. 2014-08-29 16:48:30 +02:00
Vincent Herbet
1463103cd7 Merge pull request #116 from Arkshine/update-compiler-safe-fix-feature
Update compiler
2014-08-26 09:07:45 +02:00
Arkshine
f30c7a63b1 Compiler: Fix linux compilation and close file handle on success in pc_opensrc. 2014-08-26 09:06:02 +02:00
Arkshine
e46785a434 Compiler: Improve/fix recursion detection.
Imported from Pawn 3.2.3664 and 3.3.3875.
2014-08-26 09:05:23 +02:00
Arkshine
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
Arkshine
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
Arkshine
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
Arkshine
c2ca5d857d Compiler: Change __line to __LINE__. 2014-08-26 09:05:17 +02:00
Arkshine
27825963f6 Compiler: Fix indentation. 2014-08-26 09:05:15 +02:00
Arkshine
ca7b0ceadd Compiler: Revert "Add #warning directive."
Probably not that useful.
2014-08-26 09:05:13 +02:00
Arkshine
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
Arkshine
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
Arkshine
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
Arkshine
e1445316aa Compiler: Fix moar. 2014-08-26 09:05:07 +02:00
Arkshine
238e3707c8 Compiler: Fix linux compilation. 2014-08-26 09:05:05 +02:00
Arkshine
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
Arkshine
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
Arkshine
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
Arkshine
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
Arkshine
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
Arkshine
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
Arkshine
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
Arkshine
92255bcdc3 Compiler: Fix crash when using tagof(tagname:)
Imported from SA-MP: 53ef10ffc7
2014-08-26 09:04:52 +02:00
Arkshine
b2442a2268 Compiler: Ignore #pragma tabsize with non-positive argument.
Imported from SA-MP: 7f30a03f94.
2014-08-26 09:04:50 +02:00
Arkshine
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
Arkshine
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
Arkshine
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
Arkshine
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
Arkshine
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
Arkshine
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
Arkshine
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
Arkshine
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
Arkshine
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
Arkshine
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
Arkshine
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
Vincent Herbet
4d454b474c Attempt to fix build 2014-08-23 10:17:47 +02:00
Vincent Herbet
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
Vincent Herbet
ccf919c58c Fix typo in previous commit (r=dvander) 2014-08-21 20:57:08 +02:00
David Anderson
567fbcd517 Fix build. 2014-08-19 21:38:44 -07:00
David Anderson
7f25e28d01 Merge pull request #121 from alliedmodders/fix-variadic
Fix returning strings from variadic functions.
2014-08-19 13:48:50 -07:00
Vincent Herbet
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
Vincent Herbet
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
Arkshine
bf23890a34 Reverse condition for clarity and to make Nextra happy! 2014-08-19 18:25:00 +02:00
Vincent Herbet
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
Arkshine
68aec7eec0 Use new flags in get_players/find_player instead to avoid breakage. 2014-08-19 15:39:06 +02:00
Arkshine
76811b7b84 Allow get_players() as well. 2014-08-19 10:08:25 +02:00
Vincent Herbet
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
Arkshine
9cd90838e1 Remove safety checks as it's not really necessary. 2014-08-19 09:04:09 +02:00
Arkshine
e7d7de870a Block weapon pickup sound if shield is disallowed in CS_OnBuy forward. 2014-08-18 22:02:08 +02:00
Vincent Herbet
bcbf454255 Merge pull request #123 from yamikaitou/master
Fix compile error
2014-08-18 14:36:49 +02:00
Ryan
4dd53b333f moving comment 2014-08-18 06:34:18 -05:00
Ryan
b1b47a6d4c fix compile error 2014-08-18 05:36:37 -05:00
xPaw
518944c41e Add an option to disable showing last man's health (bug 5847) 2014-08-18 12:36:13 +03:00
Arkshine
481e1528d6 Don't show blank line in abort() with AMX_ERR_NONE (bug 6233). 2014-08-17 23:33:00 +02:00
Arkshine
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
David Anderson
6bbc4c8dbd Fix returning strings from variadic functions. 2014-08-17 10:00:51 -07:00
Vincent Herbet
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
Reuben Morais
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
Asher Baker
63774d75f3 Remove "Done." text from compiler. 2014-08-16 18:03:34 +01:00
Vincent Herbet
f185eaa232 Update TRANS_SILENT Serbian translaton. 2014-08-16 17:41:27 +02:00
Vincent Herbet
d49064b43e Merge pull request #113 from kiapwnz/silentswitch
Added Silent Transfer Option in Team Menu.
2014-08-16 15:13:18 +02:00
Vincent Herbet
e6b8188480 Merge pull request #118 from Arkshine/zlib-update-vs-project
Update VS projects in #117.
2014-08-16 14:46:49 +02:00
Arkshine
ab81658471 Update VS projects in #117. 2014-08-16 14:19:09 +02:00
Asher Baker
8883624b2e Merge pull request #117 from alliedmodders/compile-zlib
Remove pre-compiled zlib from the tree
2014-08-16 13:07:30 +01:00
Asher Baker
62f6b25b63 Remove pre-compiled zlib from the tree. 2014-08-16 00:33:33 +01:00
Asher Baker
e6c3d42eb8 Merge pull request #115 from alliedmodders/emscripten
Add support for Emscripten to the compiler.
2014-08-15 23:49:03 +01:00
Asher Baker
3a43a41141 Added back estimated stack usage. 2014-08-15 23:46:16 +01:00
Asher Baker
f886e69dfb Fixed linux build. 2014-08-15 23:23:11 +01:00
Asher Baker
46123d359f Add support for Emscripten to the compiler. 2014-08-15 16:32:00 +00:00
Vincent Herbet
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
Arkshine
0fed80968b Fix OSX compilation #1. 2014-08-10 22:58:38 +02:00
Arkshine
41f6932b68 Remove some SourceMod namespace. 2014-08-10 22:25:14 +02:00
Arkshine
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
Arkshine
3dace577fe Remove svn_version.h reference from project files. 2014-08-10 19:08:50 +02:00
Arkshine
1395b42692 Update wincsx project files. 2014-08-10 19:06:21 +02:00
Arkshine
c0a132e039 Update tsx module project files. 2014-08-10 18:53:13 +02:00
Arkshine
9b6110edc6 Update tsfun module projects files. 2014-08-10 18:47:02 +02:00
Arkshine
2b64ee21b3 Update tfcx module project files. 2014-08-10 18:42:04 +02:00
Arkshine
a290f7d299 Update sockets module project files. 2014-08-10 18:38:24 +02:00
Arkshine
a8e6cfe5cf Update regex module project files. 2014-08-10 18:29:55 +02:00
Arkshine
9d53d48552 Update ns module project files and use AMTL. 2014-08-10 18:29:55 +02:00
Arkshine
3f6ad29f55 Update sqlite module project files and use AMTL. 2014-08-10 18:29:38 +02:00
Arkshine
ab16be08f5 Update nvault module project files and use AMTL. 2014-08-10 18:29:19 +02:00
Arkshine
3ba84fb283 Update mysql module project files and use AMTL. 2014-08-10 18:29:10 +02:00
Arkshine
4f3d335ab4 Update hamsandwich module project files and use AMTL. 2014-08-10 18:28:56 +02:00
Arkshine
4f776ee56b Update geoip module project files. 2014-08-09 20:59:21 +02:00
Arkshine
40313929eb Update fun module project files. 2014-08-09 20:54:20 +02:00
Arkshine
c76509fe41 Update fakemeta module project files and use AMTL. 2014-08-09 20:50:45 +02:00
Arkshine
889ad7c3eb Update engine module project files and use AMTL. 2014-08-09 20:32:10 +02:00
Arkshine
d59f4cf199 Update dodx module project files. 2014-08-09 19:56:34 +02:00
Arkshine
dc9c2897fd Update dodfunc module project files. 2014-08-09 19:53:37 +02:00
Arkshine
b17c624c81 Update csx module project files. 2014-08-09 19:47:31 +02:00
Arkshine
9dee60934f Update cstrike module project files. 2014-08-09 19:33:04 +02:00
Arkshine
bc856740f2 Update AMBuildScript and renamed the generic moduleconfig.h file to avoid conflict. 2014-08-09 18:27:55 +02:00
Arkshine
c497d478ce Move out base sdk folder into public directory. 2014-08-09 17:35:08 +02:00
Vincent Herbet
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
Arkshine
2c146f564e Fix missing backward compatibility for some Array natives. 2014-08-09 15:22:18 +02:00
Vincent Herbet
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
Vincent Herbet
486fa99602 Trigger a build. 2014-08-08 21:26:44 +02:00
Vincent Herbet
570c9cfc6b Merge pull request #110 from Arkshine/replace-more-snprintf
Replace more snprintf by UTIL_Format.
2014-08-08 20:38:38 +02:00
Vincent Herbet
02bed88835 Merge pull request #109 from Arkshine/update-project-files
Update project files.
2014-08-08 20:38:17 +02:00
Arkshine
62eac5d91c Replace _snprintf too. 2014-08-08 13:23:38 +02:00
Arkshine
b47aa6871d Replace more snprintf by UTIL_Format. 2014-08-08 12:47:15 +02:00
Arkshine
eeb4ecd109 Update project files. 2014-08-08 11:27:40 +02:00
Vincent Herbet
c22bb12c1e Merge pull request #108 from Nextra/inc-doc
Update include documentation (mainly amxmodx.inc)
2014-08-08 01:25:56 +02:00
Valentin Grünbacher
b096f94ca4 amxconst: Purge tabs 2014-08-07 23:13:03 +02:00
Valentin Grünbacher
a63042d961 amxmodx/cellarray: Assorted consistency updates and typo fixes 2014-08-07 23:02:39 +02:00
Valentin Grünbacher
8b42767b19 amxmodx: Precaching documentation is the bane of my existence 2014-08-07 22:01:21 +02:00
Valentin Grünbacher
20a173d8a3 amxmodx: Improve precache comments 2014-08-07 21:49:56 +02:00
Valentin Grünbacher
08315a4329 message_const: Move TE_USERTRACER example into the comment block 2014-08-07 21:42:18 +02:00
Vincent Herbet
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
Arkshine
72b514cdde Make sure reserved parameter is a not a negative value. 2014-08-07 21:31:53 +02:00
Valentin Grünbacher
4231c5a6ae amxmodx: Sixth and final batch of documentation updates 2014-08-07 21:26:37 +02:00
Valentin Grünbacher
bbffcbf739 cellarray: Update lying ArrayCreate doc 2014-08-07 21:17:45 +02:00
Arkshine
aa4e60ae27 Fix a compatibility issue with the "reserved" parameter. 2014-08-07 20:40:07 +02:00
Vincent Herbet
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
Arkshine
c03271c856 Use server language as fallback if client's "lang" key is not defined. 2014-08-07 14:20:29 +02:00
Vincent Herbet
8c591bf065 Merge pull request #105 from Arkshine/kill-snprintf
Replace all snprintf with UTIL_Format.
2014-08-07 08:38:21 +02:00
Valentin Grünbacher
88b69ea8a1 amxmodx: Update change_level doc for consistency 2014-08-07 01:46:11 +02:00
Valentin Grünbacher
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
Arkshine
69c46aff80 Replace all snprintf with UTIL_Format. 2014-08-07 01:42:58 +02:00
Vincent Herbet
d3bc58d80b Merge pull request #101 from Arkshine/textparsers
Introduce TextParser API
2014-08-07 01:24:51 +02:00
Vincent Herbet
c72d130fde Merge pull request #104 from Arkshine/add-change_level
Add change_level() native.
2014-08-07 01:24:36 +02:00
Arkshine
58b6f9f353 fix the documentation. How it's possible to not see a double comma! 2014-08-07 01:26:05 +02:00
Arkshine
e9eaae4dd1 Fix documentation. 2014-08-07 01:21:22 +02:00
Arkshine
29eb4e4647 Fix documentation. 2014-08-07 01:18:45 +02:00
Arkshine
6b5387f428 Fix documentation. 2014-08-07 01:16:44 +02:00
Arkshine
a0852adf18 Fix wrong log error message. 2014-08-07 00:53:15 +02:00
Valentin Grünbacher
c1ed795196 sockets: Convert file to UTF-8 2014-08-07 00:51:17 +02:00
Arkshine
6da2078067 Replace snprintf by UTIL_Format. 2014-08-07 00:51:01 +02:00
Valentin Grünbacher
9a0a52b7b2 amxmodx: Fix typos, touch up some descriptions, remove/merge lonely comments 2014-08-07 00:46:16 +02:00
Arkshine
8d2770f2f2 Put back original SM headers. 2014-08-07 00:43:29 +02:00
Valentin Grünbacher
37e22dc22f amxmodx: Fifth batch of documentation updates 2014-08-07 00:19:24 +02:00
Vincent Herbet
fb4d05fd60 Fix documentation. 2014-08-06 19:39:19 +02:00
Arkshine
3369f6d115 Update license in pawn includes and add them in project files. 2014-08-06 09:24:09 +02:00
Arkshine
4b652198f0 Fix compilation. 2014-08-06 09:17:54 +02:00
Arkshine
2d07189e38 Fix few issues. 2014-08-06 09:17:53 +02:00
Arkshine
b97093a778 Add more debug in plugin. 2014-08-06 09:17:51 +02:00
Arkshine
287cc1a0e8 Update MakeFile. 2014-08-06 09:17:50 +02:00
Arkshine
7317f1d233 Update PackageScript. 2014-08-06 09:17:48 +02:00
Arkshine
037af0aec2 Split INI/SMC API. 2014-08-06 09:17:47 +02:00
Arkshine
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
Arkshine
9af7931a79 Introduce TextParser API. 2014-08-06 09:17:43 +02:00
Vincent Herbet
5fbc5c074d Merge pull request #99 from Arkshine/geoip-update-bis
Update Geoip module.
2014-08-05 23:26:27 +02:00
Arkshine
023c1e3baf Geoip: Fix missing continent id and fix indentation. 2014-08-05 23:00:00 +02:00
Valentin Grünbacher
3a232f1576 message_const: Add placeholder titles for TE_* messages missing a description 2014-08-05 20:18:16 +02:00
Arkshine
adde73123f Geoip: Update license headers.
Hope this won't break merging.
2014-08-05 20:14:22 +02:00
Arkshine
178608c5f8 Geoip: Make some natives UTF-8 safe. 2014-08-05 20:12:26 +02:00
Arkshine
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
Arkshine
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
Arkshine
67bfe6bb36 Geoip: Fix possible buffer overflow. 2014-08-05 20:12:21 +02:00
Arkshine
17e0ab99e6 Geoip: Update documentation. 2014-08-05 20:12:20 +02:00
Arkshine
674600bab2 Geoip: Reorganize and update project files. 2014-08-05 20:11:31 +02:00
Valentin Grünbacher
9885c926e9 message_const: Fix up all headings and move notes into the new headings 2014-08-05 20:09:57 +02:00
Arkshine
52543481dd Geoip: Increase buffer and fix potential overflow crash. 2014-08-05 20:09:18 +02:00
Arkshine
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
Arkshine
210cba53b9 Geoip: Fix stripPort typo. 2014-08-05 20:08:31 +02:00
Arkshine
abaee9f4a3 Geoip: Add geoip_continent_name() native. 2014-08-05 20:08:30 +02:00
Arkshine
fc19f53ea9 Geoip: Add geoip_continent_code() native. 2014-08-05 20:08:28 +02:00
Arkshine
81d56dfdc0 Geoip: Add geoip_distance() native. 2014-08-05 20:08:27 +02:00
Arkshine
6941e406f4 Geoip: Add geoip_latitude() and geoip_longitude() natives. 2014-08-05 20:08:25 +02:00
Arkshine
b439753ac5 Geoip: Add geoip_timezone() native. 2014-08-05 20:08:24 +02:00
Arkshine
c11f721ad4 Geoip: Add geoip_region_name() native. 2014-08-05 20:08:22 +02:00
Arkshine
b61ed9fa3e Geoip: Add geoip_region_code() native. 2014-08-05 20:08:20 +02:00
Arkshine
95bc1703a6 Geoip: Add geoip_city() native. 2014-08-05 20:08:19 +02:00
Arkshine
0d59209e4c Geoip: Replace GeoIP.dat by GeoLite2-Country.mmdb. 2014-08-05 20:08:17 +02:00
Arkshine
7dd1ea3719 Geoip: Convert code to libmaxminddb API. 2014-08-05 20:08:16 +02:00
Arkshine
9d59de41a2 Geoip: Fix compilation #4. 2014-08-05 20:07:10 +02:00
Arkshine
6916eb8613 Geoip: Module should clear memory at mapchange. 2014-08-05 20:07:08 +02:00
Arkshine
94552e5503 Geoip: Fix compilation #3
Update project files.
2014-08-05 20:04:55 +02:00
Arkshine
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
Arkshine
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
Arkshine
58a64597e8 Geoip: Import libmaxminddb library which supports Geoip2 databases. 2014-08-05 20:04:50 +02:00
Arkshine
209f46a235 Geoip: Remove GeoIP library. 2014-08-05 20:04:49 +02:00
Valentin Grünbacher
2659e63483 amxconst: Add some more structure 2014-08-05 18:59:08 +02:00
Valentin Grünbacher
d9b20d7896 amxconst: Move SND_* constants where they belong 2014-08-05 18:48:37 +02:00
Valentin Grünbacher
566596f7b4 cellarray: Touch up documentation to make the parser happy and make it consistent 2014-08-05 16:05:19 +02:00
Arkshine
c9ea68d1d3 Fix typo in documentation. 2014-08-05 11:41:55 +02:00
Arkshine
10d5c8e9ad Add change_level() native. 2014-08-05 09:49:32 +02:00
Valentin Grünbacher
d60c94cbb1 amxmodx: Fourth batch of documentation updates 2014-08-05 01:39:16 +02:00
Valentin Grünbacher
9e9e3a9abd hlsdk_const: Fix up section heading to make docgen happy, purge tabs 2014-08-04 23:54:07 +02:00
Scott Ehlert
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
Scott Ehlert
d1122b982c Ship license files with builds. 2014-08-04 14:40:01 -05:00
Scott Ehlert
9c08b11a75 Update 'amxx gpl' server command with new license text. 2014-08-04 14:31:28 -05:00
Scott Ehlert
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
Scott Ehlert
2a18a264d4 Update date for license and GPLv2 exception. 2014-08-04 13:18:42 -05:00
Scott Ehlert
f787db1be5 Update license headers for plugins and includes. 2014-08-04 13:18:41 -05:00
Scott Ehlert
d113b1b646 Update license headers for ts modules. 2014-08-04 13:18:40 -05:00
Scott Ehlert
8be13a4ecc Update license headers for tfcx module. 2014-08-04 13:18:40 -05:00
Scott Ehlert
12775d0627 Update license headers for sqlite module. 2014-08-04 13:18:39 -05:00
Scott Ehlert
5ec6cc0d5e Update license headers for socket module. 2014-08-04 13:18:38 -05:00
Scott Ehlert
edeb44b0b8 Update license headers for regex module. 2014-08-04 13:18:37 -05:00
Scott Ehlert
bf30d1d3ce Update license headers for nvault module. 2014-08-04 13:18:36 -05:00
Scott Ehlert
1fc2e8cc6f Update license headers for ns module. 2014-08-04 13:18:35 -05:00
Scott Ehlert
4be6ca834a Update license headers for mysql module. 2014-08-04 13:18:35 -05:00
Scott Ehlert
7274beebed Update license headers for hamsandwich module. 2014-08-04 13:18:34 -05:00
Scott Ehlert
b7c205baf0 Update license headers for geoip module. 2014-08-04 13:18:33 -05:00
Scott Ehlert
c41219ae79 Update license headers for fun module. 2014-08-04 13:18:32 -05:00
Scott Ehlert
96a8fc5700 Update license headers for fakemeta module. 2014-08-04 13:18:31 -05:00
Scott Ehlert
caf0dbb341 Update license headers for engine module. 2014-08-04 13:18:31 -05:00
Scott Ehlert
82784a6169 Update license headers for dod modules. 2014-08-04 13:18:30 -05:00
Scott Ehlert
b6103a1916 Update license headers for cstrike modules. 2014-08-04 13:18:29 -05:00
Scott Ehlert
1cff91ced5 Update license headers for compiler. 2014-08-04 13:18:28 -05:00
Scott Ehlert
1bb54f839e Update license headers for AMXX core. 2014-08-04 13:18:19 -05:00
Valentin Grünbacher
63cf35b904 hlsdk_const: Fix up headings for proper display in api reference 2014-08-04 19:55:45 +02:00
Valentin Grünbacher
bc3808cb3f ham_const: Fix up headings for proper display in api reference 2014-08-04 19:39:40 +02:00
Valentin Grünbacher
b5aef1856d amxmodx: Third batch of documentation updates 2014-08-04 19:24:36 +02:00
Valentin Grünbacher
f134ff9fdf amxmodx: Second batch of documentation updates 2014-08-04 16:29:01 +02:00
Valentin Grünbacher
c9316542be amxconst: Grant @xPaw his beloved tabs 2014-08-04 02:32:12 +02:00
Valentin Grünbacher
8ba288cfb1 amxmodx: First batch of documentation updates 2014-08-04 00:48:37 +02:00
Valentin Grünbacher
9544364116 amxconst: Purge tabs 2014-08-04 00:35:52 +02:00
Valentin Grünbacher
79f15d5621 amxconst: Fix up the headings some more and move long descriptions to @note 2014-08-04 00:30:49 +02:00
Scott Ehlert
45ea164270 Add licenses for GPLv2 and GPLv3. 2014-08-03 17:25:18 -05:00
Scott Ehlert
82371fea3b Add new GPLv3 license text and acknowledgements. 2014-08-03 17:24:27 -05:00
Vincent Herbet
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
xPaw
c219878ac2 Remove XS__LIBRELEASE and tabs so docgen can catch the stocks 2014-08-03 22:26:54 +03:00
Valentin Grünbacher
5aef27a3ab amxconst: Add proper headings for all constant types 2014-08-03 16:33:08 +02:00
Vincent Herbet
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
David Anderson
6bf21c5687 Tweak build scripts so the vs build frontend will work. 2014-08-02 12:29:53 -07:00
Vincent Herbet
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
Vincent Herbet
30b0585447 Fix missing cellstack.inc file. 2014-08-02 18:42:18 +02:00
Arkshine
fc48579776 Update AMXX SDK in all modules. 2014-08-02 18:30:53 +02:00
Vincent Herbet
69371d6d6d Merge pull request #96 from xPaw/inc
Fix some comments
2014-08-02 18:18:27 +02:00
xPaw
c068c0d0f4 Fix some comments 2014-08-02 19:12:32 +03:00
Vincent Herbet
102f88674b Merge pull request #95 from Arkshine/update-project-files
Update project files.
2014-08-02 13:53:18 +02:00
Arkshine
3b6726e0c7 Update project files. 2014-08-02 13:51:17 +02:00
Arkshine
f43570c964 Fix typo and remove unecessary line. 2014-08-02 13:45:31 +02:00
Arkshine
b5fe5d29c9 Add MF_SetAmxStringUTF8Char and MF_SetAmxStringUTF8Cell. 2014-08-02 13:42:14 +02:00
Vincent Herbet
3ac76914bd Merge pull request #94 from Arkshine/adt-stack
Introduce API to create Stack structures
2014-08-01 23:49:56 +02:00
Arkshine
c3c5149fa0 Add new line at the end of file. 2014-08-01 23:20:29 +02:00
Arkshine
e7b7506efa Introduce API to create Stack structures 2014-08-01 23:14:44 +02:00
Vincent Herbet
0bfcaa85b6 Merge pull request #93 from Arkshine/atcprintf-new-parameters
Add new special format specifiers.
2014-08-01 22:34:57 +02:00
Arkshine
4ab559ceef Fix various issues. 2014-08-01 22:08:45 +02:00
Vincent Herbet
5689be448c Merge pull request #35 from Freeman-AM/master
hlsdk_const.inc : Add iuser1 constants
2014-08-01 19:12:16 +02:00
Freeman-AM
7aa895089a hlsdk_const.inc : modification of constants description. 2014-08-01 19:09:47 +02:00
Arkshine
bbc83291ef Add new format parameters. 2014-08-01 18:55:07 +02:00
Freeman-AM
5ef5f4b41f hlsdk_const.inc : modification of constants description. 2014-08-01 18:53:19 +02:00
Freeman-AM
600e5dce97 hlsdk_const.inc : modification of constants description. 2014-08-01 18:18:56 +02:00
Vincent Herbet
47dc226393 Merge pull request #76 from Arkshine/improve-cellarray
Update dynamic Array.
2014-08-01 18:03:53 +02:00
Arkshine
eabafd4eed Fix typo, documention and others issues. 2014-08-01 09:21:26 +02:00
LittleKu
f5164a9c02 Update statsx.txt 2014-08-01 12:25:36 +08:00
David Anderson
fc560a79d9 Add the SourceMod API doc generator. 2014-07-31 10:22:04 -07:00
Vincent Herbet
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
skyrim
f1b2c802e6 Fix of a possible buffer overflow 2014-07-30 22:43:26 +02:00
LittleKu
8f6f49c9f3 Update scrollmsg.txt 2014-07-31 00:55:54 +08:00
LittleKu
a397dfffb7 Update telemenu.txt 2014-07-31 00:50:09 +08:00
LittleKu
dc9237c1d8 Update time.txt 2014-07-31 00:49:06 +08:00
LittleKu
7248c5e731 Update timeleft.txt 2014-07-31 00:41:38 +08:00
LittleKu
4970aaf02d Update multilingual.txt 2014-07-31 00:36:12 +08:00
LittleKu
6da929dc95 Update miscstats.txt 2014-07-31 00:24:18 +08:00
Vincent Herbet
2b1b400e37 Merge pull request #90 from Arkshine/fix-compilation
Fix compilation.
2014-07-30 10:20:28 +02:00
Arkshine
6040dbfbb9 Fix compilation. 2014-07-30 10:19:41 +02:00
Vincent Herbet
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
skyrim
0de8ee48d0 Replaced sizeof(str)-1 and magic nums with charsmax 2014-07-29 16:32:32 +02:00
Vincent Herbet
f1e07caca4 Fix compilation. 2014-07-29 12:22:32 +02:00
Vincent Herbet
0365676262 Merge pull request #88 from xPaw/client-cmd-be-g
Remove some client_cmd
2014-07-29 12:15:20 +02:00
xPaw
c084965cf1 Remove some client_cmd 2014-07-29 13:13:39 +03:00
Vincent Herbet
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
xPaw
0e0d7ec9d5 Instead of assigning FCVAR_PROTECTED to cvars after startup, register cvars with said flag 2014-07-29 00:33:08 +03:00
Vincent Herbet
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
xPaw
ab46adc91c Trim target in amx_ban to prevent bypassing equali checks 2014-07-29 00:00:07 +03:00
Vincent Herbet
919af60ca9 Merge pull request #85 from xPaw/missing-tr
Add missing [tr] translations
2014-07-28 21:45:14 +02:00
xPaw
437ce48f42 Add missing [tr] translations 2014-07-28 22:40:38 +03:00
Vincent Herbet
16d19097c5 Merge pull request #84 from xPaw/amx-help
Replace hardcoded defines in adminhelp with cvars
2014-07-27 15:05:44 +02:00
xPaw
fea209fa7f Replace hardcoded defines in adminhelp with cvars 2014-07-27 15:59:09 +03:00
Vincent Herbet
580eb24546 Fix compilation warning. 2014-07-27 13:48:05 +02:00
Vincent Herbet
8d719e1191 Merge pull request #83 from xPaw/leet-speek-can-go-to-hell
Remove leet speak
2014-07-27 13:09:44 +02:00
Vincent Herbet
d2595b8b92 Merge pull request #31 from xPaw/burn-baby-burn
Remove compatibility stuff from the core
2014-07-27 12:07:58 +02:00
xPaw
fecf24ebfd Add missing [tr] translation in time.txt 2014-07-27 13:05:06 +03:00
xPaw
d65cedf8c7 Remove leet speak 2014-07-27 13:03:23 +03:00
Vincent Herbet
88042ce5a9 Merge pull request #82 from xPaw/ml-plugin-update
Multilingual plugin update
2014-07-27 11:57:51 +02:00
xPaw
dff6dc53f4 Use formatex and charsmax 2014-07-27 12:51:36 +03:00
Vincent Herbet
87c0be470b Merge pull request #80 from xPaw/package-script
Package script fixes
2014-07-27 11:44:56 +02:00
Vincent Herbet
3241e91e84 Merge pull request #81 from xPaw/messing-with-copyrights
Update copyright year
2014-07-27 11:42:08 +02:00
xPaw
499b5a1ac8 Use MAX_PLAYERS 2014-07-27 12:37:58 +03:00
xPaw
f2b1d26da3 Add --no-mysql to checkout-deps.sh 2014-07-27 12:31:19 +03:00
xPaw
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
xPaw
a6f10efd03 splitext didn't work 2014-07-27 12:11:44 +03:00
xPaw
5d85c0a965 Update VS references to amxmodx_version.inc 2014-07-27 11:59:49 +03:00
xPaw
60b1ec222e Add extern amxmodx_language 2014-07-27 11:52:30 +03:00
xPaw
c5ba642630 Change zeroes to manual in predefined version.inc 2014-07-27 11:43:50 +03:00
xPaw
b4d006438c Update core to use amx_language cvar instead of vault 2014-07-27 11:42:34 +03:00
xPaw
ef1e1edea5 Update copyright year 2014-07-27 11:22:40 +03:00
xPaw
868be37007 Remove svn_version.inc from package script 2014-07-27 11:09:15 +03:00
xPaw
57a1004c15 Replace svn_version with default amxmodx_version which should get replaced by AMBuild regardless 2014-07-27 11:07:13 +03:00
xPaw
9d0ea883ff Ignore compiled plugins 2014-07-27 11:04:17 +03:00
xPaw
1c32e7284b Fix package script copying wrong amxmodx_version file to include folder 2014-07-27 11:02:06 +03:00
xPaw
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
Vincent Herbet
c97312ba41 Merge pull request #79 from Arkshine/remove-debug
Remove old debug lines.
2014-07-26 23:19:06 +02:00
Arkshine
e440663ea3 Remove old debug lines. 2014-07-26 23:19:28 +02:00
Vincent Herbet
a77b946ce2 Merge pull request #78 from 9iky6/patch-9
Update statsx.sma
2014-07-26 18:39:23 +02:00
9iky6
aa37e7f4e8 Update statsx.sma 2014-07-26 21:30:45 +06:00
9iky6
795131cd9f Update statsx.sma 2014-07-26 21:18:40 +06:00
9iky6
d4cdec6f11 Update statsx.sma 2014-07-26 21:13:49 +06:00
9iky6
6fbf08869c Update statsx.sma 2014-07-26 21:03:05 +06:00
9iky6
279a053dbe Update statsx.sma 2014-07-26 21:01:07 +06:00
9iky6
cfaf862249 Update statsx.sma 2014-07-26 20:58:30 +06:00
9iky6
dae467032b Update statsx.sma 2014-07-26 20:57:23 +06:00
9iky6
6ae11ed755 Update statsx.sma 2014-07-26 20:56:42 +06:00
9iky6
fec17e2bf5 Update statsx.sma
Fix MAX_PLAYERS -> MaxClients
2014-07-26 20:33:07 +06:00
Arkshine
42fa547cb4 Improve CellArray. 2014-07-25 21:28:23 +02:00
Vincent Herbet
0b7bc23a30 Merge pull request #73 from Arkshine/maxclients
Add some generic constants - part 2
2014-07-25 09:56:08 +02:00
LittleKu
cf93ad50fa Update menufront.txt 2014-07-21 22:28:46 +08:00
LittleKu
46c9535087 Update mapsmenu.txt 2014-07-21 22:24:49 +08:00
LittleKu
57d621ac14 Update mapsmenu.txt 2014-07-21 22:24:19 +08:00
LittleKu
59219d3825 Update mapchooser.txt 2014-07-21 21:41:18 +08:00
LittleKu
8a6f6d7e36 Update languages.txt 2014-07-21 21:37:46 +08:00
LittleKu
477b61c5aa Update imessage.txt 2014-07-21 21:34:02 +08:00
LittleKu
2930654c7d Update common.txt 2014-07-21 21:32:10 +08:00
LittleKu
1f98a77ba0 Update cmdmenu.txt 2014-07-21 21:26:40 +08:00
LittleKu
9f513a755b Update antiflood.txt 2014-07-21 21:25:13 +08:00
LittleKu
8c46046fdb Update adminvote.txt 2014-07-21 21:23:09 +08:00
LittleKu
178516ac17 Update adminslots.txt 2014-07-21 20:59:41 +08:00
LittleKu
6b6a7bdc2b Update adminhelp.txt 2014-07-21 20:56:19 +08:00
LittleKu
4346a59035 Update admincmd.txt 2014-07-21 20:50:50 +08:00
LittleKu
da90ed748b Update adminchat.txt 2014-07-21 02:25:38 +08:00
LittleKu
2fccafb3ca update admin.txt
add a chinese language
2014-07-21 01:00:25 +08:00
Arkshine
a2b564eaaa Fix another potantial bug. 2014-07-20 17:48:05 +02:00
Arkshine
0347571ee9 Fix some typos and possible bugs. 2014-07-20 17:31:43 +02:00
Arkshine
da63bcb24b Fix redefinition of constant. 2014-07-20 17:14:05 +02:00
Arkshine
1fe80667a2 Fix definitively unused variable warning. 2014-07-20 15:25:37 +02:00
Arkshine
ee2ae84d7a Remove MAX_PLAYERS define assocaited to get_players. 2014-07-20 15:15:45 +02:00
Arkshine
7b96b4df22 Remove unecessary variable. 2014-07-20 12:56:59 +02:00
Arkshine
07534edfcd Use the new constants in various place. 2014-07-20 12:27:02 +02:00
Arkshine
e84653571c Fix stupid compiler warning on unused wariable. 2014-07-20 10:27:58 +02:00
Vincent Herbet
19c8b007b2 Merge pull request #72 from Arkshine/add-constants
Add some generic constants
2014-07-19 21:02:59 +02:00
Arkshine
ee99ee93e4 Add 👍 to MAX_PLAYERS for the sake of convenience. 2014-07-19 19:58:22 +02:00
Arkshine
8cef1af95d Move check out the loop. 2014-07-19 19:54:57 +02:00
Arkshine
2c4e99fe8d Add some generic constants to amxconst.inc file. 2014-07-19 19:46:40 +02:00
xPaw
1a633ec925 🔥 Remove old file check 2014-07-19 18:19:01 +03:00
xPaw
d7a74ebb94 🔥 Remove amxmod compat hack from the compiler 2014-07-19 18:12:15 +03:00
Vincent Herbet
3a5cb29e67 Merge pull request #69 from Arkshine/update-regex
Update regex module
2014-07-18 18:14:56 +02:00
Arkshine
5aba776da5 Regex: Recompile libpcre.a with -mmacosx-version-min=10.5. 2014-07-18 18:02:13 +02:00
Arkshine
1c9febfd22 Regex: Fix documention. 2014-07-18 18:02:12 +02:00
Vincent Herbet
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
Vincent Herbet
a078064497 Merge pull request #70 from Arkshine/bug-6171
Add entity_intersects native (bug 6171)
2014-07-18 17:04:35 +02:00
Arkshine
14f2a95205 Fix typo in set_ent_rendering native. 2014-07-18 16:49:39 +02:00
Arkshine
dbe95c849b Engine: Add entity_intersects native. 2014-07-18 16:37:32 +02:00
Arkshine
752f95e913 Regex: Fix plugin title. 2014-07-18 13:50:41 +02:00
Arkshine
ce92ef745c Regex: Fix compilation under OSX
Lib has been recompiled to target i386.
2014-07-18 13:45:29 +02:00
Arkshine
0ec65bef5b Regex: Fix compilation. 2014-07-18 12:42:13 +02:00
Vincent Herbet
7d69a78d06 Merge pull request #68 from Arkshine/feature-improve-client-buy
Improve client buy forward
2014-07-18 10:00:10 +02:00
xPaw
5eaeaa8dc1 Cstrike: Fix compilation. 2014-07-17 20:28:40 +02:00
Vincent Herbet
b2bb919c83 Merge pull request #67 from Arkshine/Fix-lang
Fix some translations.
2014-07-17 16:53:24 +02:00
xPaw
1262c197c4 Fix some translations. 2014-07-17 16:53:20 +02:00
Vincent Herbet
face80aa3f Merge pull request #66 from patrig/patch-26
Update statscfg.txt
2014-07-17 15:35:41 +02:00
Vincent Herbet
4cbb9b0e64 Merge pull request #64 from 9iky6/patch-8
Update statsx.txt
2014-07-17 15:35:16 +02:00
Vincent Herbet
7a46222758 Merge pull request #58 from patrig/patch-23
Update restmenu.txt
2014-07-17 15:31:22 +02:00
Danil
8111eee1b2 Update statscfg.txt
Add Russian language ...
2014-07-17 19:27:47 +06:00
Vincent Herbet
9413eba2f6 Merge pull request #61 from 9iky6/patch-5
Update adminchat.txt
2014-07-17 15:25:28 +02:00
Vincent Herbet
17553c844a Merge pull request #63 from 9iky6/patch-7
Update pausecfg.txt
2014-07-17 15:24:33 +02:00
Vincent Herbet
092535d653 Merge pull request #62 from 9iky6/patch-6
Update cmdmenu.txt
2014-07-17 15:23:56 +02:00
Vincent Herbet
82d7d23b86 Merge pull request #60 from 9iky6/patch-4
Update admin.txt
2014-07-17 15:23:38 +02:00
Arkshine
62e4eb29eb Regex: Update documentation. 2014-07-17 14:58:57 +02:00
Danil
a98df451cf Update restmenu.txt
fix [ru].
2014-07-17 18:33:27 +06:00
Arkshine
9c84c17d5e Regex: Update regex_subtr (Increase buffer and make it UTF-8 safe) 2014-07-17 14:02:21 +02:00
Arkshine
939a724b1a Regex: Add regex_replace native. 2014-07-17 11:21:06 +02:00
9iky6
ffb179c991 Update statsx.txt 2014-07-16 01:54:50 +06:00
9iky6
d53ce41a20 Update pausecfg.txt 2014-07-16 01:52:17 +06:00
9iky6
c0201a52a5 Update cmdmenu.txt 2014-07-16 01:46:31 +06:00
9iky6
baef33c12d Update adminchat.txt 2014-07-16 01:37:17 +06:00
9iky6
7d49398186 Update admin.txt 2014-07-16 01:35:28 +06:00
Vincent Herbet
1dba9eaeb9 Merge pull request #59 from patrig/patch-24
Update pausecfg.txt
2014-07-15 18:56:43 +02:00
Vincent Herbet
718e5efaf3 Merge pull request #57 from patrig/patch-22
Update admincmd.txt
2014-07-15 18:55:08 +02:00
Vincent Herbet
84404ec311 Merge pull request #56 from patrig/patch-21
Update telemenu.txt
2014-07-15 18:54:40 +02:00
Vincent Herbet
6d6d492c51 Merge pull request #55 from patrig/patch-20
Update time.txt
2014-07-15 18:54:33 +02:00
Vincent Herbet
d0501a8314 Merge pull request #54 from patrig/patch-19
Update timeleft.txt
2014-07-15 18:54:21 +02:00
Vincent Herbet
ff39293537 Merge pull request #53 from patrig/patch-18
Update scrollmsg.txt
2014-07-15 18:54:12 +02:00
Vincent Herbet
e03b2f7183 Merge pull request #52 from patrig/patch-17
Update plmenu.txt
2014-07-15 18:54:01 +02:00
Vincent Herbet
b1ac1453e1 Merge pull request #51 from patrig/patch-16
Update nextmap.txt
2014-07-15 18:53:52 +02:00
Vincent Herbet
e71b20359c Merge pull request #50 from patrig/patch-15
Update multilingual.txt
2014-07-15 18:53:44 +02:00
Vincent Herbet
42fb23d6c3 Merge pull request #49 from patrig/patch-14
Update miscstats.txt
2014-07-15 18:53:33 +02:00
Vincent Herbet
9682abb095 Merge pull request #48 from patrig/patch-13
Update menufront.txt
2014-07-15 18:52:58 +02:00
Vincent Herbet
d32457f9cf Merge pull request #47 from patrig/patch-12
Update mapsmenu.txt
2014-07-15 18:52:46 +02:00
Vincent Herbet
69651e6ebf Merge pull request #46 from patrig/patch-11
Update mapchooser.txt
2014-07-15 18:52:29 +02:00
Vincent Herbet
132a7fd0fc Merge pull request #36 from patrig/patch-1
Update admin.txt
2014-07-15 18:52:14 +02:00
Vincent Herbet
14600c0980 Merge pull request #45 from patrig/patch-10
Update languages.txt
2014-07-15 18:51:59 +02:00
Vincent Herbet
965f479bad Merge pull request #44 from patrig/patch-9
Update imessage.txt
2014-07-15 18:51:46 +02:00
Vincent Herbet
ab12ed6275 Merge pull request #43 from patrig/patch-8
Update common.txt
2014-07-15 18:51:28 +02:00
Vincent Herbet
8e0609e3ad Merge pull request #41 from patrig/patch-6
Update antiflood.txt
2014-07-15 18:51:07 +02:00
Vincent Herbet
2d0479bb07 Merge pull request #42 from patrig/patch-7
Update cmdmenu.txt
2014-07-15 18:50:47 +02:00
Vincent Herbet
320eede0a4 Merge pull request #40 from patrig/patch-5
Update adminvote.txt
2014-07-15 18:50:29 +02:00
Vincent Herbet
f496dc5bff Merge pull request #39 from patrig/patch-4
Update adminslot.txt … …
2014-07-15 18:50:10 +02:00
Vincent Herbet
f0ce4e9a67 Merge pull request #38 from patrig/patch-3
Update adminhelp.txt …
2014-07-15 18:49:55 +02:00
Danil
d31cc7adbb Update pausecfg.txt
Update restmenu.txt …

Just do later completed yet. need to run
2014-07-15 16:55:19 +06:00
Danil
091a685d75 Update restmenu.txt
Add Russian language ...
2014-07-15 16:26:39 +06:00
Danil
357258c46e Update admincmd.txt
Add Russian language ...
2014-07-15 16:14:25 +06:00
Danil
c3eef5df05 Update telemenu.txt
Add Russian language ...
2014-07-15 16:00:24 +06:00
Danil
e46b5fc132 Update time.txt
Add Russian language ... Thanks NiHiLaNTh
2014-07-15 15:57:04 +06:00
Danil
982c3ae3bd Update timeleft.txt
Add Russian language ...
2014-07-15 15:53:20 +06:00
Danil
b06baffb06 Update scrollmsg.txt
Add Russian language ...
2014-07-15 15:50:50 +06:00
Danil
9be1e63080 Update plmenu.txt
Add Russian language ...
2014-07-15 15:48:34 +06:00
Danil
e190309f4e Update nextmap.txt
Add Russian language ...
2014-07-15 15:34:39 +06:00
Danil
bf210cd080 Update multilingual.txt
Add Russian language ...
2014-07-15 15:33:37 +06:00
Danil
08968e2130 Update miscstats.txt
Add Russian language ...
2014-07-15 15:31:32 +06:00
Danil
7e29c62e18 Update menufront.txt
Add Russian language ...
2014-07-15 15:15:41 +06:00
Danil
3ffd04b12d Update mapsmenu.txt
Add Russian language ...
2014-07-15 15:11:50 +06:00
Danil
76d30f2e5b Update mapchooser.txt
Add Russian language ...
2014-07-15 15:06:09 +06:00
Danil
d196fcf32c Update languages.txt
Add Russian language ...
2014-07-15 15:01:00 +06:00
Danil
41175ce3e9 Update imessage.txt
Add Russian language ...
2014-07-15 14:56:59 +06:00
Danil
d6acb22582 Update common.txt
Add Russian language ...
2014-07-15 14:55:04 +06:00
Danil
4a7c0bb9ea Update cmdmenu.txt
Add Russian language ...
2014-07-15 14:44:20 +06:00
Danil
bb222d1f33 Update antiflood.txt
Add Russian language ...
2014-07-15 14:42:14 +06:00
Danil
ba5a0fccbf Update adminvote.txt
Add Russian language ...
2014-07-15 14:40:15 +06:00
Danil
9197fd38b1 Update adminslot.txt … …
Add Russian language ...
2014-07-15 14:16:43 +06:00
Danil
34a8576eca Update adminhelp.txt …
Add Russian language ...
2014-07-15 14:14:07 +06:00
Danil
699f324716 Update admin.txt
Add Russian language ...
2014-07-15 13:20:46 +06:00
Freeman-AM
e53c30bacf hlsdk_const.inc : Add iuser1 constants 2014-07-08 12:58:12 +02:00
Arkshine
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
Arkshine
a44d20b26b Regex: Add regex_match_all_c and regex_match_all natives (by Nextra) 2014-07-07 20:49:38 +02:00
Arkshine
ee4f6b8a89 Regex: Use AMTL. 2014-07-06 12:23:22 +02:00
Arkshine
08475bb0cc Regex: Update documentation + add regex_match_simple stock. 2014-07-06 12:23:22 +02:00
Arkshine
0714354f52 Regex: Update compiled libraries and pcre.h to v8.35. 2014-07-06 12:23:22 +02:00
Arkshine
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
Arkshine
d1153b8049 Regex: Update pcre.h. 2014-07-05 13:51:08 +02:00
Arkshine
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
Arkshine
201a3003d9 Regex: Update compiled libraries. 2014-07-05 00:32:40 +02:00
Arkshine
7a6e793813 Regex: Add PCRE 8.32 in tools directory. 2014-07-05 00:28:24 +02:00
Arkshine
c2c78f6724 Cstrike: Random cleanup. 2014-07-05 00:04:20 +02:00
Arkshine
7cb004c728 Cstrike: Fix forwards [un]loading at map change. 2014-07-04 23:52:47 +02:00
Arkshine
58774361bb Cstrike: Make sure to execute forwards on alive players. 2014-07-04 16:57:40 +02:00
Arkshine
6c4cb27d3e Cstrike: Implement CS_OnBuyAttempt forward. 2014-07-04 10:41:13 +02:00
Arkshine
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
Vincent Herbet
17f2006f38 Merge pull request #17 from Freeman-AM/master
Telemenu: Some bug fixes and small improvements
2014-07-03 23:11:21 +02:00
Freeman-AM
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
Arkshine
884c5e9643 Cstrike: Make CS_OnBuy forward more reliable - part 3
Remove unused hooks.
2014-07-03 21:14:11 +02:00
Arkshine
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
Arkshine
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
Vincent Herbet
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
Arkshine
ce75bcbf61 Move sm_memtable.h and sm_stringhashmap.h to public directory. 2014-07-03 11:51:30 +02:00
Vincent Herbet
6d283a1599 Merge pull request #33 from Arkshine/sync-amtl
Sync AMTL.
2014-07-03 11:33:30 +02:00
Arkshine
de73007922 Sync AMTL. 2014-07-03 11:26:50 +02:00
Vincent Herbet
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
Vincent Herbet
63322c9f2f Merge pull request #32 from 9iky6/patch-3
Update plmenu.sma
2014-06-22 12:20:19 +02:00
9iky6
c7bdddfda3 Update plmenu.sma 2014-06-22 15:59:21 +06:00
Vincent Herbet
e166c37d22 Merge pull request #27 from xPaw/patch-lang
Fix some languages
2014-06-17 13:50:41 +02:00
Vincent Herbet
8764321c8d Fix typos in cstrike.inc (related to #25) 2014-06-08 19:58:18 +02:00
xPaw
fd144a6b5b Add missing [sr] translations, thanks Gasa 2014-06-07 22:54:43 +03:00
xPaw
363f1be4a5 Add missing [ro] translations, thanks knif3vitalii 2014-06-06 18:25:21 +03:00
David Anderson
55cb6d4b94 Remove verbose untar from checkout-deps. 2014-06-05 13:40:04 -07:00
xPaw
2e6dc308a8 🔥 Remove backwards compatible CreateMultiForwardEx 2014-06-05 23:33:45 +03:00
xPaw
9b1f4e01c7 🔥 Remove backwards compatible RadiusDamage 2014-06-05 23:20:06 +03:00
xPaw
2696f0af0e 🔥 Remove compatibility stuff from the core 2014-06-05 23:00:47 +03:00
Vincent Herbet
9558861cb7 Merge pull request #30 from Arkshine/add-travis-ci
Add Travis CI
2014-06-05 19:45:40 +02:00
Arkshine
bfdf734ac1 Add Travis CI 2014-06-05 19:45:03 +02:00
David Anderson
d3e8b9066c Revert "Merge pull request #29 from xPaw/travis-ci"
This reverts commit 17b88584088138b14887e0e8ed30b15a7f0bcb2c, reversing
changes made to 0375d6469adca1674f4bda2e38a3fcc6b0304c0e.
2014-06-05 10:11:38 -07:00
Vincent Herbet
4c473451c9 Merge pull request #28 from xPaw/remove-amxmod-compat
Remove amxmod compatability
2014-06-05 19:00:27 +02:00
xPaw
e3e3d8a255 🔥 Remove NS2AMX utility backwards compatibility 2014-06-05 17:18:25 +03:00
xPaw
0be46af0c6 🔥 Remove references to compat includes 2014-06-05 17:04:37 +03:00
xPaw
66281d81b3 Add missing [cz] translations, thanks Backstabnoob 2014-06-05 15:43:18 +03:00
xPaw
0de8abc342 Add missing [de] translation in multilingual, thanks Mordekay 2014-06-05 15:40:42 +03:00
Asher Baker
17b8858408 Merge pull request #29 from xPaw/travis-ci
Add Travis CI
2014-06-05 12:43:26 +01:00
xPaw
563e4fcdf4 Update versioning script to match SourceMod changes 2014-06-05 14:37:37 +03:00
xPaw
bbd6cc7dcb Add Travis-CI 2014-06-05 14:36:27 +03:00
xPaw
ae9315ad48 🔥 Remove amxmod compatability
This doesn't remove anything from the engine
2014-06-05 13:48:56 +03:00
xPaw
a58c2b0f94 💄 Remove invalid token from statscfg 2014-06-05 13:22:42 +03:00
xPaw
7167663160 💄 Fixed translation tokens in stats_dod
Blame whoever copypasted all strings from miscstats
2014-06-05 13:20:22 +03:00
xPaw
95c2e82543 Fix some languages 2014-06-05 12:02:29 +03:00
Vincent Herbet
0375d6469a Merge pull request #26 from xPaw/patch-1
Add more links to Readme
2014-06-03 11:31:25 +02:00
Pavel
7b97896221 💇 2014-06-03 12:19:43 +03:00
Pavel
6ea15d1765 Add more links to readme
Conveniently stolen from SM repository
2014-06-03 12:18:23 +03:00
Vincent Herbet
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
Arkshine
2595fbe764 Cstrike: Remove unused defines and fix typo. 2014-06-03 10:05:56 +02:00
Arkshine
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
Arkshine
f1e206fde6 Cstrike: Refactor code to seperate detours for readability/maintainability + Fix OSX symbols. 2014-06-01 19:00:37 +02:00
Scott Ehlert
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
Arkshine
c96456503c Cstrike: Fix ResolveSymbol misuse under linux/osx. 2014-05-31 20:06:26 +02:00
Scott Ehlert
423eb0499b Align stack on 16 byte boundary in hamsandwich trampolines. 2014-05-31 06:34:52 -05:00
Scott Ehlert
3987085572 Combine prologue and epilogue code for void and non-void functions in hamsandwich trampolines. 2014-05-31 04:00:25 -05:00
Scott Ehlert
fe52f1eeac Don't bother saving and restoring eax in hamsandwich trampolines. 2014-05-31 03:09:17 -05:00
Arkshine
f08a4f5a66 Cstrike: Fix typo under OSX. 2014-05-31 09:14:00 +02:00
Arkshine
a984c85ffc Cstrike: Define "UseBotArgs" and "BotArgs" symbols in game data file. 2014-05-30 22:53:27 +02:00
Arkshine
9d99863c7e Cstrike: Add CSW_SHIELDGUN constant (valid CS value) 2014-05-30 16:56:26 +02:00
Arkshine
f130a8ea89 Cstrike: Implement CS_OnBuy forward. 2014-05-30 16:54:36 +02:00
Arkshine
38e2e3e393 Cstrike: Move utility stuff in its own file. 2014-05-29 01:19:52 +02:00
Arkshine
e4ff6853dd Cstrike: Convert code to use CDetour and MemoryUtils. 2014-05-29 00:40:37 +02:00
Arkshine
d7b3b47aa4 Cstrike: Import some memory tools from SourceMod 2014-05-28 22:51:14 +02:00
Vincent Herbet
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
Arkshine
f5a5d8f8e7 Undo last change and change cell cast to unsigned char. 2014-05-27 15:15:56 +02:00
Vincent Herbet
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
Arkshine
90c4fc1db1 Fix an unicode issue with amx_SetStringOld. 2014-05-27 13:49:59 +02:00
Vincent Herbet
a828ee8fda Merge pull request #21 from Nextra/newmenus
Newmenus: Add menu timeouts (+ extra bugfix)
2014-05-27 12:31:30 +02:00
Valentin Grünbacher
dc3e68c507 Newmenus: Fix typo in error message 2014-05-27 10:38:25 +02:00
Valentin Grünbacher
a6ffae72f5 Newmenus: Add get_menu_by_id and use it everywhere 2014-05-27 10:33:53 +02:00
Valentin Grünbacher
c91d67912b Newmenus: Update MENU_TIMEOUT doc 2014-05-27 10:32:28 +02:00
David Anderson
9b51137767 Update checkout-deps.sh. 2014-05-26 16:21:20 -07:00
Arkshine
62cf10f0c3 Cstrike: Move game datas in its own file. 2014-05-26 21:19:18 +02:00
Arkshine
f08e22db95 Cstrike: Rename cstrike.cpp to CstrikeNatives.cpp 2014-05-26 18:50:39 +02:00
Arkshine
88c489d393 Cstrike: Move AMXX API in a new file. 2014-05-26 18:08:41 +02:00
Freeman-AM
94e0021e78 Telemenu: Fix a typo error 2014-05-25 11:50:11 +02:00
Freeman-AM
1b4d0c7965 Telemenu: Remove some TAB before comments for readability 2014-05-24 18:35:06 +02:00
Freeman-AM
2ca61e2de2 Telemenu: Fix bad array usage 2014-05-24 18:30:02 +02:00
Freeman-AM
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
Vincent Herbet
4d3e219d84 Merge pull request #20 from Nextra/mexit
Newmenus: Add MEXIT_FORCE and fix possible crash
2014-05-23 13:45:23 +02:00
Valentin Grünbacher
50fbf29b3b Newmenus: Fix unsigned underflow on "end" variable 2014-05-22 00:07:37 +02:00
Valentin Grünbacher
ff18b03250 Newmenus: Add MEXIT_FORCE for proper exit button on non-paginated menus 2014-05-21 22:18:48 +02:00
Valentin Grünbacher
3b87c428dc Newmenus: Add necessary API changes for newmenu timeouts 2014-05-21 19:17:04 +02:00
Valentin Grünbacher
c8b7a09028 Newmenus: get_user_menu should also handle newmenu timeouts properly 2014-05-21 19:01:27 +02:00
Valentin Grünbacher
fa5336cade Newmenus: Use Menu::Close everywhere 2014-05-21 18:58:51 +02:00
Valentin Grünbacher
34337fb959 Newmenus: Add Menu::Close to remove a bunch of redundant code 2014-05-21 18:51:55 +02:00
Valentin Grünbacher
6a4c55de7d Newmenus: Fire MENU_TIMEOUT on menuselect client command 2014-05-21 18:47:20 +02:00
Valentin Grünbacher
2e8ce87c23 Newmenus: Add MENU_TIMEOUT status code and pass it where necessary 2014-05-21 18:45:40 +02:00
Valentin Grünbacher
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
Freeman-AM
44b4ff6f05 Telemenu: Fix view_ofs not correctly set at teleportation 2014-05-21 00:59:48 +02:00
Freeman-AM
d3bae33c64 Telemenu: Plugin style compliancy 2014-05-19 14:03:31 +02:00
Freeman-AM
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
Scott Ehlert
7ae802d736 Fix compile.sh script for OS X. 2014-05-18 20:37:44 -05:00
Scott Ehlert
d83ec1810a Merge pull request #18 from alliedmodders/static-libstdcxx
Link amxxpc with static libstdc++ on Linux.
2014-05-18 19:04:43 -05:00
Freeman-AM
b3d1b49fab Telemenu: Switch format to formatex 2014-05-18 16:20:40 +02:00
Freeman-AM
a6e3b57848 Telemenu: Add charsmax in place of hardcoded buffer lengths 2014-05-18 16:11:13 +02:00
Freeman-AM
7007105150 Telemenu: Add the ability to save the view and use it during teleportation 2014-05-18 15:58:53 +02:00
Freeman-AM
9c93cd1283 Telemenu: Add the ability to teleport in crouched areas 2014-05-18 15:32:45 +02:00
Freeman-AM
d2f909981a Telemenu: Use of float version of origin natives instead of integer version 2014-05-18 15:23:40 +02:00
Scott Ehlert
aa00fc6f63 Trigger build. 2014-05-17 19:22:10 -05:00
Scott Ehlert
db001a6eb5 Sync changes from SourceMod's bootstrap script. 2014-05-17 16:37:12 -05:00
Scott Ehlert
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
Scott Ehlert
072747b741 Add --symbol-files option to AMBuild configure. 2014-05-17 14:54:38 -05:00
Scott Ehlert
4fa8a90787 Add build directories to gitignore. 2014-05-17 14:37:15 -05:00
Vincent Herbet
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
Arkshine
0edb16150a CS: Manually set SPECTATOR team index. 2014-05-15 00:01:28 +02:00
Vincent Herbet
7e6812f64a Merge pull request #10 from Arkshine/client_printex
Add client_printex Stock (bug 5828)
2014-05-13 14:33:23 +02:00
Arkshine
1c13d0dd6b Use a more standard if conditionnal way. 2014-05-13 14:09:45 +02:00
Vincent Herbet
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
Vincent Herbet
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
Arkshine
c5c2721e60 Fix missing Float tag in some DoD forwards headers. 2014-05-12 16:40:19 +02:00
Arkshine
db76fc7b66 Fix cs_set_user_team issue on spectator 2014-05-12 14:41:08 +02:00
Vincent Herbet
c1cf9d8e67 Update .gitignore 2014-05-12 14:14:26 +02:00
Arkshine
5f210d3404 Append a note about usage of the new buffer size (related to ce4ef6e272) 2014-05-08 16:18:50 +02:00
Arkshine
24328568ed Fix typo with TrieGetArray return value in #8. 2014-05-07 10:41:55 +02:00
Arkshine
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
Arkshine
f691d2ed79 Fix english 2014-05-05 00:59:36 +02:00
Vincent Herbet
60f54ee691 Merge pull request #9 from Nextra/statsx-lang
StatsX Language/Translation Update (bug 3040)
2014-05-04 20:15:22 +02:00
Vincent Herbet
db3933d150 Merge pull request #8 from Arkshine/trie-update
Trie Update
2014-05-04 20:14:10 +02:00
Arkshine
d0b335dc6e Add missing 'stock' keyword. 2014-05-04 18:32:15 +02:00
Valentin Grünbacher
25f507c5e3 StatsX: Add is_user_alive check to eventSpawn 2014-05-04 17:04:01 +02:00
Valentin Grünbacher
2fb232ee68 StatsX: Use replace_string and set task timer to 0.1 (AMXX minimum) 2014-05-04 17:03:59 +02:00
Valentin Grünbacher
90c4eed92e StatsX: More charsmax in place of hardcoded buffer lengths 2014-05-04 17:03:58 +02:00
Valentin Grünbacher
bf4ba091e4 StatsX: cmdReport has to use LANG_SERVER 2014-05-04 17:03:57 +02:00
Valentin Grünbacher
c19b9d9d5d StatsX: Switch spawn detection from ResetHUD to Ham_Spawn 2014-05-04 17:03:56 +02:00
Valentin Grünbacher
5143cada8e StatsX: Don't format roundend hudstats if we don't show them 2014-05-04 17:03:55 +02:00
Valentin Grünbacher
f630a8afc8 StatsX: Format team score (g_sScore) on demand 2014-05-04 17:03:54 +02:00
Valentin Grünbacher
ccd0adb84d StatsX: Actually use cached player id in end_game_stats 2014-05-04 17:03:53 +02:00
Valentin Grünbacher
4afefa25d1 StatsX: Format roundend stats for each player individually 2014-05-04 17:03:52 +02:00
Valentin Grünbacher
4de2bf21a3 StatsX: Remove implicit usages of global buffers for formatting 2014-05-04 17:03:51 +02:00
Valentin Grünbacher
136309ae6f StatsX: Move hudstats formatting to own function 2014-05-04 17:03:50 +02:00
Valentin Grünbacher
12d2e49adf StatsX: Rip out LANG_SERVER where possible (still pass 0 as id) 2014-05-04 17:03:48 +02:00
Valentin Grünbacher
85bb592eeb StatsX: Switch cvar access to pcvars 2014-05-04 17:03:47 +02:00
Valentin Grünbacher
164285b221 StatsX: Switch from using defines to charsmax 2014-05-04 17:03:46 +02:00
Valentin Grünbacher
297ced77b9 StatsX: Switch format to formatex 2014-05-04 17:03:45 +02:00
David Anderson
3e1de6b014 Add .gitignore. 2014-05-03 17:51:07 -07:00
David Anderson
2a2e2e2868 Replace .hgignore with .gitignore. 2014-05-03 17:50:29 -07:00
Arkshine
0c1931284e Clean up include file. 2014-05-03 23:50:43 +02:00
Arkshine
9ac3763267 Add iterators natives 2014-05-03 23:21:56 +02:00
Arkshine
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
Arkshine
f3bce9ecfd Add TrieGetSize native. 2014-05-03 16:09:31 +02:00
Arkshine
55456eaf17 Fix format_time (returned length doesn't include null terminator, related to a86ca1491) 2014-05-03 15:41:05 +02:00
Arkshine
12a8864532 Remove refcounting 2014-05-03 14:28:12 +02:00
Arkshine
d933783629 Switch trie_natives off KTrie 2014-05-03 13:22:48 +02:00
Arkshine
f3aee6d766 Add AMTL files 2014-05-03 13:00:21 +02:00
Arkshine
3b0ce189ea Add print_radio constant (counter-strike only) 2014-05-02 19:13:38 +02:00
Arkshine
9a2bce66fd Add client_printex stock 2014-05-02 19:13:15 +02:00
Arkshine
9c191949d8 Add amxclient_cmd native (bug 5887, r=Nextra) 2014-05-02 09:16:16 +02:00
Arkshine
d3f22d2089 Add support for bot without "player" classname in Hamsandwich (bug 6111, r=ds) 2014-05-01 10:21:46 +02:00
Arkshine
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
Arkshine
ce4ef6e272 Increase get_amxstring buffer size (bug 5901, r=ds) 2014-04-30 15:22:55 +02:00
Arkshine
a86ca1491f Add new string natives/stocks, make some UTF-8 safe (bug 6110, r=ds) 2014-04-30 09:33:03 +02:00
Scott Ehlert
0519111528 Remove debug spew. 2014-04-20 14:56:45 -05:00
Scott Ehlert
2d4e3a6d25 Link amxxpc with static libstdc++ on Linux. 2014-04-20 14:52:50 -05:00
Arkshine
c99a518ba4 Oh come one. 2014-04-18 22:31:14 +02:00
Arkshine
512e3ff61c Fix some typo and fix mac. 2014-04-18 22:22:09 +02:00
Arkshine
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
Arkshine
f78fda6d9c Add new CellArray natives: Clone/Resize/FindString/FindValue (bug 6104, r=ds) 2014-04-15 10:34:48 +02:00
Arkshine
d6d4badbda Fix crash in Hamsandwich with hooked function without return (hopefully last time) 2014-04-14 13:37:09 +02:00
Arkshine
0f890ce7f1 Fix crash in Hamsandwich with hooked function without return. 2014-04-14 11:39:08 +02:00
Arkshine
e81e7bee13 Fix missing DataPacks plugin test and include file in PackageScript (thanks GuskiS) 2014-04-12 20:33:55 +02:00
Arkshine
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
Arkshine
8a1464ac41 Introduce DataPacks (bug 5885, r=ds) 2014-04-11 22:57:42 +02:00
Arkshine
5468e9745c Add set/show_dhudmessage (bug 5979, r=ds) 2014-04-11 21:54:24 +02:00
Arkshine
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
Arkshine
f097e01c3f Fix typo in previous commit. 2014-04-10 12:55:58 +02:00
Arkshine
ec101fc52b Trigger a build 2014-04-09 18:33:49 +02:00
Arkshine
1a7daad657 Update globally Hamsandwich module (bug 5611, r=sawce) 2014-04-09 16:44:02 +02:00
Arkshine
9815050287 Increase var/func and input line maximum length (bug 5924, r=dvander) 2014-03-24 01:04:17 +01:00
DynamicBits
1503a6571f Fix TFC_PC_CIVILIAN value (bug 6042, r=arkshine) 2014-03-22 16:59:15 +01:00
Vincent Herbet
3501e8fa46 Fix conflict with unicode string and bcompat translation layer (bug 5944, r=dvander) 2014-03-22 15:23:55 +01:00
connorr
46fb7b310e Add amx_xvar command (bug 5896, r=arkshine) 2014-03-20 23:41:10 +01:00
DynamicBits
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
Fysiks
33cdfa644e Add check for empty string in amx_chat command (bug 6017, r=arkshine) 2014-03-20 18:49:59 +01:00
Vincent Herbet
5dc96ddf47 Add strtof native (bug 5909, r=Nextra) 2014-03-20 18:21:38 +01:00
Vincent Herbet
f520a39c89 Add DMG_GRENADE constant (bug 6030, r=arkshine) 2014-03-20 18:14:31 +01:00
Vincent Herbet
bc97cc0bfb Add missing Pawn includes in VC project file 2014-03-20 18:11:49 +01:00
Arkshine
79af43b861 Testing commit 2014-03-17 08:50:44 +01:00
David Anderson
f1883fd773 Trigger a build. 2014-03-11 22:29:30 -07:00
David Anderson
d77e4a1470 Fix package.pl. 2014-03-11 19:54:37 -07:00
David Anderson
4c2f4095d2 Update README.md 2014-02-23 13:17:57 -08:00
David Anderson
4a79099115 Merge pull request #6 from alliedmodders/fix-winres-rc
Change winres.h to winresrc.h.
2014-02-15 21:26:42 -08:00
David Anderson
11d0b204f5 Change winres.h to winresrc.h. 2014-02-15 21:13:12 -08:00
David Anderson
db466c56fa Update README.md 2014-02-14 09:20:46 -08:00
David Anderson
8a55f1db35 Update README.md 2014-02-13 23:07:04 -08:00
David Anderson
31654d2908 Create README.md 2014-02-13 23:06:43 -08:00
David Anderson
d61abc5a18 Fix Windows build. 2014-02-13 00:13:43 -08:00
David Anderson
4df96b097d Add env var support to AMBuildScript. 2014-02-13 00:04:52 -08:00
David Anderson
ea051bddfb Import the package needed for rmtree(). 2014-02-12 23:30:03 -08:00
David Anderson
3b2a005a92 Merge pull request #5 from alliedmodders/depscript
Add a checkout-deps.sh script.
2014-02-12 20:58:54 -08:00
David Anderson
fb186b6fab Add a checkout-deps.sh script. 2014-02-12 20:46:19 -08:00
Scott Ehlert
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
Scott Ehlert
be4d91c105 Add -mmacosx-version-min=10.5 to compiler flags on OS X. 2014-02-12 19:40:05 -06:00
David Anderson
60bea040d0 Merge pull request #3 from alliedmodders/egg
Fix whitespaces.
2014-02-10 23:40:09 -08:00
David Anderson
0f303eb999 Fix whitespaces. 2014-02-10 23:38:55 -08:00
David Anderson
94c864390d Quell GCC madness. 2014-02-10 00:20:00 -08:00
David Anderson
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
David Anderson
e2855dee7d Undo vim modelines. 2014-02-09 23:49:19 -08:00
David Anderson
aa46469878 Add new variants of strbreak, which is too broken to use. 2014-02-09 23:40:45 -08:00
David Anderson
4125796569 Remove the debug clamp. 2014-02-09 10:37:02 -08:00
David Anderson
44ebe2f09a Remove deps.zip since GitHub doesn't like large files.
Former-commit-id: 2536a500acb86417c73ec65249c881d8e3e695ff
2014-02-08 23:48:30 -08:00
David Anderson
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
David Anderson
e56cd58d70 Update the rest of the buildbot scripts for AMBuild.
Former-commit-id: ef3e192105c8c7f3905a2ceb82df4751d51cc013
2014-02-08 21:45:40 -08:00
David Anderson
426771deda Switch bootstrap.pl and startbuild.pl to AMBuild.
Former-commit-id: 462765c926139c44a1c2922e0281b4653fad783a
2014-02-08 21:23:02 -08:00
David Anderson
f0f319a418 Add WinCSX to AMBuild scripts.
Former-commit-id: eca50829ae45c9d7bad2f0c79a95ba7a1e35c63e
2014-02-08 21:16:41 -08:00
David Anderson
779e064a17 Add .rc files.
Former-commit-id: 3d9c34eff669112a54d181ca3f970e2c77d31409
2014-02-08 20:53:01 -08:00
David Anderson
1f15fdd6cb Update versioning for AMBuild and git.
Former-commit-id: ea473061ef1f3b52716decfb4dafcfd66167730d
2014-02-08 20:37:33 -08:00
David Anderson
a07cf853d7 Fix a cxxflag being in cflags.
Former-commit-id: 4358bad902adba3595c856aa37b3faa6c4e1dba2
2014-02-08 16:27:02 -08:00
David Anderson
59c3e271db Remove all files related to SVN versioning.
Former-commit-id: 57a320bfe97fcf87cf2adc6a5ee3ae07814f798d
2014-02-08 16:26:40 -08:00
David Anderson
922b4802f1 Port AMBuild scripts to Windows.
Former-commit-id: 9af9b5f205cfd588a16e1164bd033c22ce2107fc
2014-02-08 16:09:29 -08:00
David Anderson
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
David Anderson
90b2860fd2 Get parity with makefile flags.
Former-commit-id: d1ee3b078001fc2bd5f0454cf457897cd0a0a817
2014-02-08 14:49:03 -08:00
David Anderson
0748a05bf0 Remove the C# builder - the last vestige of the Old Republic.
Former-commit-id: ff7277048f52b8ee658583ed7c7801204bed9493
2014-02-08 14:35:11 -08:00
David Anderson
8f51d87826 Get PackageScript release-equivalent on Linux.
Former-commit-id: 15cfb571fbfb37281e1465a013305ff6267b7dce
2014-02-08 14:29:15 -08:00
David Anderson
e57845dd50 Add the PackageScript.
Former-commit-id: 8fe47f62d5ac5426fd1b718f4339c9add70e9fa5
2014-02-08 13:46:34 -08:00
David Anderson
fdc804b7df Remove precompiled binaries from the plugins folder.
Former-commit-id: 4821df4aaf289b1f7d9fed0b2dfee40179d9e542
2014-02-08 12:44:35 -08:00
David Anderson
ad36859607 Port plugin building to AMBuild.
Former-commit-id: 9ac73de5b247da341b0b4cdf00ec3c7e0472be82
2014-02-08 12:42:00 -08:00
David Anderson
c4e90ce865 Initial import of AMBuild infrastructure for C++ projects.
Former-commit-id: 53baa4f8c25525674f5e71f8f6ff2663928500ab
2014-02-08 01:14:15 -08:00
Scott Ehlert
bc57a4e74f Triggering a build.
Former-commit-id: 45b67bd4fcacf483065d7447a2c12e6c45806b24
2014-01-22 20:03:52 -06:00
Vincent Herbet
878d68bb21 Backed out changeset: 2bc36c43b15f
Former-commit-id: 0f14674ff19adc5bd1461bc622a01c3064281026
2013-09-10 09:04:52 +02:00
Scott Ehlert
dc607846a3 Trigger build to hopefully fix Linux build.
Former-commit-id: ac1a72323631568561ae192190764b0015d42ba5
2013-09-05 21:05:35 -05:00
Scott Ehlert
568bec17fc Fixed building with newly updated SDK.
Former-commit-id: bf0455aea7c54493b2b921a2fef52120163e0959
2013-09-05 19:51:52 -05:00
Scott Ehlert
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
Scott Ehlert
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
connorr
9971541d78 Fix linux warning to make GCC compiler happy
Former-commit-id: f23bda76a3bb25333a619e82703605ac1cc92308
2013-08-24 23:42:18 +02:00
connorr
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
Vincent Herbet
af0a1200ab Add client_print_color native (CS only) (bug 5823, r=Nextra)
Former-commit-id: 9e37c60bc543676cbd659621a129bd953fc71473
2013-08-24 01:03:13 +02:00
connorr
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
DynamicBits
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
DynamicBits
de818ab5ec Update tfcx LINUXOFFSET value (bug 5845, r=arkshine)
Former-commit-id: 0f1908fa746e11d7915c43053e628d2a29cc7be4
2013-08-24 00:56:26 +02:00
connorr
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
Vincent Herbet
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
connorr
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
Vincent Herbet
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
Vincent Herbet
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
Vincent Herbet
ddacdb0ab2 Add set_ent_rendering native (bug 5773, r=Nextra)
Former-commit-id: d322cd2e79497eae463e941973db952079219c80
2013-08-10 14:16:26 +02:00
Vincent Herbet
ec644cf1a4 Fix unused but set variable compilation error under linux.
Former-commit-id: 1aa4373e3dce07d1a8331a74a557f56eca574520
2013-08-10 13:01:23 +02:00
Vincent Herbet
b5572520c2 Fix uninitialized variables.
Former-commit-id: 21f39612a8f877c204c93540f0d9037047cc4da9
2013-08-10 12:26:32 +02:00
Vincent Herbet
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
connorr
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
Nextra
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
Vincent Herbet
86f5c9f031 Make registered server commands case-insensitive (bug 5625, r=Nextra)
Former-commit-id: 44e5f42691a0deabd3ba612d9587a1dc139f6763
2013-08-09 01:27:02 +02:00
Vincent Herbet
0afe87be0a Add get_map_objectives native for CS (bug 5820, r=Nextra)
Former-commit-id: 47487a4aa7b32a5767c2a23df5ddc7e9643c3428
2013-08-08 19:11:12 +02:00
Vincent Herbet
225494b559 Fix tfcstats_pause imcomplete implementation (bug 5836, r=Nextra)
Former-commit-id: ea7b0f56fd2ea2f8d59d5b30172d8d9bfe4079f9
2013-08-07 16:46:40 +02:00
Vincent Herbet
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
Vincent Herbet
7e11cb5cc1 Add has_map_ent_class native (bug 5814, r=Nextra)
Former-commit-id: bfa749105feb49cf9f9b3878dededa33ae7d699c
2013-08-07 16:40:37 +02:00
connorr
5557124f05 Add an additionnal note to reflect change in 436d02c3ec30
Former-commit-id: 3ceb00dfdd2528eb9ab544b77d629938a916e386
2013-08-05 19:12:16 +02:00
connorr
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
connorr
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
connorr
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
connorr
16b2721c2a Apply general optimizations in adminslots plugin (bug 5831, r=arkshine)
Former-commit-id: 1ea1766188a73cb80a50396fb2b88e11c88bc1e1
2013-08-05 18:26:57 +02:00
connorr
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
connorr
fd47b6e0c6 Apply general optimizations in adminhelp plugin (bug 5833, r=me)
Former-commit-id: 100fff803ff2796fe0772d83d0cfb15d9b02ee3a
2013-08-05 17:44:15 +02:00
Vincent Herbet
1bf18472c1 Add cellarray.inc/celltrie.inc in project Pawn Includes filter
Former-commit-id: 0122820d6f401abc6acedaa4de80d518d6c68674
2013-08-05 17:11:51 +02:00
Vincent Herbet
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
Vincent Herbet
71ac17464a Add UTF-8 support in /top15 MOTD (bug 5825, r=me)
Former-commit-id: ae91c6f5ade72b2c851eb1289423444e4a7d42e4
2013-08-03 20:35:05 +02:00
Vincent Herbet
735160157c Move datastructs.cpp in Source Files filter
Former-commit-id: 84f7f744b3a4a996f766f7ecf7e14dee4624b8e0
2013-08-01 13:44:59 +02:00
connorr
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
Nextra
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
connorr
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
Vincent Herbet
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
connorr
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
DynamicBits
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
DynamicBits
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
Nextra
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
Vincent Herbet
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
Vincent Herbet
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
Vincent Herbet
f9954e5831 Missing amxx.cfg update for CS/NS mod in 449793c3c1de
Former-commit-id: d96a6389b83a22cc2922ee3f3eb44a89e1a97a02
2013-07-20 11:39:51 +02:00
Vincent Herbet
7498f84261 Fix uninitialized variable warning.
Former-commit-id: 65acac2b4fc16e1383d629b77200babe88b0556a
2013-07-04 20:36:31 +02:00
Vincent Herbet
389eee472f Update Portuguese translations (bug 3236, r=me)
Former-commit-id: 1e36ba07dcb16118c461d12bbc7038e87ae229dc
2013-07-04 20:16:25 +02:00
Vincent Herbet
93339d9be4 Add client_cmdStart forward (bug 5779, r=me)
Former-commit-id: 785ce1ea81567e30a729954a74ded7fdfef1ef7c
2013-07-03 01:00:52 +02:00
connorr
90e7aa65a1 Fix incorrect behavior of impulse forwards (bug 3243, r=Arkshine)
Former-commit-id: 1aae4c3ec57c61ba3f32579e236b07da54ae14bf
2013-07-03 00:19:12 +02:00
Vincent Herbet
6c2655c841 Comply to AMXX style for more consistency in a4e667e91410
Former-commit-id: 6a989a1857bd8a768b1701f842840c4d16351eb1
2013-07-02 23:32:22 +02:00
Vincent Herbet
1e7a4d2727 Comply to AMXX style for more consistency in 47c47df488e8
Former-commit-id: f9deb552af855345c8bd11d5eea17b0c5e9439f6
2013-07-02 23:31:27 +02:00
Vincent Herbet
0ddc00727d Comply to AMXX style for more consistency in 7319646e4d61
Former-commit-id: 1722d0cb4f480be6dec4dc7355cdc580efa3ac6f
2013-07-02 23:15:55 +02:00
Vincent Herbet
6912199ae0 Comply to AMXX style for more consistency in 8f3605ea03d5
Former-commit-id: 3075e0b375fcede21f2055442305d1ffdb9b64fd
2013-07-02 23:13:26 +02:00
Vincent Herbet
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
Vincent Herbet
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
Nextra
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
Vincent Herbet
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
Nextra
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
Nextra
bf395c8ac1 Fix definitevely time drift on repeating tasks (bug 3302, r=dvander)
Former-commit-id: 28aa4dfbf7cb03a2d929423ef3c607f92a96aa75
2013-07-01 22:58:56 +02:00
Vincent Herbet
e409a6cf23 Fix typo in 3bcba0ef360b
Former-commit-id: 4fcf93afb9a154cf92163cecdb3e8b7493d0aa71
2013-06-29 12:31:08 +02:00
Vincent Herbet
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
Vincent Herbet
873fb6924f Add strtol native (bug 3233, r=joropito)
Former-commit-id: 9508f9f86db99e93de1819f585c741396d8e4c30
2013-06-27 18:55:19 +02:00
Vincent Herbet
1000fdc902 Update Polish translations (bug 5570, r=me)
Former-commit-id: 1ded7ef6695be1f1e0f810d7ab35a46ed071e7cb
2013-06-27 18:16:20 +02:00
Vincent Herbet
e3a380bbe4 Fix linux warnings (and build?)
Former-commit-id: 21906adfdf35e5deecb10eb286a5b09b706f20a4
2013-06-25 19:06:11 +02:00
Vincent HERBET
89b28d5a4a Add missing Bosnian/Croatian translations in 0f878ec60a69
Former-commit-id: c343ecbe7888365fd4d6f69122c7e7336640cf8b
2013-06-25 12:08:47 +02:00
Vincent HERBET
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
Vincent HERBET
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
Vincent HERBET
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
Vincent HERBET
139d68700b Add Bosnian language (bug 4528, r=me)
Former-commit-id: df7c045089fdc6d73fe85728d1ea15c9e23488f9
2013-06-21 00:30:34 +02:00
Vincent HERBET
57dd24a2e0 Fix incomplete implementation of csstats_pause cvar (bug 5755, r=joropito)
Former-commit-id: 4766f848641edeab86fca1d6637fc0ae09af3744
2013-06-20 17:53:59 +02:00
Vincent HERBET
4cfa4fa1ca Add Croatian language (bug 4772, r=me)
Former-commit-id: 9624a8022d31d81041d9ceec920a9c34d39b7089
2013-06-20 01:58:44 +02:00
Vincent HERBET
525c45e9f5 Add plugin version to debug trace information (bug 3649, r=joropito)
Former-commit-id: 9bfdce37387378597a5fe73a78dbb495d70add19
2013-06-17 17:49:20 +02:00
Vincent HERBET
a1306b8d96 Fix duplicated native call (bug 5255, r=me)
Former-commit-id: ac896547f98657c240f1b44a446df26941e58f86
2013-06-17 13:39:12 +02:00
Vincent HERBET
f2fd18d803 Fix incorrect spanish translation
Former-commit-id: 8a483130a52f7351808f3cfdcb4c2a0b59046004
2013-06-17 12:57:12 +02:00
Vincent HERBET
6b6fe3c5d9 Add new command : amx_extendmap (bug 3068, r=sawce)
Former-commit-id: 064f10034400fe162072676f4fa362c68c8e8938
2013-06-17 12:18:11 +02:00
Vincent HERBET
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
Vincent HERBET
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
Scott Ehlert
f6ff4796b2 Fixed Linux and Mac builds.
Former-commit-id: 6f39588049f51abf92164ec7a79b0b9c0688f3c5
2013-06-16 12:55:22 -05:00
Vincent Herbert
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
Vincent Herbert
4e81779adb Fix native_filter documentation (bug 5692, r=me)
Former-commit-id: b44616576fd47ac6742428759b73ef50d5d68f89
2013-06-15 22:37:52 +02:00
connorr
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
Vincent Herbert
f608ae76ed Fix crash using [get|set]_usercmd (bug 5744, r=me)
Former-commit-id: 676952c02f7df7d3595a6f36bc3efbead3a40eee
2013-06-15 20:59:11 +02:00
Scott Ehlert
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
hv contact
d010b126cd Testing commit.
Former-commit-id: 4f768ad326156840b8a6de1a610c4dd33e9a6311
2013-05-26 22:29:20 +02:00
Scott Ehlert
369ed2adb7 Hopefully last build trigger.
Former-commit-id: 51f47cd70dc0d71e4dbdd4eed020fc1247ff0e69
2013-05-25 23:12:32 -05:00
Scott Ehlert
2d74ae8f53 Trigger a build.
Former-commit-id: dbd5bd3f50ce453b8c0d29c30538bddb383ddecd
2013-05-25 20:42:26 -05:00
Scott Ehlert
1f69ffd2bc Trigger a build.
Former-commit-id: c2c2521e59addcf1264bf1cabdca380d4bd7ada8
2013-05-25 20:35:12 -05:00
Scott Ehlert
f53ab14afc Trigger a build.
Former-commit-id: f8741164c7c201f9501a6a62001d1c575a822687
2013-05-25 20:41:28 -05:00
Scott Ehlert
5f4524e385 Trigger a build.
Former-commit-id: 6c1d55d357f3bc85759e9295dbdf2d7256e03923
2013-05-25 20:19:48 -05:00
Scott Ehlert
5f132b0f1c Trigger a build.
Former-commit-id: 870b548ae7ccb49acd6ab9d61196b3d592927e0a
2013-05-25 20:06:24 -05:00
Scott Ehlert
6d1d20cbcb Trigger a build.
Former-commit-id: 39fe66a68d3c9d734140de80f6ae46b75efa52f0
2013-05-25 19:15:55 -05:00
Scott Ehlert
ba4c28ca41 Trigger a build.
Former-commit-id: 661b176f46a4f9304be43d92b147ea4a23ad7269
2013-05-25 19:10:23 -05:00
Scott Ehlert
d64fa7cb7b Trigger a build.
Former-commit-id: 7e2b688c6e65a8dd9513a1c77312b2fbf34dd812
2013-05-25 18:56:59 -05:00
Scott Ehlert
f6bbb15e75 Trigger a build.
Former-commit-id: 9d468c4a0b4bcd1fc41d8f407c68c8fe443d40e9
2013-05-25 18:12:32 -05:00
Scott Ehlert
ec9ae29be8 Trigger a build.
Former-commit-id: 2b65f8f4b611cfca7bbb196694c12cd12f6bdc7a
2013-05-25 17:47:36 -05:00
Scott Ehlert
3a65722bff Changed my handle for amxx client command.
Former-commit-id: 51b3160068ef6cbe3dd6ba6acaeacf35c333b7b6
2013-05-25 00:05:34 -05:00
Scott Ehlert
c8ae274845 Hopefully triggering a build.
Former-commit-id: 57a6a70c0902685c2b5bf94ac50585e6b8dea00e
2013-05-24 23:15:30 -05:00
Scott Ehlert
e54e1af413 Hopefully triggering a build.
Former-commit-id: c0064dfe38808f7c35bee013eb1099ab121ab38e
2013-05-24 23:11:23 -05:00
Scott Ehlert
73ef98ca60 Hopefully triggering a build.
Former-commit-id: bb9724c4abfdf2898d3ef638ac185065638459e7
2013-05-24 22:37:45 -05:00
Scott Ehlert
360477f209 Hopefully triggering a build.
Former-commit-id: f1d808cb8fd40643f58e42ba7de18fad559fbf8c
2013-05-24 22:40:31 -05:00
Scott Ehlert
7e64cbf543 Updated ham sandwich offsets for TFC.
Former-commit-id: 561e9d87dfe374662c189bc76ea65bf4b40f07e7
2013-05-24 22:28:06 -05:00
Scott Ehlert
2c2de2169f Updated hamsandwich offsets for DOD.
Former-commit-id: e65de8d409bbfde88cb96a8a33e658ee77a321ea
2013-03-17 04:05:41 -05:00
Scott Ehlert
52178abe4d Disable Next button if license agreement is not accepted.
Former-commit-id: 05edd66a34866e57b6966f9a2591da9e83df9268
2013-02-26 02:18:48 -06:00
Scott Ehlert
ad46732e12 Fixed version number.
Former-commit-id: fef9682efc6e96913d44dcc0d2c1400877907347
2013-02-24 01:31:35 -06:00
Scott Ehlert
7718aac519 Re-built Pawn assembly interpreter and JIT object files.
Former-commit-id: ac5b6b15f2cb304847d39d3080ffb8a2a8926074
2013-02-24 01:04:09 -06:00
Scott Ehlert
ed1d061aa4 Re-enable JIT on Mac OS X (bug 5601, r=dvander).
Former-commit-id: b220d90bb4dff8b777dbafe39b871e50b74e1d59
2013-02-24 01:03:56 -06:00
Scott Ehlert
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
Scott Ehlert
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
Scott Ehlert
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
Scott Ehlert
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
Scott Ehlert
e3d750597a Fixed module loading on OS X (bug 5601, r=dvander).
Former-commit-id: 3d0277c1f01b71fa8401a7f815e09bebfb0f73cf
2013-02-24 00:45:53 -06:00
Scott Ehlert
fe2e9dbfc2 Removed patch file that was accidentally added in a previous changeset.
Former-commit-id: e3cb306a72f6adcb57a536ac66f3ad7ebaa27443
2013-02-24 00:45:53 -06:00
David Anderson
13db8fdf70 Filled out the license pane.
Former-commit-id: 8368f5728b457ca3e62ad5f2d27d717e1b56c505
2013-02-23 21:54:49 -08:00
David Anderson
bd65a373ec Fix back button.
Former-commit-id: 3a0937a2f75c279de7c113121c098b04a59fe9d1
2013-02-19 00:30:33 -08:00
David Anderson
14b1716be8 Fix build.
Former-commit-id: 489c275d88f775824b39d27ee24b7ae1d168b37a
2013-02-19 00:28:48 -08:00
David Anderson
a73ae02b7e Switch to WPF.
Former-commit-id: e75aa871e3fecbe716c8dc49a348148d1bedf7f3
2013-02-19 00:27:10 -08:00
David Anderson
0ffd9caaed Initial import of C# installtool.
Former-commit-id: 072e30433709380ffcb8e9ea1d658c1ebcb99f7d
2013-02-17 01:34:05 -08:00
David Anderson
5c380e2310 Add AMXXStudio configs to the tree.
Former-commit-id: 2c9749232234c1b8b07c50a2359a8fd8f3842c8c
2013-02-14 23:31:42 -08:00
David Anderson
7e7209d29a Bump version to 1.8.3-dev.
Former-commit-id: 3dd030c4e3f53c8baf4f30e22beaba15c852804d
2013-02-14 23:30:38 -08:00
David Anderson
afd0acd4a7 Fix build bustage (TM).
Former-commit-id: 58d6835c1794423101e92664a8f4e36b40826638
2013-02-14 02:00:29 -08:00
David Anderson
07aaf3713c Fix build bustage.
Former-commit-id: 553dea80f22f664b24ca89908dca2e8c42cf37af
2013-02-14 01:57:09 -08:00
David Anderson
1b908eeb9e Disable JIT on Mac OS X due to crash.
Former-commit-id: bac92ddbc7c262e4a1c31cc3dfbf4763e10f3440
2013-02-14 01:52:29 -08:00
David Anderson
3db718799f Bump version for release.
Former-commit-id: 4e0f69d8421b4d0a421f5960ce8ff77497acfa63
2013-02-14 00:51:48 -08:00
Scott Ehlert
146d77f819 Fixed Windows tsx build.
Former-commit-id: 9ffe0365415ba5cd9fdaa12782c9677f8f1ca951
2013-02-13 03:32:25 -06:00
Scott Ehlert
06a9241bcf Changed my handle.
Former-commit-id: 9b29f183153a23dbf0f830cb4580dc4dd2853143
2013-02-13 03:23:27 -06:00
Scott Ehlert
ce4b23b41a Fixed metamod paths in MSVC projects.
Former-commit-id: c99a90817fb726ee28783d9b1139e4d540daa9fa
2013-02-13 03:22:59 -06:00
David Anderson
3184d1466e Backout changeset aa745bf0c347 (bug 3302) for regression reported in bug 5552.
Former-commit-id: 0d2385b0045e46fdefee4ca2b5f6442397cfbe60
2013-02-13 01:13:18 -08:00
arkshine
8793d8f8d5 Fix strfind ignoring its last parameter (bug 4070, r=dvander).
Former-commit-id: a31621dd0c08c7bbede41a06d0ebf8abab1b66a5
2013-02-13 00:54:26 -08:00
Fysiks
a26a98cb98 Fix incorrect result for replace_all (bug 5064, r=dvander).
Former-commit-id: e3824c4c87c43734e6c5d4831f2ca7cece0a5147
2013-02-13 00:40:57 -08:00
Scott Ehlert
5e69db511c Made amxxpc_osx executable.
Former-commit-id: ea2a4889fe69274051fa71b1d94308935cdc34e4
2013-02-13 02:32:01 -06:00
Fysiks
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
arkshine
a3aa086375 Fix crash in EngFunc_TraceTexture (bug 4576, r=dvander).
Former-commit-id: c439946a3451dbdfafa2f542e08bc7f83d586165
2013-02-13 00:27:53 -08:00
Reuben Morais
82ad133d91 Add hamsandwich support for Adrenaile Gamer (bug 4445, r=dvander).
Former-commit-id: e08f1dfccf3b5bfb65687aee06c5d8fdbff94540
2013-02-13 00:25:48 -08:00
Scott Ehlert
250cb89479 Really fixed HLSDK paths in MSVC project files.
Former-commit-id: e04d44c85196034f5deebbf3c46ecc9fc710aeed
2013-02-13 02:08:29 -06:00
Lev2001
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
David Anderson
69c06545ce bug 3553 follow-up fix.
Former-commit-id: 65d97fe5f5bca0c3a3ba8574f7c924d8ba7dc1cd
2013-02-13 00:09:34 -08:00
Reuben Morais
9e5b5683af Increase the capacity of speech.ini (bug 3553, r=dvander).
Former-commit-id: d10ef5e49419251d3c841148093fb3210bc6d028
2013-02-13 00:08:32 -08:00
Scott Ehlert
f01357aa7a Fixed HLSDK paths in VS 2010 projects files.
Former-commit-id: 32516f18ee3b87c2030ba5fad91f0b3e7a1ec741
2013-02-13 01:22:50 -06:00
Scott Ehlert
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
Scott Ehlert
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
Scott Ehlert
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
Scott Ehlert
b318509687 Added dependencies for the Installer Delphi project.
Former-commit-id: 88173f089cfe2d6b72e987f763ff25c7038528bc
2013-02-13 01:19:36 -06:00
Scott Ehlert
37f7975416 Rebuilt compiler binaries and built new binaries for OS X. 2013-02-13 01:16:41 -06:00
Scott Ehlert
40c1fee55a Added support for Mac OS X and building with clang (bug 5601, r=dvander). 2013-02-13 01:14:37 -06:00
arkshine
b0fe6c83e2 Fix get_team() sometimes being wrong for dead players (bug 4656, r=dvander). 2013-02-12 23:17:24 -08:00
Scott Ehlert
59fc122986 Triggering build. 2013-02-12 03:38:26 -06:00
Scott Ehlert
3ec6bbc2ce Triggering build. 2013-02-12 03:30:51 -06:00
Scott Ehlert
a431cb420b Triggering build. 2013-02-08 04:07:52 -06:00
Scott Ehlert
5a6c4ea408 Removed amxxpc64 and rebuilt amxxpc binaries. 2013-02-08 03:44:40 -06:00
David Anderson
7d9376a64b Remove SCASM, which was pointless and buggy bloat. 2013-02-08 00:38:35 -08:00
David Anderson
6e4f09366e Ditch amxxpc64. AMXX files will now only contain 32-bit code. 2013-02-08 00:35:59 -08:00
Scott Ehlert
6c22cb171d Synced hamdata.ini. 2013-02-04 18:40:04 -06:00
Scott Ehlert
77e900585a Backed out changeset 41ca53ad9bff 2013-02-04 18:37:37 -06:00
Scott Ehlert
86bfeec554 Synced hamdata.ini 2013-02-04 18:36:18 -06:00
Scott Ehlert
45343e6e27 Updated hamsandwich offsets for HL1 and CS 1.6 beta. 2013-02-04 07:31:33 -06:00
Scott Ehlert
944f608f09 Fixed hamsandwich vtable patching on Linux for newer GCC binaries. 2013-02-04 07:31:32 -06:00
Scott Ehlert
ad960a64e2 Fixed Linux ClientCommand detour crash in cstrike module for beta. 2013-02-02 23:41:45 -06:00
joropito
e2a687d96d removed pushbuild.txt test file 2012-07-27 14:56:48 -03:00
joropito
53e43b8f31 testing push 2012-07-27 14:45:35 -03:00
Scott Ehlert
da2eb8ea66 Hopefully fixed Windows build. 2011-07-01 21:51:27 -05:00
Scott Ehlert
088f109a64 Added .hgignore file. 2011-06-29 00:59:58 -05:00
Scott Ehlert
9d65198786 Upgraded MSVC project files for VS 2010 and modified build tool to use them. 2011-06-29 00:50:14 -05:00
Seta00
49e3b748c3 Fix time drift on repeating tasks (bug 3302, r=dvander). 2010-12-12 18:36:59 -08:00
joaquimandrade
5324c7c620 Fix TrieSetArray reading the wrong parameter (bug 3816, r=dvander). 2010-09-11 23:02:43 -05:00
fezh cs
26d2a4f877 Add documentation to set_view (bug 4065, r=dvander). 2010-12-12 18:24:30 -08:00
Fysiks
76d407b45a Fix menu_create() documentation (bug 4426, r=dvander). 2010-09-11 22:33:57 -05:00
Lev2001@land.ru
e783c4bfcb Fixed fopen leak in mapsmenu (bug 3957, r=dvander, a=blocking). 2010-04-27 00:40:38 -07:00
Hawk552
afc663a51a Lowered wait time in between threaded queries (bug 3740, r=dvander). 2010-04-27 00:24:50 -07:00
Ryan L
cb500636cc Fixed amx_ban (bug 4159, r=dvander, a=blocking). 2010-04-27 00:21:49 -07:00
David Anderson
e6f4dfbfe2 Added packager. 2010-04-04 18:10:35 -07:00
David Anderson
1bfdda7e71 Fixed more Makefile paths. 2010-04-04 18:00:36 -07:00
David Anderson
330fd1c2ae Fixed Makefile paths for Metamod. 2010-04-04 17:55:37 -07:00
David Anderson
56b676eafb Fixed core build. 2010-04-04 17:37:05 -07:00
David Anderson
73e3e52057 Updated version files for HG. 2010-04-04 17:22:45 -07:00
David Anderson
56b53584d1 Reversed test condition for build failure. 2010-04-04 17:11:11 -07:00
David Anderson
f43fcd6670 Invoke builder.exe correctly. 2010-04-04 17:02:16 -07:00
David Anderson
5984f0d442 Turns out mono eats exit codes. AWESOME. 2010-04-04 16:58:24 -07:00
David Anderson
1b75b0ba92 Fixed exit code from failed builds. 2010-04-04 16:49:12 -07:00
David Anderson
52f5723f4e Another windows bootstrap fix. 2010-04-04 16:42:24 -07:00
David Anderson
eb6ab857fc Fixed bootstrapping on Windows (I hope). 2010-04-04 16:37:28 -07:00
David Anderson
24bfff9cf1 See if a build will run! 2010-04-04 16:32:15 -07:00
David Anderson
1d3f91be43 bootstrap script now builds builder tool. 2010-04-04 16:24:42 -07:00
David Anderson
824d9953d9 Initial import of bootstrapig for buildbot. 2010-04-04 16:07:37 -07:00
David Anderson
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
David Anderson
adab9c93a0 Removed filtering on admin vote questions (bug 3356, r=sawce). 2009-02-07 23:44:23 +00:00
David Anderson
0f8c61c1e1 Re-added fflush function (bug 3355, r=sawce). 2009-02-07 23:43:07 +00:00
David Anderson
0b4f28fecf SQL_QuoteString can now be used without a DB handle (bug 3427, r=sawce). 2009-01-08 20:02:09 +00:00
David Anderson
d97ab913cf Fixed zero precision bug in atcprintf (bug 3242, r=sawce). 2009-01-08 20:00:38 +00:00
Scott Ehlert
2249f1e70c Gah 2008-08-20 06:08:27 +00:00
Scott Ehlert
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
Scott Ehlert
5cc5ea4006 Added missing fakemeta_util.inc to nsi installer file 2008-08-19 18:12:05 +00:00
Scott Ehlert
2145823971 Updated nsi installer file list; it was missing celltrie.inc 2008-08-19 14:34:12 +00:00
David Anderson
cdf3807955 Bumped version numbers. 2008-08-17 00:50:57 +00:00
David Anderson
10ff8c11fd Fixed another build tool regression. 2008-08-17 00:18:59 +00:00
David Anderson
81af863496 New compiler builds. 2008-08-17 00:14:45 +00:00
David Anderson
3e8c921b9f Updated compiler builds after all. 2008-08-16 23:40:53 +00:00
David Anderson
f201592ddb Fixed regression. I'm not making new builds though. 2008-08-16 23:32:58 +00:00
David Anderson
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
David Anderson
73ea754640 Fixed not building because sdk stuff was moved around. 2008-08-16 23:24:25 +00:00
David Anderson
ce9728af93 Fixed GeoIP not compiling on gcc 2008-08-16 23:20:07 +00:00
David Anderson
6486c56a15 Bumped versions. 2008-08-16 22:47:59 +00:00
David Anderson
1d95fb3dcd Updated build tool for compat regression in Mono. 2008-08-16 22:45:59 +00:00
Scott Ehlert
c07d8f3d93 Final VS 2005 + Linux tomfoolery 2008-08-16 20:13:12 +00:00
Scott Ehlert
adaf207b58 Forgot about this in my VS 2005 tirade 2008-08-16 10:19:42 +00:00
Scott Ehlert
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
Scott Ehlert
626bfe5240 Updated GeoIP code 2008-08-16 08:24:19 +00:00
Scott Ehlert
e4a3647b88 Updated GeoIP database to August 2008 2008-08-16 07:59:05 +00:00
Scott Ehlert
f942a857d0 Moved sven module of out trunk for now 2008-08-16 07:46:30 +00:00
David Anderson
633a81f864 Fixed amb1564: amx_chat sundry details did not obey cmdaccess.ini (patch from Teyut). 2008-08-16 07:07:09 +00:00
David Anderson
1b5dc0d567 Added corrections in bug 1762. 2008-08-16 06:53:07 +00:00
David Anderson
21b8f905ae Added amb1762: Macedonian translation (thanks z3r0Lev3L). 2008-08-16 06:51:07 +00:00
David Anderson
36a15919ca Added amb1365: Slovak translation (thanks Centaury). 2008-08-16 06:40:49 +00:00
David Anderson
24ff7c3a01 Fixed amb1288: amx_banip did not show time (patch from "James") 2008-08-16 06:16:29 +00:00
David Anderson
7beef260f2 Fixed amb1175: new module and plugin did not get added to addon packages. 2008-08-16 05:01:32 +00:00
David Anderson
36db059672 Fixed amb1163: float printing broke on large values. 2008-08-16 04:56:50 +00:00
Steve Dudenhoeffer
01f3d729de probable fix for RTE in tfc stats.sma: amb1642 2008-05-07 17:36:53 +00:00
Steve Dudenhoeffer
0a38ef831f Fix for amb1647: brush origin retrieval was wrong 2008-05-07 05:17:21 +00:00
Steve Dudenhoeffer
55d18da46c Fix for amb1648: typo in validate_menu_text 2008-05-07 04:58:32 +00:00
Steve Dudenhoeffer
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
Steve Dudenhoeffer
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
Steve Dudenhoeffer
f410ea743d Added part of amb1604: unregister_message - OH GOD I HOPE I DIDNT BREAK IT 2008-04-29 02:18:39 +00:00
Steve Dudenhoeffer
9100ec753c Added amb1167: menu_addtext(menu, const text[], slot=1) 2008-04-27 19:19:53 +00:00
Steve Dudenhoeffer
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
Steve Dudenhoeffer
4049a0c3be Initial addition of ns_remove_upgrade (amb1635): oh god I hope this will suffice 2008-04-26 21:40:56 +00:00
Steve Dudenhoeffer
86ea50dfdd amb1624: revision 3234 was accidentally undone 2008-04-26 08:18:34 +00:00
Steve Dudenhoeffer
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
David Anderson
6d03b29963 forgot 32-on-64 support for this 2008-04-15 23:36:13 +00:00
David Anderson
44e078c7c0 added support for building 32-bit on 64-bit machines 2008-04-15 23:26:54 +00:00
Steve Dudenhoeffer
e1dd514f15 msvc project files updated for trie_natives 2008-04-15 05:40:31 +00:00
Steve Dudenhoeffer
c52943b03c oops, forgot a file i hope this broke the nightlies 2008-04-15 05:36:50 +00:00
Steve Dudenhoeffer
b33d2f559b Fixed the debug builds having NDEBUG defined, causing stuff like asserts not working properly 2008-04-14 19:56:31 +00:00
Steve Dudenhoeffer
53ed817183 Added amb1600: trie natives 2008-04-14 19:52:11 +00:00
Steve Dudenhoeffer
683f453b6f Fixed building a 32bit binary on a 64bit machine
Added a super cool new native
2008-04-13 22:54:47 +00:00
Steve Dudenhoeffer
145ff45876 Wrong language key in vote kick/ban (amb1456) 2008-04-10 06:12:35 +00:00
Steve Dudenhoeffer
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
Steve Dudenhoeffer
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
Steve Dudenhoeffer
074fd60f3c plmenu now ignores immunity if a command is executed on self 2008-03-30 21:26:31 +00:00
Steve Dudenhoeffer
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
Steve Dudenhoeffer
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
Steve Dudenhoeffer
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
Steve Dudenhoeffer
375d6aa0da Added amb1263: A new flag in users.ini, 'k' implies name/tags are case sensitive 2008-03-30 19:28:36 +00:00
Steve Dudenhoeffer
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
Steve Dudenhoeffer
5e9e119c76 Fix for amb1545: show_activity was ignoring the last client 2008-03-30 07:36:10 +00:00
Steve Dudenhoeffer
2a383feef6 added amb1290: Invalid_Array handle in cellarray.inc 2008-03-30 07:26:59 +00:00
Steve Dudenhoeffer
a726b796db cellarray test had old ArrayGetCell syntax, oops 2008-03-30 07:25:35 +00:00
Steve Dudenhoeffer
9348f9931e amb1096 affected DoD, TS and TFC modules, fixed. 2008-03-23 03:45:21 +00:00
Steve Dudenhoeffer
4c79232f17 Fix for amb1199 - incorrect comment for Ham_DOD_RoundRespawnEnt 2008-03-04 19:21:09 +00:00
Steve Dudenhoeffer
16720a2f70 Fix for amb1343 - show_activity() had a messed up vformat() call 2008-03-04 19:18:17 +00:00
Steve Dudenhoeffer
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
Steve Dudenhoeffer
b0286c9c4d Half-fix for amb1218 - typo in ns.inc 2008-03-04 18:55:54 +00:00
Steve Dudenhoeffer
660e97c764 Fix for amb1313 - @section svencoop windows should have been @section SvenCoop windows 2008-03-04 18:51:35 +00:00
Steve Dudenhoeffer
df522ebe6f Woops!
Fix for amb1096 - csstats_rank mode 2 caused a server lockup.
2008-03-04 18:40:15 +00:00
Steve Dudenhoeffer
be35cc9912 Fixed amb1267 - FlagManager caused a crash if the cmdaccess.ini was not writable 2008-03-04 18:02:16 +00:00
Steve Dudenhoeffer
9801c4166f Fix for amb1389 - client_changeteam had a reversed syntax 2008-03-04 17:22:40 +00:00
Steve Dudenhoeffer
80db0ed0b3 Fix for amb1452 - ns_give_item was giving wrong items 2008-03-04 17:19:15 +00:00
David Anderson
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
Christian Hammacher
60b3f30ab3 fixed fs1315 (fread_blocks broken due to typo) 2007-12-26 15:46:06 +00:00
Christian Hammacher
cfd2011e80 added two FindCloses 2007-12-16 10:00:08 +00:00
David Anderson
5ed4c27732 fixed amb1089 - amx_banip message printed twice 2007-11-15 18:12:25 +00:00
David Anderson
afd1072583 fixed amb1049 - sloppy TraceResult namings 2007-11-15 18:08:15 +00:00
David Anderson
64ad54aa51 fixed amb1134 - unused cvar 2007-11-15 18:06:16 +00:00
David Anderson
3df060cad6 fixed amb1143 - typo in SetClientKeyValue() 2007-11-15 18:05:16 +00:00
David Anderson
1497d58e41 removed -fno-threadsafe-statics, didn't do anything 2007-11-13 16:46:59 +00:00
David Anderson
fd028ca1e7 fix for amb1077 - PT_TLS bugs in glibc 2007-11-13 16:45:55 +00:00
David Anderson
a1d812398b fixed amb1130 2007-11-13 02:28:09 +00:00
David Anderson
df96a81a75 fixed code that was clearly never tested (amb1126) 2007-11-13 02:25:20 +00:00
David Anderson
656d30be83 fixed amb1096 2007-11-13 01:44:17 +00:00
David Anderson
6e8a164e67 bumped version to 1.8.1 2007-11-12 23:50:41 +00:00
David Anderson
521288dae0 added dlopen() failure logging to linux 2007-11-12 23:48:26 +00:00
David Anderson
4c464390ac fixed amb1080 - german translation typo 2007-10-30 01:59:51 +00:00
David Anderson
408e69c41c fixed amb1079 - threaded queries with results would crash 2007-10-30 00:09:18 +00:00
David Anderson
cc99d6d1fb finalized build numbers and all that other release crap 2007-10-26 02:23:21 +00:00
David Anderson
3030302952 updated installer file list 2007-10-26 01:58:59 +00:00
David Anderson
f281a24274 added pluginmenu to build 2007-10-26 01:47:40 +00:00
David Anderson
efbba0a909 small change to the version changer for release builds 2007-10-26 01:42:35 +00:00
David Anderson
3750788893 fixed amxmodx makefile 2007-10-26 01:42:12 +00:00
David Anderson
993b6e6c74 added 3 more spaces to version output so our version numbers look nice 2007-10-26 01:41:45 +00:00
David Anderson
7f51048438 fixed ns makefile 2007-10-26 01:31:28 +00:00
David Anderson
212697b950 whoops, that was one terrible commit. the bug is really fixed now. 2007-10-26 01:09:08 +00:00
David Anderson
6a567f3c77 fixed a memory corruption bug in CVector 2007-10-26 01:03:23 +00:00
David Anderson
36241e2905 updated revision numbers 2007-10-26 00:28:17 +00:00
David Anderson
b630ffe28f added amb1063 - sven coop offsets from ts2do 2007-10-26 00:16:04 +00:00
David Anderson
f6276db4d0 fixed amb1067 - SQL_SetAffinity crashed when targeting sqlite 2007-10-26 00:10:09 +00:00
David Anderson
a2e3f8682f fixed amb1069 - map prefixes still didn't work 2007-10-25 23:54:51 +00:00
David Anderson
dbf6143747 fixed linux build 2007-10-23 11:24:51 +00:00
David Anderson
4aafcc50a0 lowered thread think time from 500ms to 200ms 2007-10-22 22:21:20 +00:00
David Anderson
a86b1c5097 added amb281 - multiple result sets for MySQL 2007-10-22 21:31:02 +00:00
David Anderson
2d737970d0 small fix for amb1024 - weird plugin dir choice 2007-10-22 20:06:28 +00:00
David Anderson
b7f8503655 added amb844 - get_pdata_ent 2007-10-22 19:52:06 +00:00
David Anderson
ca3d15c27e fixed amb816 - stats comments were wrong 2007-10-22 19:40:35 +00:00
David Anderson
468e6fb9dd added amb909 - LoadFileForMe() 2007-10-22 19:26:45 +00:00
David Anderson
50bbefa3ba fixed amb1023 - register_library had an outdated comment 2007-10-22 19:00:25 +00:00
Christian Hammacher
c635638fd1 implemented amb773 - now precaches sounds from speech.ini, can be disabled via compiler switch 2007-10-16 20:59:57 +00:00
David Anderson
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
David Anderson
748d000c02 fixed the other native relying on this offset as well 2007-10-03 00:54:19 +00:00
David Anderson
c1791361da now for the one byte fix... 2007-10-03 00:51:25 +00:00
David Anderson
6a483cfcae fixed amb291 issue 2007-10-03 00:50:30 +00:00
David Anderson
fcdd17480c fix for amb253 - database now spinlocks instead of failing to lock 2007-10-02 23:38:31 +00:00
Steve Dudenhoeffer
21ad8ba71b Extension of amb29 - forgot to change the retarded pause menu 2007-09-09 03:34:52 +00:00
Steve Dudenhoeffer
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
Steve Dudenhoeffer
bd3b7fc70c Fix for amb895 - amx_plugins now displays properly over RCON 2007-09-03 16:39:32 +00:00
David Anderson
26f1c8dec7 clarified menu_create and its handler 2007-09-02 18:52:24 +00:00
David Anderson
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
Steve Dudenhoeffer
58c7239b48 Fix for amb817 - dod stats heading was mislabeled 2007-09-01 16:39:01 +00:00
Christian Hammacher
e616bd523e changed version number to 1.8.0 2007-08-16 21:18:56 +00:00
David Anderson
d163ead2ac it helps, just a bit, to actually commit the file 2007-08-16 19:09:49 +00:00
David Anderson
00838065ae fixed a format bug in statscfg.sma 2007-08-16 19:08:17 +00:00
David Anderson
8298158f08 newmenu stuff is now in its own nice callback. yay 2007-08-16 19:07:59 +00:00
Steve Dudenhoeffer
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
David Anderson
2b15c30ad1 committed a bunch of phrases for statscfg, fixed a few languages missing some phrases 2007-08-16 17:47:00 +00:00
Steve Dudenhoeffer
643ddc18be Removed erroneous default values for pdata string natives. 2007-08-16 17:13:07 +00:00
David Anderson
639db5846e workaround for msvc optimizing away stack usage on detour 2007-08-16 16:30:16 +00:00
Steve Dudenhoeffer
0bb430b3eb Reverted amb149 2007-08-16 15:16:41 +00:00
Christian Hammacher
550dbae0c7 fixed typos and added FindClose to search function 2007-08-12 21:24:27 +00:00
Christian Hammacher
f0ee52f892 now returns error message instead of bug report when trying to install 0 files 2007-08-12 20:28:21 +00:00
Christian Hammacher
84b146d74a added another check to prevent users from running it in an invalid directory 2007-08-11 14:06:03 +00:00
Steve Dudenhoeffer
3f1226e504 Fixed +/- cmds not being set in the flag manager. 2007-08-11 13:38:19 +00:00
Steve Dudenhoeffer
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
Steve Dudenhoeffer
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
David Anderson
16f6048d74 updated comment so future bail doesn't ask "which one is right" 2007-08-10 07:17:40 +00:00
David Anderson
e2c1bad224 fixed a serious bug in the ClientCommand detour for cstrike, crashing on cl_autobuy 2007-08-10 07:12:04 +00:00
Scott Ehlert
e6663991a7 All include files should be semicolon-correct now 2007-08-10 04:52:12 +00:00
Steve Dudenhoeffer
62c41fbd03 Removed semi colon pragma 2007-08-10 03:41:59 +00:00
David Anderson
0b581b1506 fixed mysql makefile 2007-08-09 16:03:41 +00:00
Steve Dudenhoeffer
76a7cafe50 Changed the new %S format option to %a to hopefully prevent some confusion. 2007-08-08 02:40:40 +00:00
Steve Dudenhoeffer
12ab387be5 Implemented amb743 - plmenu for cstrike now has a to spectator option. (Requires cstrike module) 2007-08-08 02:32:53 +00:00
Christian Hammacher
cfc9c1dd02 bumped installer version to 1.8 2007-08-07 21:09:30 +00:00
Steve Dudenhoeffer
544d2dedef moved mkdir from amxmodx.inc to file.inc 2007-08-07 00:54:22 +00:00
Steve Dudenhoeffer
1721383237 Fix for amb736 - find_entity defined twice 2007-08-05 11:23:02 +00:00
Steve Dudenhoeffer
68961a91e2 Fixed amb735 - adminslots cvar comments in config files were misleading 2007-08-05 10:41:10 +00:00
David Anderson
435766b2ef reverted a bad change in fakenatives 2007-08-04 14:18:56 +00:00
David Anderson
750247e8a6 fixed a bug that broke creative natives from the last change 2007-08-04 14:17:19 +00:00
Steve Dudenhoeffer
a81d6f3271 Added hamdata.ini to core config 2007-08-04 04:10:29 +00:00
David Anderson
cb62613501 synced language files 2007-08-04 04:10:14 +00:00
Steve Dudenhoeffer
2efc82ea59 Included fakemeta_util for convenience. 2007-08-04 03:59:56 +00:00
Steve Dudenhoeffer
a95658bd2d Added hamsandwich include files to back include directory 2007-08-04 03:55:42 +00:00
David Anderson
5f10cc1ebc added ns plmenu to build 2007-08-04 03:43:49 +00:00
Steve Dudenhoeffer
226d188d19 Fix for amb257 - get_user_origin mode 4 false positives.
Most should be filtered out.
2007-08-04 03:34:34 +00:00
David Anderson
9e0f3f01a7 fixed ns win32 build 2007-08-04 00:02:35 +00:00
David Anderson
06b461acd7 fixed msvc7 project files for ns 2007-08-03 23:51:10 +00:00
Steve Dudenhoeffer
ffb8fc683b Implemented amb291 - cs_{set,get}_c4_defusing() 2007-08-03 19:11:47 +00:00
Steve Dudenhoeffer
aa2cac0f0c added fastdelegates, sheesh 2007-08-03 17:41:34 +00:00
Steve Dudenhoeffer
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
David Anderson
c5e36a4e3c fixed a possible bad bug in linux builder 2007-08-03 17:31:42 +00:00
David Anderson
bbc6af247b fixed linux being broken 2007-08-03 17:29:59 +00:00
David Anderson
164780363b failed builds block again
added some redirection to windows builder
2007-08-03 17:26:57 +00:00
David Anderson
807e6a0f9a compression is now optional 2007-08-03 17:17:54 +00:00
David Anderson
605bef0482 ham sammich is now versioned properly 2007-08-03 17:01:31 +00:00
David Anderson
2e3c652996 added hamsammich support to build tool
added /useenv support to buildtool for win32
2007-08-03 16:48:04 +00:00
David Anderson
a8652dd91b updated amxxrelease build 2007-08-03 16:37:56 +00:00
David Anderson
2379aa3108 fixed msvc7 project files 2007-08-03 16:36:04 +00:00
Steve Dudenhoeffer
ed3f5dfd4b Fixed the admins list not flushing when amx_reloadadmins is executed. 2007-08-03 16:29:53 +00:00
Steve Dudenhoeffer
747d326ed5 Implemented amb216 - SQL_MakeStdTuple now has an optional timeout parameter. 2007-08-03 15:52:35 +00:00
Steve Dudenhoeffer
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
Steve Dudenhoeffer
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
Steve Dudenhoeffer
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
Steve Dudenhoeffer
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
Steve Dudenhoeffer
e045e2fdb6 Fix for amb196 - amx_modules did not handle invalid modules properly. 2007-08-03 05:27:36 +00:00
Steve Dudenhoeffer
36dc8da47c Removed native/module filters, oops. 2007-08-03 03:01:22 +00:00
Steve Dudenhoeffer
25d95f1115 Fix for amb183 - plmenu's team menu is not compatible with natural selection. 2007-08-03 02:59:46 +00:00
Steve Dudenhoeffer
e254ef6b15 Added ns_get_user_team for a replacement for get_user_team. 2007-08-03 02:57:59 +00:00
Steve Dudenhoeffer
7038305812 Merged ns plugins / include files to trunk.
(ns/unstuck doesn't require engine any more)
2007-08-02 16:37:57 +00:00
Steve Dudenhoeffer
c77176a4ce Re-added svn versioning to module 2007-08-02 16:33:34 +00:00
Steve Dudenhoeffer
c604eefde0 Merge of rewritten NS module into trunk 2007-08-02 16:20:32 +00:00
Steve Dudenhoeffer
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
Steve Dudenhoeffer
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
Steve Dudenhoeffer
ed84900ab6 amb467 - conmotd.txt is removed 2007-08-01 04:19:23 +00:00
Steve Dudenhoeffer
83c82387e3 Changed ArrayGetCell() to return the cell value instead of byreferencing the value. 2007-07-26 16:22:29 +00:00
Steve Dudenhoeffer
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
Steve Dudenhoeffer
ced56c79b6 what the hell how did this change 2007-07-25 18:13:38 +00:00
Steve Dudenhoeffer
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
Steve Dudenhoeffer
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
Steve Dudenhoeffer
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
Steve Dudenhoeffer
2cbf7fca08 Forgot to update SVN with TS3.0 and RegisterHamFromEntity changes 2007-07-19 18:43:27 +00:00
Steve Dudenhoeffer
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
Steve Dudenhoeffer
8316318c31 Fix for amb343 - tfc_clearmodel didn't function as advertised. 2007-07-17 02:18:04 +00:00
Steve Dudenhoeffer
7b6d4ce699 Fix for amb503 - csx module not setting meta result when paused. 2007-06-30 05:11:13 +00:00
Christian Hammacher
6f590c85f6 fixed bug where fwrite_blocks crashed the server 2007-06-29 21:46:24 +00:00
Christian Hammacher
f86dad801f compiled against latest components, updated link of mxFlatPack in .dpr, bumped version to 1.77 2007-06-28 12:23:50 +00:00
David Anderson
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
Steve Dudenhoeffer
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
Steve Dudenhoeffer
ce526ac432 Fixed amb109 - mapsmenu now checks mapcyclefile cvar before reverting to mapcycle.txt 2007-06-22 18:37:38 +00:00
Steve Dudenhoeffer
a3342213b5 Added amb427: Additional weapons to dod_{get,set}_user_ammo 2007-06-22 18:25:16 +00:00
Steve Dudenhoeffer
ef41393bc3 Fixed amb130 - various menus did not take ADMIN_ALL / ADMIN_ADMIN into account. 2007-06-22 17:47:32 +00:00
Steve Dudenhoeffer
a45d98efea Fix for amb421: get_user_weapons omitting a weapon in Day of Defeat. 2007-06-22 17:10:21 +00:00
Steve Dudenhoeffer
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
Steve Dudenhoeffer
3f268e5f2e Fixed amb69 - metamod trying to reload amxmodx on systems with poorly configured clocks. 2007-06-22 16:02:17 +00:00
Steve Dudenhoeffer
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
Steve Dudenhoeffer
6865b984e0 Fixed accidental reversal of think and touch virtual index under Day of Defeat. 2007-06-22 05:06:49 +00:00
Steve Dudenhoeffer
7c4dccac8c Added amb30 - csstats_rankbots will stop bots from showing in /top15 2007-06-21 19:37:58 +00:00
Steve Dudenhoeffer
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
Steve Dudenhoeffer
069c293aba Fixed amb350 - typo in traceline_set_float 2007-06-21 03:44:36 +00:00
Steve Dudenhoeffer
7690f1a099 Fixed the mirror system not working. 2007-06-12 15:59:10 +00:00
Scott Ehlert
add02dc55e Fixed amb365 - EF_SetSize() stock had incorrect params 2007-06-05 02:38:48 +00:00
Steve Dudenhoeffer
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
Steve Dudenhoeffer
ff3def3d00 Forgot to remove the MAX_MAPS define :o 2007-05-24 18:19:45 +00:00
Steve Dudenhoeffer
39f759368f Added show_activity changes to mapsmenu
Made mapsmenu use cellarray natives instead of MAX_MAPS
2007-05-24 18:15:41 +00:00
Steve Dudenhoeffer
4cdd43b29b Fixed accidental commit of a language file 2007-05-24 17:16:36 +00:00
Steve Dudenhoeffer
0c82e09df1 Added amb42 - different amx_show_activity values. 2007-05-24 17:11:11 +00:00
Steve Dudenhoeffer
1129f09660 Added the any tag fix for functions returning any: 2007-05-22 01:29:18 +00:00
Steve Dudenhoeffer
079606c143 Added amb311 - mapcycle file now ignores .bsp extension 2007-05-20 15:03:26 +00:00
Steve Dudenhoeffer
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
Steve Dudenhoeffer
65748001f0 Added FCAP_* constants 2007-05-16 16:28:44 +00:00
Steve Dudenhoeffer
4504875df9 Fixed Makefile
Fixed a few forwards not having FP_DONE at the end (doh!)
2007-05-16 15:24:14 +00:00
Steve Dudenhoeffer
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
Steve Dudenhoeffer
7bb562182f Changed _array_included to _cellarray_included 2007-05-14 22:11:28 +00:00
Steve Dudenhoeffer
77ca104a8d Renamed array.inc to cellarray.inc so that rukia doesn't start hagging about it. 2007-05-14 22:10:13 +00:00
Steve Dudenhoeffer
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
Steve Dudenhoeffer
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
Steve Dudenhoeffer
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
Steve Dudenhoeffer
d38d2f56e1 Fixed large return values (Vectors) in MSVC. 2007-05-12 13:16:05 +00:00
Steve Dudenhoeffer
9b0ed67c9c Fixed vtable for TFC and NS 2007-05-11 16:54:26 +00:00
Steve Dudenhoeffer
1081e84981 Disassembled the rest of the mods, all but cs are untested currently. 2007-05-11 15:02:25 +00:00
Steve Dudenhoeffer
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
Steve Dudenhoeffer
0c56e2803e Added more virtual functions to the table, only have counter-strike disassembled currently. 2007-05-10 16:08:02 +00:00
Steve Dudenhoeffer
5fc89085d6 Added the ability to change parameters on the fly.
Added GetHamReturnStatus()
2007-05-09 14:58:55 +00:00
Steve Dudenhoeffer
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
Steve Dudenhoeffer
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
Steve Dudenhoeffer
1f1ecfa590 Added module auto load to hamsammich.
Started the stupid comment crap.
2007-05-05 12:36:12 +00:00
Steve Dudenhoeffer
bd2ad31f5e Fixed HamExecuteB and made its system a bit more logical. 2007-05-04 15:42:02 +00:00
Steve Dudenhoeffer
fb5e7dbfdb Added unhooking of virtual tables at map change.
Removed some more debugging output.
2007-05-04 14:56:57 +00:00
Steve Dudenhoeffer
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
Steve Dudenhoeffer
1073a42409 Fixed silly link errors in MSVC 2007-05-04 13:05:09 +00:00
Steve Dudenhoeffer
66d7d39bee First commit of the rewrite
Doesn't build on windows for some retarded reason
2007-05-04 12:51:13 +00:00
Steve Dudenhoeffer
46bd9127fb Removing files for a r3wr1t3 2007-05-04 12:39:53 +00:00
Scott Ehlert
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
Scott Ehlert
006396bc92 Apparently this was a bad idea 2007-05-04 01:17:13 +00:00
Scott Ehlert
dc4c9f0258 Fixed this up or something strange like that... 2007-05-04 01:11:01 +00:00
David Anderson
3b737ab87b added request amb122 2007-05-03 13:27:51 +00:00
David Anderson
6170cbc95a implemented amb92 2007-05-02 23:11:49 +00:00
David Anderson
78f18de61a Fixed bug amb244 2007-05-02 02:06:07 +00:00
Scott Ehlert
e34120803d Implemented request amb242: added cs_get/set_user_hostagekills() natives 2007-05-01 21:38:39 +00:00
Scott Ehlert
fdb094045e Wow, nice typo DS 2007-05-01 21:27:52 +00:00
Scott Ehlert
8c45216cfd Oh, forgot to reset ServerPrint 2007-04-30 18:32:40 +00:00
Scott Ehlert
897ed0cb10 Implemented request amb237 - added ServerPrint to Fakemeta 2007-04-30 18:29:33 +00:00
Scott Ehlert
fd8489d088 Fixed amb116 - DispatchKeyValue didn't work with worldspawn (entity 0) 2007-04-28 16:19:04 +00:00
David Anderson
710cd548a9 added linux support to CS_InternalCmd 2007-04-26 20:07:31 +00:00
David Anderson
525eb65e1c updated linux compiler builds 2007-04-26 20:04:38 +00:00
David Anderson
580e52bd2c CZ Bots will now follow restrictions
Fixed amb222 (rebuy could get around restrictions)
2007-04-26 19:22:23 +00:00
David Anderson
2f6bfca68e added CS hook to catch internal bot commands and rebuy commands for players 2007-04-26 19:21:11 +00:00
David Anderson
0377715cdc added CS hook to catch internal bot commands and rebuy commands for players 2007-04-26 19:18:55 +00:00
Steve Dudenhoeffer
e3240214a3 Fixed some typos 2007-04-26 14:20:19 +00:00
Scott Ehlert
fc2b220c38 Fixed amb230 - radius_damage didn't completely kill players on some mods 2007-04-25 18:13:16 +00:00
Scott Ehlert
74c6290dc0 imessage and admin plugins compile again 2007-04-25 17:24:02 +00:00
Scott Ehlert
a93ef02efa Base package builds completely again - DS can't do anything right :| 2007-04-25 16:37:13 +00:00
Steve Dudenhoeffer
68d2b03e48 Added amb37, amb38, amb39 and amb205: various cstrike natives.
(Still need to test)
2007-04-25 15:40:15 +00:00
David Anderson
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
David Anderson
3b80342a02 fixed windows build part 2 2007-04-25 14:15:35 +00:00
David Anderson
8f49cddd7d fixed windows build 2007-04-25 14:15:00 +00:00
David Anderson
d679885985 fixed a memory leak in SortCustom1D() 2007-04-25 14:10:47 +00:00
David Anderson
82c3807bd5 implemented SQL_QuoteString and SQL_QuoteStringFmt
fixed sqlx test script not working on first load
2007-04-25 13:55:56 +00:00
David Anderson
58ad23186b updated compiler builds 2007-04-25 13:48:31 +00:00
David Anderson
c957a9db0f Added SQL_QuoteString to include/tests 2007-04-25 13:45:15 +00:00
David Anderson
359b7e25dd added sql_rewind 2007-04-25 13:19:42 +00:00
Scott Ehlert
5d6d0282b0 Fixed amb110 - socket_change() returned 1 if select() syscall returned -1 (KoST) 2007-04-24 19:17:30 +00:00
Scott Ehlert
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
Steve Dudenhoeffer
0d5531a090 IMessage now supports unlimited messages and uses pcvars 2007-04-24 18:18:45 +00:00
Steve Dudenhoeffer
2659c906fb Changed map list to use dynamic arrays 2007-04-24 17:41:56 +00:00
Steve Dudenhoeffer
d563ecb060 Added pseudo dynamic array natives.
Changed some of the "..." tags to "any".
2007-04-24 16:38:36 +00:00
David Anderson
bfe1ff6e15 implemented amb27 (SQL_Rewind)
fixed builds
2007-04-24 15:46:33 +00:00
David Anderson
adfc2ab451 fixed mysql msvc7 build 2007-04-24 15:26:08 +00:00
Steve Dudenhoeffer
ea912f794c Stole the magical any: tag from sourcemod 2007-04-24 13:36:36 +00:00
Scott Ehlert
8e1f54465d Fixed amb226 - missing return after pfnClientPrintf 2007-04-20 19:02:35 +00:00
Steve Dudenhoeffer
2c2259ea15 Fixed possible issue that could arise with the new newmenu last page handler :O 2007-04-20 15:47:55 +00:00
Steve Dudenhoeffer
be4fdb1776 Fixed the completely börked handling of the last page with newmenus. 2007-04-20 15:27:04 +00:00
Steve Dudenhoeffer
76158b031d Forgot to actually register LookupLangKey :o 2007-04-20 03:02:41 +00:00
Steve Dudenhoeffer
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
Steve Dudenhoeffer
201d65749e Added LookupLangKey for the upcoming show_activity changes. 2007-04-20 02:55:59 +00:00
Steve Dudenhoeffer
17d8197e72 Added amb#34 - Plugin cvar/command menus.
Still need to add ML support.
2007-04-18 15:52:03 +00:00
Steve Dudenhoeffer
1ed1d0005c Added menu property to change number color 2007-04-18 04:20:48 +00:00
Steve Dudenhoeffer
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
David Anderson
1ec4d9cc7d fixed amb18 and various associated menu re-entrancy bugs 2007-04-16 18:00:54 +00:00
David Anderson
b90bc3a3e4 fixed bug amb46 2007-04-16 17:11:40 +00:00
David Anderson
de530e2ca3 fixed amb200, added native test suite 2007-04-16 17:08:15 +00:00
David Anderson
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
Steve Dudenhoeffer
7b4283bf4a Fixed amb207: Last item displayed as "10" instead of "0" on new menus. 2007-04-13 23:59:52 +00:00
Steve Dudenhoeffer
1f423dc39f Fixed amb208: new menu state not being reset when item has no state callback. 2007-04-13 23:57:14 +00:00
Steve Dudenhoeffer
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
Steve Dudenhoeffer
3328b570d4 Removed accidental server debug output. 2007-04-13 18:44:39 +00:00
Steve Dudenhoeffer
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
Steve Dudenhoeffer
61052c41a1 added amb64 - amx_voteban auto detects if it should ip ban. 2007-04-13 18:17:24 +00:00
Steve Dudenhoeffer
5c68df7ac7 Fixed the damn comments 2007-04-02 18:39:38 +00:00
Steve Dudenhoeffer
8872d98dd6 Possible fix for amb86: "USER" key should have been "PLAYER" 2007-03-30 14:33:52 +00:00
Steve Dudenhoeffer
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
Steve Dudenhoeffer
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
Steve Dudenhoeffer
b49bf1b13c Fix for amb78: get_concmdsnum result caching causing discrepencies 2007-03-30 02:13:49 +00:00
Steve Dudenhoeffer
81994ecf58 Fix for access() with ADMIN_ALL
Very minor optimization for is_user_admin

(amb81)
2007-03-30 02:04:30 +00:00
Steve Dudenhoeffer
4682cec1cb Documentation fix for amb120 2007-03-30 01:59:57 +00:00
Steve Dudenhoeffer
b9a0ffacc4 Fix for amb118: amx_help would not output ADMIN_ADMIN commands 2007-03-30 01:52:10 +00:00
Scott Ehlert
ae46e3f6ab Moved svn_version.h and svn_version.tpl out of SDK directories... 2007-03-27 16:07:28 +00:00
Scott Ehlert
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
Scott Ehlert
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
Scott Ehlert
a004e906dd Updated SQLite to 3.3.13 - why? I have no idea 2007-03-21 20:19:37 +00:00
Scott Ehlert
eaa4122c5a Fixed amb107: socket_open doesn't return error by reference 2007-03-19 09:45:45 +00:00
Steve Dudenhoeffer
e326ab1593 Fixed amb94 - Name length in amx_psay
I'm never trusting Brad again.
2007-03-18 12:10:36 +00:00
David Anderson
5252e06c2a fixed amb90 (not working in 0th slot, related to commit 2491) 2007-03-16 04:17:47 +00:00
Scott Ehlert
e61809496d Updated modules.versions 2007-03-16 04:16:30 +00:00
Scott Ehlert
edaf960407 Added request amb76 - hex format specifier (%x and %X) 2007-03-14 02:16:09 +00:00
Scott Ehlert
e3217964c4 Fixed core MSVC8 compile :\ 2007-03-14 02:12:51 +00:00
Scott Ehlert
397479cd77 Fixed amb85 - tag mismatch warning on ShowSyncHudMsg 2007-03-13 22:51:12 +00:00
Scott Ehlert
d151ee0b58 Added svn:ignore property to a bunch of stuff 2007-03-13 21:26:04 +00:00
Scott Ehlert
ce88004900 Tiny bit of reorganizing done to WinCSX 2007-03-13 21:10:28 +00:00
Scott Ehlert
1e8d0e10e6 Fixed unused symbol warning 2007-03-13 20:34:38 +00:00
Scott Ehlert
bb641688ee Oops, guess I forgot to fix this path 2007-03-13 20:22:47 +00:00
Scott Ehlert
ab53914351 Massive reorganization attempt - part 2
Moved old/defunct/unofficial modules out of trunk
2007-03-13 19:45:19 +00:00
Scott Ehlert
54186736c8 Massive reorganization attempt - part 1.8 2007-03-13 19:28:24 +00:00
Scott Ehlert
b66fea0fbc Massive reorganization attempt - part 1.77 2007-03-13 19:22:44 +00:00
Scott Ehlert
bf2c9620f3 Massive reorganization attempt - part 1.76 2007-03-13 19:19:33 +00:00
Scott Ehlert
af96229d5d Massive reorganization attempt - part 1.75 2007-03-13 18:44:23 +00:00
Scott Ehlert
be323039d1 Massive reorganization attempt - part 1.5 2007-03-13 11:48:53 +00:00
Scott Ehlert
c71be87a3a Massive reorganization attempt - part 1
Oh dear, what has DS done now?
2007-03-13 11:46:03 +00:00
David Anderson
e4b01bc066 fixed various linux compiling issues... 2007-03-13 04:16:20 +00:00
Scott Ehlert
3ac076e098 Hello, I might have added some SLN files for the MSVC8 projects 2007-03-13 03:11:28 +00:00
David Anderson
e6120fdcd6 fixed a small bug where loading under dlsym crashed
fixed line endings in vim
2007-03-13 00:42:16 +00:00
David Anderson
4dc4616933 added "makeopts" to win32 devenv 2007-03-13 00:29:10 +00:00
David Anderson
46a3929365 excluded svn_version.tpl
if a mod fails to build, it's no longer fatal
2007-03-13 00:21:35 +00:00
David Anderson
4597868d30 wow i forgot core's template 2007-03-12 22:45:57 +00:00
David Anderson
cf716c4049 added tsfun and added a --modules option to the versionchanger script 2007-03-12 22:33:43 +00:00
David Anderson
cc6b9d3d81 added dynamic versioning
committed .sln files to a few wayward projects
2007-03-12 22:27:27 +00:00
David Anderson
a34279b971 fixed a bug in the installer packager 2007-03-12 20:44:29 +00:00
Scott Ehlert
5cac87c99f *sigh* This compiles again 2007-03-11 05:19:54 +00:00
Scott Ehlert
309bc2dcaa Added a special comment inside in_view_cone 2007-03-11 04:55:38 +00:00
Steve Dudenhoeffer
7124f8bd2c MSVC didn't like my cdecl placement :( 2007-03-10 18:16:21 +00:00
Steve Dudenhoeffer
c9b19c76a5 Added a whole lot more functions that nobody will use 2007-03-10 18:05:30 +00:00
Steve Dudenhoeffer
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
David Anderson
71065a65dd attempted merge at 1.77 back into trunk... Oh MY GOD 2007-03-09 03:04:40 +00:00
Christian Hammacher
7adc49c541 changed start page back to original first page 2007-03-08 17:23:36 +00:00
David Anderson
baba221dd9 made my life 1,000 times easier for creating these release builds 2007-03-08 06:20:11 +00:00
David Anderson
829485ef2a bumped version one last time
fixed makefile for nongpl changes
2007-03-08 04:54:03 +00:00
Christian Hammacher
b793b80360 fixed several FTP bugs (thanks bail!) 2007-03-07 20:38:42 +00:00
David Anderson
ea34c2c78a fixed a bug reported by peanut where amx_fwrite() had the wrong sizeof() type 2007-03-07 02:29:54 +00:00
Christian Hammacher
722e97fef2 (hopefully) fixed bug where 0 files+dirs were detected 2007-03-05 21:37:48 +00:00
Steve Dudenhoeffer
bd412d7204 Fixed bug amb70 - include files not semicolon-correct
Also, removed OLOcode from amxmisc.inc
2007-03-05 19:30:40 +00:00
David Anderson
39e6d958bf bumped installer version 2007-03-04 06:06:44 +00:00
David Anderson
bb54b37399 removed allow_nongpl, it wasn't really viable 2007-03-04 04:37:42 +00:00
David Anderson
88dd3b021e removed this option 2007-03-04 04:33:29 +00:00
David Anderson
ef4d19378d bumped more versions 2007-03-04 03:43:57 +00:00
David Anderson
7f1ea1490d bumped necessary module versions 2007-03-04 03:42:11 +00:00
David Anderson
041fb4e37f updated compiler builds 2007-03-04 01:46:38 +00:00
David Anderson
193e59df90 updated compiler builds 2007-03-04 01:40:40 +00:00
David Anderson
d4703f045d fixed a bug where '%c' did not correctly count toward the writable string length 2007-03-04 00:02:23 +00:00
David Anderson
109b1e45b5 added non-gpl plugin blocking (wow i can't believe it came to this) 2007-03-03 23:14:24 +00:00
Steve Dudenhoeffer
1f1edef98d Merged in NS 3.2 Final offsets 2007-03-01 22:39:57 +00:00
David Anderson
83631e95aa fixed bug amb41 2007-02-24 21:08:00 +00:00
David Anderson
6eb1242600 fixed tags (amb36) 2007-02-24 20:07:21 +00:00
Steve Dudenhoeffer
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
David Anderson
09f271e5d0 Fixed amb35, multiple plugins loading 2007-02-21 18:42:14 +00:00
Steve Dudenhoeffer
e35a8326d5 Fixed an issue where backwards amx mod compatibility layer wasn't transparent. 2007-02-20 22:25:17 +00:00
DevconeS
09d46aa025 Fixed native get_num_ents 2007-02-20 20:57:21 +00:00
Steve Dudenhoeffer
615e097c68 Fixed am49892 - Plugin load fails going to error logs instead of normal logs 2007-02-19 08:46:43 +00:00
Steve Dudenhoeffer
ade56b62e9 Fixed am50089 - unary - float operator 2007-02-19 08:11:00 +00:00
Steve Dudenhoeffer
b3d7f04b5e Fixed am50530 - amx_psay output format fix 2007-02-19 07:34:38 +00:00
Steve Dudenhoeffer
4f81c50a3e Fixed am50731 - compiler crash when amxmisc is included before amxmodx 2007-02-19 07:03:26 +00:00
Steve Dudenhoeffer
d45c3aeb96 Fixed am51050 - "amxx {pause,unpause" had misleading output 2007-02-19 06:57:26 +00:00
Steve Dudenhoeffer
fff603635a Fixed am51051 - unpause() returning true on stopped plugins 2007-02-19 06:43:52 +00:00
Steve Dudenhoeffer
06f01ea7dc Wow I deleted the comment too! 2007-02-19 06:38:08 +00:00
Steve Dudenhoeffer
2395abcf7e Fixed retarded typo 2007-02-19 06:37:03 +00:00
Steve Dudenhoeffer
d33f9ba2d4 Fixed am51083 - Comments in amxmodx.inc 2007-02-19 06:29:02 +00:00
Steve Dudenhoeffer
aec28542ac Fixed am51276 - typod "return" 2007-02-19 06:23:34 +00:00
Steve Dudenhoeffer
73219c45dd Fixed bug am51368 - Unused variable 2007-02-19 06:16:56 +00:00
Steve Dudenhoeffer
39d6cb7840 Fixed #error ignoring #if blocks 2007-02-16 18:49:21 +00:00
Christian Hammacher
bfd4e345dd corrected a typo 2007-02-14 18:55:42 +00:00
Steve Dudenhoeffer
aded0f9c1c Added request am49339 - exploding chainsaw gun 2007-02-14 05:17:57 +00:00
Christian Hammacher
811265e28b made it a little safer 2007-02-12 19:35:01 +00:00
Christian Hammacher
0caffa2b82 fixed bug where directories in / couldn't be detected unless your home directory was / 2007-02-12 19:32:32 +00:00
Christian Hammacher
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
Steve Dudenhoeffer
862ed243be Fixed typo (am51042) 2007-02-10 21:10:55 +00:00
Steve Dudenhoeffer
39f1fa6045 Fixed unnecessary call to accessUser() (am51009) 2007-02-09 08:34:33 +00:00
Steve Dudenhoeffer
f26939e2cc Fixed bug am50907 - Name and Tag admins were case sensitive 2007-02-09 07:26:37 +00:00
Christian Hammacher
9d53451933 bumped version to 1.76d 2007-02-05 21:21:50 +00:00
Christian Hammacher
4ae54eeb2a fixed am50849 2007-02-05 21:13:15 +00:00
Scott Ehlert
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
DevconeS
0f22a7fa06 Added missing natives:
- take_damage
- entity_use
- get_num_ents
2007-01-31 20:20:49 +00:00
David Anderson
7f3c2d00ac fixed bug am50501 2007-01-28 05:01:38 +00:00
Steve Dudenhoeffer
b324e8ed9d Merged revision 3260 from 1.77; Stats would not display on awkward mp_roundtime settings 2007-01-26 06:15:49 +00:00
Steve Dudenhoeffer
8420823713 Merged revision 3251 from 1.77; debug commands not counted as running in amx_plugins 2007-01-26 06:12:25 +00:00
Steve Dudenhoeffer
1d1b50ce0c Merged revision 3250 from 1.77; amx_addban is now ADMIN_RCON access by default 2007-01-26 06:11:00 +00:00
Steve Dudenhoeffer
35fcca8a66 Merged revision 3258 from 1.77; forward_return with non-string values 2007-01-26 06:08:29 +00:00
Steve Dudenhoeffer
7a01503478 Merged revision 3249 from 1.77; fixed typo in tfcconst.in (am50097) 2007-01-26 06:04:11 +00:00
Steve Dudenhoeffer
dd8f138892 Back ported revision 3242 - Every include file now is const correct (am49281) 2007-01-26 05:56:10 +00:00
Orangutanz
8341e41f04 Fixed TE_GLOWSPRITE (vittu) & TE_PLAYERSPRITES examples 2007-01-18 00:18:31 +00:00
Orangutanz
a682ec6b7a Fixed TE_DLIGHT example Valve mistake! (P34nut) 2007-01-17 18:16:17 +00:00
Orangutanz
451b648c7f Fixed TR_InOpen missing with *et_tr native (XxAvalanchexX) 2007-01-17 14:52:09 +00:00
David Anderson
2d1c43c937 Merged in changes to report 49977 2007-01-17 06:56:52 +00:00
David Anderson
17adb214f2 Fixed bug am49982 (wrote parameter counts) 2007-01-17 05:32:45 +00:00
Christian Hammacher
3a2839c6c9 bugfix for 49698 2007-01-15 15:56:48 +00:00
Christian Hammacher
f96f95c4ff translated shortcuts into english :x 2007-01-15 15:53:14 +00:00
Orangutanz
609fdae508 Fixed native get_user_origin mode 4 2007-01-09 15:01:08 +00:00
Christian Hammacher
580305ce92 fixed am49041 (hopefully) 2007-01-02 13:23:23 +00:00
Christian Hammacher
cbfd12e0f1 fixed am49040 2007-01-02 13:17:33 +00:00
Christian Hammacher
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
2739 changed files with 865304 additions and 318073 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));
int handle = EventHandles.create(event.get());
if (!event)
return NULL;
if (!handle)
{
return 0;
}
m_Events[msgid].put(event);
m_Events[msgid].append(ke::Move(event));
return 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;
m_CurrentMsgType = -1;
m_ParseFun = NULL;
if (event->m_State == FSTATE_ACTIVE)
{
executeForwards(event->m_Func, static_cast<cell>(m_ReadVault ? m_ReadVault[0].iValue : 0));
}
}
// 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;
}
}
@ -495,7 +550,9 @@ 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,30 +103,31 @@ 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);
void parseValue(float fValue);
@ -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,39 +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 "debugger.h"
#include "binlog.h"
CForward::CForward(const char *name, ForwardExecType et, int numParams, const ForwardParam *paramTypes, int fwd_type)
CForward::CForward(const char *name, ForwardExecType et, int numParams, const ForwardParam *paramTypes)
{
m_FuncName = name;
m_ExecType = et;
@ -47,23 +25,16 @@ CForward::CForward(const char *name, ForwardExecType et, int numParams, const Fo
for (CPluginMngr::iterator iter = g_plugins.begin(); iter; ++iter)
{
if ((fwd_type != FORWARD_ALL) &&
((fwd_type == FORWARD_ONLY_NEW && ((*iter).getAMX()->flags & AMX_FLAG_OLDFILE))
|| (fwd_type == FORWARD_ONLY_OLD && !((*iter).getAMX()->flags & AMX_FLAG_OLDFILE))
))
{
continue;
}
if ((*iter).isValid() && amx_FindPublic((*iter).getAMX(), name, &func) == AMX_ERR_NONE)
{
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)
@ -75,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)
@ -99,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;
}
@ -118,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];
}
}
@ -130,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)
{
@ -156,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)
{
@ -185,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]);
}
}
@ -225,7 +227,7 @@ 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;
}
@ -237,7 +239,7 @@ 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;
}
@ -265,7 +267,7 @@ cell CSPForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
if (pDebugger)
pDebugger->BeginExec();
// handle strings & arrays
// handle strings & arrays & values by reference
int i;
for (i = 0; i < m_NumParams; ++i)
@ -295,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];
}
}
@ -304,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?
@ -329,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)
@ -360,6 +378,20 @@ 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;
@ -367,17 +399,17 @@ cell CSPForward::execute(cell *params, ForwardPreparedArray *preparedArrays)
return retVal;
}
int CForwardMngr::registerForward(const char *funcName, ForwardExecType et, int numParams, const ForwardParam * paramTypes, int fwd_type)
int CForwardMngr::registerForward(const char *funcName, ForwardExecType et, int numParams, const ForwardParam * paramTypes)
{
int retVal = m_Forwards.size() << 1;
CForward *tmp = new CForward(funcName, et, numParams, paramTypes, fwd_type);
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;
}
@ -398,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)
@ -408,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;
@ -420,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())
@ -447,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;
@ -455,7 +487,7 @@ 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)
@ -513,24 +545,26 @@ 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;
}
@ -543,7 +577,9 @@ void CForwardMngr::unregisterSPForward(int id)
{
//make sure the id is valid
if (!isIdValid(id) || m_SPForwards.at(id >> 1)->isFree)
{
return;
}
CSPForward *fwd = m_SPForwards.at(id >> 1);
@ -556,7 +592,39 @@ void CForwardMngr::unregisterSPForward(int id)
}
}
int registerForwardC(const char *funcName, ForwardExecType et, cell *list, size_t num, int fwd_type)
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)
{
ForwardParam params[FORWARD_MAX_PARAMS];
@ -565,7 +633,7 @@ int registerForwardC(const char *funcName, ForwardExecType et, cell *list, size_
params[i] = static_cast<ForwardParam>(list[i]);
}
return g_forwards.registerForward(funcName, et, num, params, fwd_type);
return g_forwards.registerForward(funcName, et, num, params);
}
int registerForward(const char *funcName, ForwardExecType et, ...)
@ -676,13 +744,26 @@ 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
@ -51,10 +29,6 @@
const int FORWARD_MAX_PARAMS = 32;
#define FORWARD_ONLY_OLD 1
#define FORWARD_ONLY_NEW 2
#define FORWARD_ALL 3
enum ForwardExecType
{
ET_IGNORE = 0, // Ignore return vaue
@ -72,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
@ -97,7 +73,7 @@ class CForward
const char *m_FuncName;
ForwardExecType m_ExecType;
int m_NumParams;
String m_Name;
ke::AString m_Name;
struct AMXForward
{
@ -105,13 +81,13 @@ class CForward
int func;
};
typedef CVector<AMXForward> AMXForwardList;
typedef ke::Vector<AMXForward> AMXForwardList;
AMXForwardList m_Funcs;
ForwardParam m_ParamTypes[FORWARD_MAX_PARAMS];
public:
CForward(const char *name, ForwardExecType et, int numParams, const ForwardParam * paramTypes, int fwd_type=FORWARD_ALL);
CForward(const char *name, ForwardExecType et, int numParams, const ForwardParam * paramTypes);
CForward() {} // leaves everything unitialized'
cell execute(cell *params, ForwardPreparedArray *preparedArrays);
@ -123,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
@ -144,7 +120,6 @@ public:
class CSPForward
{
friend class CForwardMngr;
const char *m_FuncName;
int m_NumParams;
ForwardParam m_ParamTypes[FORWARD_MAX_PARAMS];
@ -152,7 +127,7 @@ class CSPForward
int m_Func;
bool m_HasFunc;
String m_Name;
ke::AString m_Name;
bool m_InExec;
bool m_ToDelete;
@ -177,7 +152,7 @@ public:
const char *getFuncName() const
{
return m_Name.c_str();
return m_Name.chars();
}
ForwardParam getParamType(int paramId) const
@ -191,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,13 +185,15 @@ public:
// Interface
// Register normal forward
int registerForward(const char *funcName, ForwardExecType et, int numParams, const ForwardParam *paramTypes, int fwd_type=FORWARD_ALL);
int registerForward(const char *funcName, ForwardExecType et, int numParams, const ForwardParam *paramTypes);
// Register single plugin forward
int registerSPForward(const char *funcName, AMX *amx, int numParams, const ForwardParam * paramTypes);
int registerSPForward(int func, AMX *amx, int numParams, const ForwardParam * paramTypes);
// 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);
@ -234,7 +211,7 @@ public:
// (un)register forward
int registerForward(const char *funcName, ForwardExecType et, ...);
int registerForwardC(const char *funcName, ForwardExecType et, cell *list, size_t num, int fwd_type=FORWARD_ALL);
int registerForwardC(const char *funcName, ForwardExecType et, cell *list, size_t num);
int registerSPForwardByName(AMX *amx, const char *funcName, ...);
int registerSPForwardByNameC(AMX *amx, const char *funcName, cell *list, size_t num);
int registerSPForward(AMX *amx, int func, ...);

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,24 +23,29 @@
#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++))
while ((c = *str++))
{
hash = ((hash << 5) + hash) + c; // hash*33 + c
}
@ -79,13 +58,27 @@ int HashAlt<const char *>(char const * const &k)
unsigned long hash = 5381;
register const char *str = k;
register char c;
while ((c = *str++))
while ((c = *str++))
{
hash = ((hash << 5) + hash) + c; // hash*33 + c
}
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;
vec.pop();
AddEntry(key, pDef->ptr());
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,23 +585,19 @@ 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,8 +205,13 @@ 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)
{
valid = false;
@ -220,11 +224,11 @@ void LogEventsMngr::executeLogEvents()
break;
}
}
if (!valid)
if (!valid)
break;
}
if (valid)
{
executeForwards(a->func);
@ -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;
@ -117,13 +96,16 @@ 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,77 +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 (m_watch_iter.a == c)
{
++m_watch_iter;
}
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()

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,13 +44,17 @@ 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:
@ -84,8 +66,7 @@ public:
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
@ -110,4 +91,6 @@ 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 vgui;
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);
}
@ -70,19 +49,20 @@ void CModule::clear(bool clearFilename)
m_Metamod = false;
m_Handle = NULL;
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;
}
@ -229,21 +206,20 @@ bool CModule::queryModule()
// Try new interface first
QUERYMOD_NEW queryFunc_New = (QUERYMOD_NEW)DLPROC(m_Handle, "AMXX_Query");
if (queryFunc_New)
{
m_Amxx = true;
int ifVers = AMXX_INTERFACE_VERSION;
g_ModuleCallReason = ModuleCall_Query;
g_CurrentlyCalledModule = this;
int retVal = (*queryFunc_New)(&ifVers, &m_InfoNew);
g_CurrentlyCalledModule = NULL;
g_ModuleCallReason = ModuleCall_NotCalled;
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,12 +231,12 @@ 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)
{
m_InfoNew.library = m_InfoNew.logtag;
if (StrCaseStr(m_InfoNew.library, "sql")
if (StrCaseStr(m_InfoNew.library, "sql")
|| StrCaseStr(m_InfoNew.library, "dbi"))
{
m_InfoNew.libclass = "DBI";
@ -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,30 +311,25 @@ bool CModule::detachModule()
RemoveLibraries(this);
if (m_Amxx)
DETACHMOD_NEW detachFunc_New = (DETACHMOD_NEW)DLPROC(m_Handle, "AMXX_Detach");
if (detachFunc_New)
{
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;
}
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();
return true;
}
@ -377,10 +374,10 @@ void CModule::CallPluginsLoaded()
return;
PLUGINSLOADED_NEW func = (PLUGINSLOADED_NEW)DLPROC(m_Handle, "AMXX_PluginsLoaded");
if (!func)
return;
func();
}
@ -400,8 +397,9 @@ 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;
}
return "unknown";
}

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,15 +47,17 @@ 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
MODULE_STATUS m_Status; // status
@ -88,37 +69,33 @@ public:
~CModule();
// Interface
bool attachModule();
bool queryModule();
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,54 +1,33 @@
/* 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);
}
@ -64,10 +43,10 @@ void CPluginMngr::Finalize()
{
if (m_Finalized)
return;
pNatives = BuildNativeTable();
CPlugin *a = head;
while (a)
{
if (a->getStatusCode() == ps_running)
@ -77,44 +56,45 @@ void CPluginMngr::Finalize()
}
a = a->next;
}
m_Finalized = true;
}
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 (!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;
}
// Find now folder
char pluginName[256], error[256], debug[256];
int debugFlag = 0;
const char *pluginsDir = get_localinfo("amxx_pluginsdir", "addons/amxmodx/plugins");
String line;
List<String *>::iterator block_iter;
char line[512];
while (!feof(fp))
List<ke::AString *>::iterator block_iter;
while (!feof(fp))
{
pluginName[0] = '\0';
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,8 +104,8 @@ 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))
{
continue;
@ -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);
}
}
}
@ -171,20 +205,20 @@ int CPluginMngr::loadPluginsFromFile(const char* filename, bool warn)
void CPluginMngr::clear()
{
CPlugin**a = &head;
CPlugin**a = &head;
while (*a)
unloadPlugin(a);
m_Finalized = false;
if (pNatives)
{
delete [] pNatives;
pNatives = NULL;
}
List<String *>::iterator iter = m_BlockList.begin();
List<ke::AString *>::iterator iter = m_BlockList.begin();
while (iter != m_BlockList.end())
{
delete (*iter);
@ -196,46 +230,57 @@ void CPluginMngr::clear()
CPluginMngr::CPlugin* CPluginMngr::findPlugin(AMX *amx)
{
CPlugin*a = head;
while (a && &a->amx != amx)
a = a->next;
return a;
}
CPluginMngr::CPlugin* CPluginMngr::findPlugin(int index)
{
CPlugin*a = head;
while (a && index--)
a = a->next;
return a;
}
CPluginMngr::CPlugin* CPluginMngr::findPlugin(const char* name)
{
if (!name)
return 0;
int len = strlen(name);
if (!len)
return 0;
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)
{
case ps_running:
case ps_running:
{
if (m_Debug)
{
@ -250,41 +295,43 @@ const char* CPluginMngr::CPlugin::getStatus() const
case ps_stopped: return "stopped";
case ps_locked: return "locked";
}
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);
char file[256];
char* path = build_pathname_r(file, sizeof(file) - 1, "%s/%s", p, n);
failcounter = 0;
title = unk;
author = unk;
version = unk;
url = unk;
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)
{
status = ps_running;
} else {
status = ps_bad_load;
}
amx.userdata[UD_FINDPLUGIN] = this;
paused_fun = 0;
next = 0;
id = i;
if (status == ps_running)
{
m_PauseFwd = registerSPForwardByName(&amx, "plugin_pause", FP_DONE);
m_UnpauseFwd = registerSPForwardByName(&amx, "plugin_unpause", FP_DONE);
if (amx.flags & AMX_FLAG_DEBUG)
{
m_Debug = true;
@ -354,22 +401,22 @@ void CPluginMngr::CPlugin::Finalize()
{
char buffer[128];
int old_status = status;
if (CheckModules(&amx, buffer))
{
if (amx_Register(&amx, core_Natives, -1) != AMX_ERR_NONE)
{
Handler *pHandler = (Handler *)amx.userdata[UD_HANDLER];
int res = 0;
if (pHandler->IsNativeFiltering())
res = amx_CheckNatives(&amx, native_handler);
if (!res)
{
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,18 +424,18 @@ 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());
}
}
void CPluginMngr::CPlugin::pauseFunction(int id)
{
{
}
void CPluginMngr::CPlugin::unpauseFunction(int id)
@ -396,8 +443,8 @@ void CPluginMngr::CPlugin::unpauseFunction(int id)
}
void CPluginMngr::CPlugin::setStatus(int a)
{
status = a;
{
status = a;
g_commands.clearBufforedInfo(); // ugly way
}
@ -409,7 +456,7 @@ void CPluginMngr::CPlugin::pausePlugin()
// call plugin_pause if provided
if (m_PauseFwd != -1)
executeForwards(m_PauseFwd);
setStatus(ps_paused);
}
}
@ -421,7 +468,7 @@ void CPluginMngr::CPlugin::unpausePlugin()
{
// set status first so the function will be marked executable
setStatus(ps_running);
// call plugin_unpause if provided
if (m_UnpauseFwd != -1)
{
@ -430,6 +477,49 @@ void CPluginMngr::CPlugin::unpausePlugin()
}
}
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;
@ -449,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;
@ -472,7 +561,7 @@ char *CPluginMngr::ReadIntoOrFromCache(const char *file, size_t &bufsize)
return NULL;
}
pl->path.assign(file);
pl->path = file;
bufsize = pl->bufsize;
@ -541,7 +630,7 @@ void CPluginMngr::CacheAndLoadModules(const char *plugin)
{
return;
}
if ((hdr.defsize != sizeof(AMX_FUNCSTUB)) &&
if ((hdr.defsize != sizeof(AMX_FUNCSTUB)) &&
(hdr.defsize != sizeof(AMX_FUNCSTUBNT)))
{
return;
@ -554,7 +643,7 @@ void CPluginMngr::CacheAndLoadModules(const char *plugin)
{
return;
}
if (hdr.stp <= 0)
{
return;
@ -583,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,21 +688,21 @@ void CPluginMngr::CacheAndLoadModules(const char *plugin)
{
RunLibCommand(dc);
} else if ( (dc->cmd == LibCmd_ExpectClass) ||
(dc->cmd == LibCmd_ExpectLib) )
(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]);
}
@ -632,10 +721,10 @@ 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)
if (!fp)
{
return;
}
@ -643,9 +732,9 @@ void CPluginMngr::CALMFromFile(const char *file)
// Find now folder
char pluginName[256];
char line[256];
String rline;
char rline[256];
while (!feof(fp))
while (!feof(fp))
{
fgets(line, sizeof(line)-1, fp);
if (line[0] == ';' || line[0] == '\n' || line[0] == '\0')
@ -665,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;
}
@ -693,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
@ -73,41 +51,18 @@ private:
inline bool inExecute() const { return m_bInExecute; }
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"
@ -45,19 +23,20 @@
#ifdef _MSC_VER
// MSVC8 - replace POSIX functions with ISO C++ conformant ones as they are deprecated
#if _MSC_VER >= 1400
#define unlink _unlink
#define unlink _unlink
#define mkdir _mkdir
#define strdup _strdup
#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.76c"
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;
@ -80,73 +61,81 @@ void CLog::CloseFile()
fprintf(fp, "L %s: %s\n", date, "Log file closed.");
fclose(fp);
}
m_LogFile.clear();
m_LogFile = nullptr;
}
}
void CLog::CreateNewFile()
{
CloseFile();
// build filename
time_t td;
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)
break;
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,8 +152,8 @@ 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)
{
// get time
@ -186,24 +175,24 @@ 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+");
}
if (pF)
{
fprintf(pF, "L %s: %s\n", date, msg);
@ -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,13 +535,18 @@ 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;
const char *file, *function;
@ -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;
CVector<Tracer *> m_pCalls;
ke::AString m_FileName;
ke::AString m_Version;
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];
@ -106,8 +87,47 @@ 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;
}
}
@ -190,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;
}
}
@ -211,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;
}
}
@ -270,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);
}
}
@ -284,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;
@ -315,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,97 +37,134 @@
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;
}
if (!pLangName || !isalpha(pLangName[0]))
pLangName = "en";
//next parameter!
def = g_langMngr.GetDef(pLangName, key, status);
if (!amx_mldebug)
amx_mldebug = CVAR_GET_POINTER("amx_mldebug");
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 = amxmodx_language->string;
}
auto def = g_langMngr.GetDef(pLangName, key, status);
if (!amx_mldebug)
{
amx_mldebug = CVAR_GET_POINTER("amx_mldebug");
}
auto debug = (amx_mldebug && amx_mldebug->string && (amx_mldebug->string[0] != '\0'));
bool 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);
validlang = false;
}
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 (debug)
{
if (status == ERR_BADLANG && (BadLang_Table.AltFindOrInsert(pLangName).last + 120.0f < gpGlobals->time))
AMXXLOG_Error("[AMXX] Language key \"%s\" not found for language \"%s\", check \"%s\"", key, testlang, GetFileName(amx));
}
}
if (!def)
{
if (debug && status == ERR_BADLANG)
{
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 (!def && (strcmp(pLangName, "en") != 0 && strcmp(g_vault.get("server_language"), "en") != 0))
if (strcmp(pLangName, amxmodx_language->string) != 0)
{
def = g_langMngr.GetDef(amxmodx_language->string, key, status);
}
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