201 Commits

Author SHA1 Message Date
8db3853fb7 Revert "Update meta_api.cpp (#883)"
This reverts commit 7cb045c688.
2021-03-12 18:35:55 +01:00
70d1aff519 Revert "Resolve old bot's connection state issues (#917)" (#949)
This reverts commit bee4b47b07.
2021-03-12 18:31:01 +01:00
bee4b47b07 Resolve old bot's connection state issues (#917)
* final bot's fixes

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

* suggestions

* suggestions

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

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

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

* Use a local variable

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

* Adminslot: Use semicolon everywhere

* Adminslot: Use brackets everywhere

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

* Adminslot: Rename g_sv_visiblemaxplayers

* Adminslot: Move free slot calculation in its own function

* Adminslot: Use create_cvar and define appropriate bounds

* Adminslot: Use get_playersnum_ex with flag for clarity

* Adminslot: Move all the logic inside setVisibleSlots

Looks like the commit should have been split for clarity.

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

Ultimately, the logic is the following:

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

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

* Adminslot: Rename variables and adjust constantness

* Adminslot: Add a description to the cvars

* Adjust CVAR_HIDESLOTS english sentence

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

* Update newmenus.inc

* typo

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

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

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

* Add enum of args for register_plugin native

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

* Displaying the URL of the plugin if it is present

* Getting an ID only with more than three arguments

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

* Fix typo

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

This reverts commit 835e0bc6c413f11b1bbf964daea87b57f653f5d7.

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

This reverts commit b2c1e7c77576c02a00c8c3f103457000d3298ceb.

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

This reverts commit 9e31230368449966d16635c696d97c04adadeaa9.

* Binary compatibility for previously compiled plugins

* Displaying the URL of the plugin if it is present

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

* Fix getting url

* The 'atoi' function replaced to 'stoi'

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

* Small fixes with auto and inconsistent var name

* Replace stoi to strtol function

* Removed explicit buffer id

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

This reverts commit 94cee479ed245b98195501466850d01a3f08fd13.

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

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

'

* [admincmd.sma] Update amx_cvar command handler

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

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

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

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

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

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

* Fix typo

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

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

Fixed translation [tr]

* Update adminchat.txt

* Update admincmd.txt

* Update adminhelp.txt

* Update adminslots.txt

* Update adminvote.txt

* Update antiflood.txt

* Update cmdmenu.txt

* Update common.txt

* Update imessage.txt

* Update mapchooser.txt

* Update menufront.txt

* Update mapsmenu.txt

* Update miscstats.txt

* Update multilingual.txt

* Update nextmap.txt

* Update pausecfg.txt

* Update plmenu.txt

* Update restmenu.txt

* Update scrollmsg.txt

* Update stats_dod.txt

* Update statscfg.txt

* Update telemenu.txt

* Update time.txt

* Update timeleft.txt

* Update statsx.txt

* Update adminhelp.txt

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

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

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

* Add GCC version check

* -Werror=class-memaccess fix in code

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

* Fix newlines for SayText

* Adjust comments

* Replace hardcoded detination value with HUD_* constants

* Make sure only official mods can use format string

* Fix typos

* Split condition for readability

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

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

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

* Update TFC gamedata

* Update DoD gamedata

* Update Valve gamedata

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

* Add new defines regarding version of AMX Mod X

Added new defines: AMXX_VERSION_MAJOR_NUM and AMXX_VERSION_MINOR_NUM

* Rename AMXX_VERSION_LOCAL define

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

* Added European Portuguese translation: adminchat.txt

* Added European Portuguese translation: admincmd.txt

* Added European Portuguese translation: adminhelp.txt

* Added European Portuguese translation: adminslots.txt

* Added European Portuguese translation: adminvote.txt

* Added European Portuguese translation: antiflood.txt

* Added European Portuguese translation: cmdmenu.txt

* Added European Portuguese translation: common.txt

* Added European Portuguese translation: imessage.txt

* Added European Portuguese translation: languages.txt

* Added European Portuguese translation: mapchooser.txt

* Added European Portuguese translation: mapsmenu.txt

* Added European Portuguese translation: menufront.txt

* Added European Portuguese translation: miscstats.txt

* Added European Portuguese translation: multilingual.txt

* Added European Portuguese translation: nextmap.txt

* Added European Portuguese translation: pausecfg.txt

* Added European Portuguese translation: plmenu.txt

* Added European Portuguese translation: restmenu.txt

* Added European Portuguese translation: scrollmsg.txt

* Added European Portuguese translation: stats_dod.txt

* Added European Portuguese translation: statscfg.txt

* Added European Portuguese translation: statsx.txt

* Added European Portuguese translation: telemenu.txt

* Added European Portuguese translation: time.txt

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

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

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

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

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

Lack register_event() on enable_event and disable_event descriptions

* It shoud be m_iJoiningState not m_iJointState

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

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

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

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

* Fix the upstream bugfix

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

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

* Add version check

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

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

#618

* Update statsx.txt

#618

* Update and rename mapchooser.txt to admincmd

* Rename admincmd to mapchooser.txt

* Update admincmd.txt

* Update common.txt

* Update multilingual.txt

* Update multilingual.txt

* Update scrollmsg.txt

* Update statscfg.txt

* Update adminchat.txt

* Update adminhelp.txt

* Update adminvote.txt

* Update cmdmenu.txt

* Update common.txt

* Update mapchooser.txt

* Update mapsmenu.txt

* Update menufront.txt

* Update miscstats.txt

* Update multilingual.txt

* Update nextmap.txt

* Update pausecfg.txt

* Update plmenu.txt

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

* Update restmenu.txt

* Update scrollmsg.txt

* Update stats_dod.txt

* Update statscfg.txt

* Update statsx.txt

* Update telemenu.txt

* Update timeleft.txt

* Update admincmd.txt

* Update plmenu.txt

* Update adminchat.txt

* Update admincmd.txt

* Update mapsmenu.txt

* Update miscstats.txt

added changes due to PR #611 !

* Update miscstats.txt

* Update pausecfg.txt

* Update admincmd.txt

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

* Move hamdata.ini data to gamedata files

* Reference the new files in master file

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

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

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

* Implement menu_create() "ml" param

* Include newmenu.inc to VS project files

* Adjust documentation

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

* Change max authid length to 64

* Fix port typo

* Add more defines

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

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

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

* Adjust logic

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

Added values to hlsdk_const using regamedll_cs and reapi as reference.

* Update cstrike_const.inc

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

* Switch %L to %l

* Improve loop

* %L to %l again

* Change git add . to != 0
2018-09-11 20:19:28 +02:00
b1b053c205 Bump version 2018-09-11 00:48:15 +02:00
c9e9ef905e Promote git revision number to 4th version string component 2018-09-11 00:46:07 +02:00
340 changed files with 21184 additions and 11753 deletions

View File

@ -71,7 +71,7 @@ class AMXXConfig(object):
if len(hlsdk_path):
self.hlsdk_path = os.path.join(builder.originalCwd, hlsdk_path)
if not os.path.exists(self.hlsdk_path):
raise Exception('Metamod path does not exist: {0}'.format(hlsdk_path))
raise Exception('HLSDK path does not exist: {0}'.format(hlsdk_path))
else:
try_paths = [
os.path.join(builder.sourcePath, '..', 'hlsdk'),
@ -94,7 +94,7 @@ class AMXXConfig(object):
if len(mysql_path):
self.mysql_path = os.path.join(builder.originalCwd, mysql_path)
if not os.path.exists(self.mysql_path):
raise Exception('Metamod path does not exist: {0}'.format(mysql_path))
raise Exception('MySQL path does not exist: {0}'.format(mysql_path))
else:
try_paths = [
os.path.join(builder.sourcePath, '..', 'mysql-5.5'),

View File

@ -143,6 +143,10 @@ private:
fclose(fp);
};
}
else
{
fclose(fp);
}
};
/**
* Returns 1 if the timestamp for the file is different than the one we have loaded

View File

@ -323,7 +323,7 @@ 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

View File

@ -325,16 +325,16 @@ SMCResult CGameConfig::ReadSMC_KeyValue(const SMCStates *states, const char *key
}
else if (!strcmp(key, "size"))
{
TempType.fieldSize = ke::Max<int>(0, atoi(value));
TempType.fieldSize = ke::Max<int>(0, strtol(value, nullptr, 0));
}
else if (!strcmp(key, "unsigned"))
{
TempType.fieldUnsigned = !!atoi(value);
TempType.fieldUnsigned = !!strtol(value, nullptr, 0);
}
else if (g_LibSys.IsPlatformCompatible(key, &m_MatchedPlatform))
{
m_FoundOffset = true;
TempType.fieldOffset = atoi(value);
TempType.fieldOffset = strtol(value, nullptr, 0);
}
break;
}
@ -397,7 +397,7 @@ SMCResult CGameConfig::ReadSMC_KeyValue(const SMCStates *states, const char *key
if (m_AddressReadCount < limit)
{
m_AddressRead[m_AddressReadCount] = atoi(value);
m_AddressRead[m_AddressReadCount] = strtol(value, nullptr, 0);
m_AddressReadCount++;
}
else

View File

@ -180,6 +180,18 @@ class CGameConfigManager : public IGameConfigManager
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;

View File

@ -15,6 +15,7 @@
#include "debugger.h"
#include "libraries.h"
#include <amxmodx_version.h>
#include "engine_strucs.h"
extern const char *no_function;
@ -154,6 +155,37 @@ int CPluginMngr::loadPluginsFromFile(const char* filename, bool warn)
*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);
@ -275,6 +307,7 @@ CPluginMngr::CPlugin::CPlugin(int i, const char* p, const char* n, char* e, size
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);

View File

@ -56,6 +56,8 @@ public:
ke::AString version;
ke::AString title;
ke::AString author;
ke::AString url;
ke::AString description;
ke::AString errorMsg;
unsigned int failcounter;
@ -78,6 +80,8 @@ public:
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; }
@ -86,6 +90,8 @@ public:
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)); }

View File

@ -23,15 +23,30 @@
extern CFlagManager FlagMan;
ke::Vector<CAdminData *> DynamicAdmins;
const char *g_sInaccessibleXVars[] =
{
"MaxClients",
"MapName",
"PluginName",
"PluginVersion",
"PluginAuthor",
"PluginURL",
"NULL_STRING",
"NULL_VECTOR"
};
static cell AMX_NATIVE_CALL get_xvar_id(AMX *amx, cell *params)
{
int len;
char* sName = get_amxstring(amx, params[1], 0, len);
cell ptr;
if (!strcmp(sName, "MaxClients") || !strcmp(sName, "NULL_STRING") || !strcmp(sName, "NULL_VECTOR"))
for (auto name : g_sInaccessibleXVars)
{
return -1;
if (!strcmp(sName, name))
{
return -1;
}
}
for (CPluginMngr::iterator a = g_plugins.begin(); a ; ++a)
@ -197,7 +212,7 @@ static cell AMX_NATIVE_CALL console_print(AMX *amx, cell *params) /* 2 param */
if (index < 1 || index > gpGlobals->maxClients) // Server console
{
if (len > 254)
if (len > 254) // Server console truncates after byte 255. (254 + \n = 255)
{
len = 254;
if ((message[len - 1] & 1 << 7))
@ -216,18 +231,26 @@ static cell AMX_NATIVE_CALL console_print(AMX *amx, cell *params) /* 2 param */
if (pPlayer->ingame && !pPlayer->IsBot())
{
if (len > 126) // Client console truncates after byte 127. (126 + \n = 127)
if (len > 125) // Client console truncates after byte 127. (125 + \n\n = 127)
{
len = 126;
len = 125;
if ((message[len - 1] & 1 << 7))
{
len -= UTIL_CheckValidChar(message + len - 1); // Don't truncate a multi-byte character
}
}
message[len++] = '\n'; // Client expects newline from the server
message[len++] = '\n';
const auto canUseFormatString = g_official_mod && !g_bmod_dod; // Temporary exclusion for DoD until officially supported
if (canUseFormatString)
{
message[len++] = '\n'; // Double newline is required when pre-formatted string in TextMsg is passed as argument.
}
message[len] = 0;
UTIL_ClientPrint(pPlayer->pEdict, 2, message);
UTIL_ClientPrint(pPlayer->pEdict, HUD_PRINTCONSOLE, message);
}
}
@ -241,6 +264,8 @@ static cell AMX_NATIVE_CALL client_print(AMX *amx, cell *params) /* 3 param */
int len = 0;
char *msg;
const auto canUseFormatString = g_official_mod && !g_bmod_dod; // Temporary exclusion for DoD until officially supported
if (params[1] == 0) // 0 = All players
{
for (int i = 1; i <= gpGlobals->maxClients; ++i)
@ -252,16 +277,38 @@ static cell AMX_NATIVE_CALL client_print(AMX *amx, cell *params) /* 3 param */
g_langMngr.SetDefLang(i);
msg = format_amxstring(amx, params, 3, len);
// params[2]: print_notify = 1, print_console = 2, print_chat = 3, print_center = 4
if (((params[2] == 1) || (params[2] == 2)) && (len > 126)) // Client console truncates after byte 127. (126 + \n = 127)
// Client console truncates after byte 127.
// If format string is used, limit includes double new lines (125 + \n\n), otherwise one new line (126 + \n).
const auto bytesLimit = canUseFormatString ? 125 : 126;
if (g_bmod_cstrike && params[2] == HUD_PRINTCENTER) // Likely a temporary fix.
{
len = 126;
for (int j = 0; j < len; ++j)
{
if (msg[j] == '\n')
{
msg[j] = '\r';
}
}
}
else if (((params[2] == HUD_PRINTNOTIFY) || (params[2] == HUD_PRINTCONSOLE)) && (len > bytesLimit))
{
len = bytesLimit;
if ((msg[len - 1] & 1 << 7))
{
len -= UTIL_CheckValidChar(msg + len - 1); // Don't truncate a multi-byte character
}
}
msg[len++] = '\n'; // Client expects newline from the server
msg[len++] = '\n';
if (canUseFormatString)
{
if (!g_bmod_cstrike || params[2] == HUD_PRINTNOTIFY || params[2] == HUD_PRINTCONSOLE)
{
msg[len++] = '\n'; // Double newline is required when pre-formatted string in TextMsg is passed as argument.
}
}
msg[len] = 0;
UTIL_ClientPrint(pPlayer->pEdict, params[2], msg);
@ -286,16 +333,38 @@ static cell AMX_NATIVE_CALL client_print(AMX *amx, cell *params) /* 3 param */
msg = format_amxstring(amx, params, 3, len);
// params[2]: print_notify = 1, print_console = 2, print_chat = 3, print_center = 4
if (((params[2] == 1) || (params[2] == 2)) && (len > 126)) // Client console truncates after byte 127. (126 + \n = 127)
// Client console truncates after byte 127.
// If format string is used, limit includes double new lines (125 + \n\n), otherwise one new line (126 + \n).
const auto bytesLimit = canUseFormatString ? 125 : 126;
if (g_bmod_cstrike && params[2] == HUD_PRINTCENTER) // Likely a temporary fix.
{
len = 126;
for (int j = 0; j < len; ++j)
{
if (msg[j] == '\n')
{
msg[j] = '\r';
}
}
}
else if (((params[2] == HUD_PRINTNOTIFY) || (params[2] == HUD_PRINTCONSOLE)) && (len > bytesLimit)) // Client console truncates after byte 127. (125 + \n\n = 127)
{
len = bytesLimit;
if ((msg[len - 1] & 1 << 7))
{
len -= UTIL_CheckValidChar(msg + len - 1); // Don't truncate a multi-byte character
}
}
msg[len++] = '\n'; // Client expects newline from the server
msg[len++] = '\n';
if (canUseFormatString)
{
if (!g_bmod_cstrike || params[2] == HUD_PRINTNOTIFY || params[2] == HUD_PRINTCONSOLE)
{
msg[len++] = '\n'; // Double newline is required when pre-formatted string in TextMsg is passed as argument.
}
}
msg[len] = 0;
UTIL_ClientPrint(pPlayer->pEdict, params[2], msg);
@ -344,16 +413,15 @@ static cell AMX_NATIVE_CALL client_print_color(AMX *amx, cell *params) /* 3 para
*msg = 1;
}
if (len > 190) // Server crashes after byte 190. (190 + \n = 191)
if (len > 187) // Max available bytes: 188
{
len = 190;
len = 187;
if ((msg[len - 1] & 1 << 7))
{
len -= UTIL_CheckValidChar(msg + len - 1); // Don't truncate a multi-byte character
}
}
msg[len++] = '\n';
msg[len] = 0;
UTIL_ClientSayText(pPlayer->pEdict, sender ? sender : i, msg);
@ -382,16 +450,15 @@ static cell AMX_NATIVE_CALL client_print_color(AMX *amx, cell *params) /* 3 para
*msg = 1;
}
if (len > 190) // Server crashes after byte 190. (190 + \n = 191)
if (len > 187) // Max available bytes: 188
{
len = 190;
len = 187;
if ((msg[len - 1] & 1 << 7))
{
len -= UTIL_CheckValidChar(msg + len - 1); // Don't truncate a multi-byte character
}
}
msg[len++] = '\n';
msg[len] = 0;
UTIL_ClientSayText(pPlayer->pEdict, sender ? sender : index, msg);
@ -1272,7 +1339,6 @@ static cell AMX_NATIVE_CALL show_menu(AMX *amx, cell *params) /* 3 param */
// Fire newmenu callback so closing it can be handled by the plugin
if (!CloseNewMenus(pPlayer))
{
LogError(amx, AMX_ERR_NATIVE, "Plugin called menu_display when item=MENU_EXIT");
return 2;
}
@ -1318,7 +1384,7 @@ static cell AMX_NATIVE_CALL show_menu(AMX *amx, cell *params) /* 3 param */
return 0;
}
if (closeMenu(index))
if (closeMenu(index) == 2)
{
return 0;
}
@ -1382,29 +1448,34 @@ static cell AMX_NATIVE_CALL show_menu(AMX *amx, cell *params) /* 3 param */
return 1;
}
static cell AMX_NATIVE_CALL register_plugin(AMX *amx, cell *params) /* 3 param */
static cell AMX_NATIVE_CALL register_plugin(AMX *amx, cell *params) /* 5 param */
{
enum { arg_count, arg_title, arg_version, arg_author, arg_url, arg_description };
CPluginMngr::CPlugin* a = g_plugins.findPluginFast(amx);
int i;
char *title = get_amxstring(amx, params[1], 0, i);
char *vers = get_amxstring(amx, params[2], 1, i);
char *author = get_amxstring(amx, params[3], 2, i);
a->setTitle(get_amxstring(amx, params[arg_title], 0, i));
a->setVersion(get_amxstring(amx, params[arg_version], 0, i));
a->setAuthor(get_amxstring(amx, params[arg_author], 0, i));
#if defined BINLOG_ENABLED
g_BinLog.WriteOp(BinLog_Registered, a->getId(), title, vers);
g_BinLog.WriteOp(BinLog_Registered, a->getId(), a->getTitle(), a->getVersion());
#endif
a->setTitle(title);
a->setVersion(vers);
a->setAuthor(author);
if (params[arg_count] / sizeof(cell) > arg_author)
{
a->setUrl(get_amxstring(amx, params[arg_url], 0, i));
a->setDescription(get_amxstring(amx, params[arg_description], 0, i));
}
/* Check if we need to add fail counters */
i = 0;
unsigned int counter = 0;
while (NONGPL_PLUGIN_LIST[i].author != NULL)
{
if (strcmp(NONGPL_PLUGIN_LIST[i].author, author) == 0)
if (strcmp(NONGPL_PLUGIN_LIST[i].author, a->getAuthor()) == 0)
{
counter++;
}
@ -1412,7 +1483,7 @@ static cell AMX_NATIVE_CALL register_plugin(AMX *amx, cell *params) /* 3 param *
{
counter++;
}
if (stricmp(NONGPL_PLUGIN_LIST[i].title, title) == 0)
if (stricmp(NONGPL_PLUGIN_LIST[i].title, a->getTitle()) == 0)
{
counter++;
}
@ -1446,31 +1517,34 @@ static cell AMX_NATIVE_CALL register_menucmd(AMX *amx, cell *params) /* 3 param
return 1;
}
static cell AMX_NATIVE_CALL get_plugin(AMX *amx, cell *params) /* 11 param */
static cell AMX_NATIVE_CALL get_plugin(AMX *amx, cell *params) /* 15 param */
{
enum
{
arg_count, arg_plugin, arg_name, arg_namelen, arg_title, arg_titlelen,
arg_version, arg_versionlen, arg_author, arg_authorlen, arg_status, arg_statuslen,
arg_url, arg_urllen, arg_description, arg_descriptionlen
};
CPluginMngr::CPlugin* a;
if (params[1] < 0)
if (params[arg_plugin] < 0)
a = g_plugins.findPluginFast(amx);
else
a = g_plugins.findPlugin((int)params[1]);
a = g_plugins.findPlugin((int)params[arg_plugin]);
if (a)
{
set_amxstring(amx, params[2], a->getName(), params[3]);
set_amxstring(amx, params[4], a->getTitle(), params[5]);
set_amxstring(amx, params[6], a->getVersion(), params[7]);
set_amxstring(amx, params[8], a->getAuthor(), params[9]);
set_amxstring(amx, params[10], a->getStatus(), params[11]);
set_amxstring(amx, params[arg_name], a->getName(), params[arg_namelen]);
set_amxstring(amx, params[arg_title], a->getTitle(), params[arg_titlelen]);
set_amxstring(amx, params[arg_version], a->getVersion(), params[arg_versionlen]);
set_amxstring(amx, params[arg_author], a->getAuthor(), params[arg_authorlen]);
set_amxstring(amx, params[arg_status], a->getStatus(), params[arg_statuslen]);
if (params[0] / sizeof(cell) >= 12)
if (params[arg_count] / sizeof(cell) > arg_url)
{
cell *jit_info = get_amxaddr(amx, params[12]);
#if defined AMD64 || !defined JIT
*jit_info = 0;
#else
*jit_info = a->isDebug() ? 0 : 1;
#endif
set_amxstring(amx, params[arg_url], a->getUrl(), params[arg_urllen]);
set_amxstring(amx, params[arg_description], a->getDescription(), params[arg_descriptionlen]);
}
return a->getId();
@ -2532,7 +2606,7 @@ static cell AMX_NATIVE_CALL read_argv(AMX *amx, cell *params) /* 3 param */
{
int argc = params[1];
const char *value = g_fakecmd.notify ? (argc >= 0 && argc < 3 ? g_fakecmd.argv[argc] : "") : CMD_ARGV(argc);
const char *value = g_fakecmd.notify ? ((argc >= 0 && argc < 3 && g_fakecmd.argv[argc] != nullptr) ? g_fakecmd.argv[argc] : "") : CMD_ARGV(argc);
return set_amxstring_utf8(amx, params[2], value, strlen(value), params[3]);
}
@ -2545,7 +2619,7 @@ static cell AMX_NATIVE_CALL read_argv_int(AMX *amx, cell *params) /* 1 param */
return 0;
}
const char *value = g_fakecmd.notify ? (argc >= 1 && argc < 3 ? g_fakecmd.argv[argc] : "") : CMD_ARGV(argc);
const char *value = g_fakecmd.notify ? ((argc >= 1 && argc < 3 && g_fakecmd.argv[argc] != nullptr) ? g_fakecmd.argv[argc] : "") : CMD_ARGV(argc);
return atoi(value);
}
@ -2559,7 +2633,7 @@ static cell AMX_NATIVE_CALL read_argv_float(AMX *amx, cell *params) /* 1 param *
return 0;
}
const char *value = g_fakecmd.notify ? (argc >= 1 && argc < 3 ? g_fakecmd.argv[argc] : "") : CMD_ARGV(argc);
const char *value = g_fakecmd.notify ? ((argc >= 1 && argc < 3 && g_fakecmd.argv[argc] != nullptr) ? g_fakecmd.argv[argc] : "") : CMD_ARGV(argc);
float flValue = atof(value);
return amx_ftoc(flValue);
@ -2567,7 +2641,7 @@ static cell AMX_NATIVE_CALL read_argv_float(AMX *amx, cell *params) /* 1 param *
static cell AMX_NATIVE_CALL read_args(AMX *amx, cell *params) /* 2 param */
{
const char* sValue = g_fakecmd.notify ? (g_fakecmd.argc > 1 ? g_fakecmd.args : g_fakecmd.argv[0]) : CMD_ARGS();
const char* sValue = g_fakecmd.notify ? (g_fakecmd.argc > 1 ? g_fakecmd.args : "") : CMD_ARGS();
return set_amxstring_utf8(amx, params[1], sValue ? sValue : "", sValue ? strlen(sValue) : 0, params[2]);
}

View File

@ -188,6 +188,11 @@ 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;

View File

@ -88,21 +88,44 @@ void Client_TeamInfo(void* mValue)
if (index < 1 || index > gpGlobals->maxClients) break;
char* msg = (char*)mValue;
if (!msg) break;
g_players[index].team = msg;
g_teamsIds.registerTeam(msg, -1);
g_players[index].teamId = g_teamsIds.findTeamId(msg);
/**
* 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_players[index].teamId == -1 && g_bmod_cstrike && !strcmp(msg, "SPECTATOR"))
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)
{
g_players[index].teamId = 3;
g_teamsIds.registerTeam(msg, 3);
/**
* 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;

View File

@ -88,6 +88,11 @@ XVars g_xvars;
bool g_bmod_tfc;
bool g_bmod_cstrike;
bool g_bmod_dod;
bool g_bmod_dmc;
bool g_bmod_ricochet;
bool g_bmod_valve;
bool g_bmod_gearbox;
bool g_official_mod;
bool g_dontprecache;
bool g_forcedmodules;
bool g_forcedsounds;
@ -769,6 +774,15 @@ void C_ServerDeactivate_Post()
g_vault.clear();
g_xvars.clear();
g_plugins.clear();
g_langMngr.Clear();
ArrayHandles.clear();
TrieHandles.clear();
TrieIterHandles.clear();
TrieSnapshotHandles.clear();
DataPackHandles.clear();
TextParsersHandles.clear();
GameConfigHandle.clear();
g_CvarManager.OnPluginUnloaded();
@ -1140,12 +1154,12 @@ void C_ClientCommand(edict_t *pEntity)
if (item == MENU_BACK)
{
if (pMenu->pageCallback >= 0)
executeForwards(pMenu->pageCallback, static_cast<cell>(pPlayer->index), static_cast<cell>(MENU_BACK));
executeForwards(pMenu->pageCallback, static_cast<cell>(pPlayer->index), static_cast<cell>(MENU_BACK), static_cast<cell>(menu));
pMenu->Display(pPlayer->index, pPlayer->page - 1);
} else if (item == MENU_MORE) {
if (pMenu->pageCallback >= 0)
executeForwards(pMenu->pageCallback, static_cast<cell>(pPlayer->index), static_cast<cell>(MENU_MORE));
executeForwards(pMenu->pageCallback, static_cast<cell>(pPlayer->index), static_cast<cell>(MENU_MORE), static_cast<cell>(menu));
pMenu->Display(pPlayer->index, pPlayer->page + 1);
} else {
@ -1725,6 +1739,14 @@ C_DLLEXPORT int Meta_Detach(PLUG_LOADTIME now, PL_UNLOAD_REASON reason)
g_plugins.clear();
g_langMngr.Clear();
ArrayHandles.clear();
TrieHandles.clear();
TrieIterHandles.clear();
TrieSnapshotHandles.clear();
DataPackHandles.clear();
TextParsersHandles.clear();
GameConfigHandle.clear();
ClearMessages();
modules_callPluginsUnloaded();
@ -1800,6 +1822,7 @@ C_DLLEXPORT int GetEntityAPI2_Post(DLL_FUNCTIONS *pFunctionTable, int *interface
}
enginefuncs_t meta_engfuncs;
C_DLLEXPORT int GetEngineFunctions(enginefuncs_t *pengfuncsFromEngine, int *interfaceVersion)
{
memset(&meta_engfuncs, 0, sizeof(enginefuncs_t));
@ -1809,11 +1832,17 @@ C_DLLEXPORT int GetEngineFunctions(enginefuncs_t *pengfuncsFromEngine, int *inte
meta_engfuncs.pfnSetModel = C_SetModel;
g_bmod_cstrike = true;
} else {
g_bmod_cstrike = false;
g_bmod_dod = !stricmp(g_mod_name.chars(), "dod");
g_bmod_tfc = !stricmp(g_mod_name.chars(), "tfc");
g_bmod_cstrike = false;
g_bmod_dod = !stricmp(g_mod_name.chars(), "dod");
g_bmod_dmc = !stricmp(g_mod_name.chars(), "dmc");
g_bmod_tfc = !stricmp(g_mod_name.chars(), "tfc");
g_bmod_ricochet = !stricmp(g_mod_name.chars(), "ricochet");
g_bmod_valve = !stricmp(g_mod_name.chars(), "valve");
g_bmod_gearbox = !stricmp(g_mod_name.chars(), "gearbox");
}
g_official_mod = g_bmod_cstrike || g_bmod_dod || g_bmod_dmc || g_bmod_ricochet || g_bmod_tfc || g_bmod_valve || g_bmod_gearbox;
meta_engfuncs.pfnCmd_Argc = C_Cmd_Argc;
meta_engfuncs.pfnCmd_Argv = C_Cmd_Argv;
meta_engfuncs.pfnCmd_Args = C_Cmd_Args;

View File

@ -457,6 +457,7 @@ md -p JIT 2&gt;NUL
<None Include="..\..\plugins\include\cvars.inc" />
<None Include="..\..\plugins\include\datapack.inc" />
<None Include="..\..\plugins\include\gameconfig.inc" />
<None Include="..\..\plugins\include\newmenus.inc" />
<None Include="..\..\plugins\include\string_const.inc" />
<None Include="..\..\plugins\include\string_stocks.inc" />
<None Include="..\..\plugins\include\textparse_ini.inc" />

View File

@ -54,7 +54,7 @@
</Filter>
<Filter Include="ReSDK\engine">
<UniqueIdentifier>{04fab577-6f56-40d0-8f69-7ce1b8bf3bb9}</UniqueIdentifier>
</Filter>
</Filter>
<Filter Include="Third Party\UTF8Rewind">
<UniqueIdentifier>{270f3524-564f-4154-bb35-242a6faac09e}</UniqueIdentifier>
</Filter>
@ -693,10 +693,13 @@
<None Include="..\..\plugins\include\string_stocks.inc">
<Filter>Pawn Includes</Filter>
</None>
<None Include="..\..\plugins\include\newmenus.inc">
<Filter>Pawn Includes</Filter>
</None>
</ItemGroup>
<ItemGroup>
<Object Include="..\Jit\helpers-x86.obj">
<Filter>Assembly\Builds</Filter>
</Object>
</ItemGroup>
</Project>
</Project>

View File

@ -10,6 +10,7 @@
#include "amxmodx.h"
#include "CMenu.h"
#include "newmenus.h"
#include "format.h"
ke::Vector<Menu *> g_NewMenus;
CStack<int> g_MenuFreeStack;
@ -90,9 +91,9 @@ bool CloseNewMenus(CPlayer *pPlayer)
return true;
}
Menu::Menu(const char *title, AMX *amx, int fid) : m_Title(title), m_ItemColor("\\r"),
m_NeverExit(false), m_AutoColors(g_coloredmenus), thisId(0), func(fid),
isDestroying(false), pageCallback(-1), showPageNumber(true), items_per_page(7)
Menu::Menu(const char *title, AMX *amx, int fid, bool use_ml) : m_Title(title), m_ItemColor("\\r"),
m_NeverExit(false), m_ForceExit(false), m_AutoColors(g_coloredmenus), thisId(0), func(fid),
isDestroying(false), pageCallback(-1), showPageNumber(true), useMultilingual(use_ml), amx(amx), items_per_page(7)
{
CPluginMngr::CPlugin *pPlugin = g_plugins.findPluginFast(amx);
menuId = g_menucmds.registerMenuId(title, amx);
@ -356,18 +357,32 @@ const char *Menu::GetTextString(int player, page_t page, int &keys)
m_Text = nullptr;
auto title = m_Title.chars();
if (this->useMultilingual)
{
const auto language = playerlang(player);
const auto definition = translate(this->amx, language, title);
if (definition)
{
title = definition;
}
}
char buffer[255];
if (showPageNumber && items_per_page && (pages != 1))
{
if (m_AutoColors)
ke::SafeSprintf(buffer, sizeof(buffer), "\\y%s %d/%d\n\\w\n", m_Title.chars(), page + 1, pages);
ke::SafeSprintf(buffer, sizeof(buffer), "\\y%s %d/%d\n\\w\n", title, page + 1, pages);
else
ke::SafeSprintf(buffer, sizeof(buffer), "%s %d/%d\n\n", m_Title.chars(), page + 1, pages);
ke::SafeSprintf(buffer, sizeof(buffer), "%s %d/%d\n\n", title, page + 1, pages);
} else {
if (m_AutoColors)
ke::SafeSprintf(buffer, sizeof(buffer), "\\y%s\n\\w\n", m_Title.chars());
ke::SafeSprintf(buffer, sizeof(buffer), "\\y%s\n\\w\n", title);
else
ke::SafeSprintf(buffer, sizeof(buffer), "%s\n\n", m_Title.chars());
ke::SafeSprintf(buffer, sizeof(buffer), "%s\n\n", title);
}
m_Text = m_Text + buffer;
@ -403,27 +418,27 @@ const char *Menu::GetTextString(int player, page_t page, int &keys)
{
flags &= ~Display_Back;
}
menuitem *pItem = NULL;
int option = 0;
keys = 0;
bool enabled = true;
int ret = 0;
int slots = 0;
int option_display = 0;
for (item_t i = start; i < end; i++)
{
// reset enabled
enabled = true;
pItem = m_Items[i];
if (pItem->access && !(pItem->access & g_players[player].flags[0]))
{
enabled = false;
}
if (pItem->handler != -1)
{
ret = executeForwards(pItem->handler, static_cast<cell>(player), static_cast<cell>(thisId), static_cast<cell>(i));
@ -455,31 +470,44 @@ const char *Menu::GetTextString(int player, page_t page, int &keys)
{
keys |= (1<<option);
}
option_display = ++option;
if (option_display == 10)
{
option_display = 0;
}
auto itemName = pItem->name.chars();
if (this->useMultilingual)
{
const auto language = playerlang(player);
const auto definition = translate(this->amx, language, itemName);
if (definition)
{
itemName = definition;
}
}
if (pItem->isBlank)
{
ke::SafeSprintf(buffer, sizeof(buffer), "%s\n", pItem->name.chars());
ke::SafeSprintf(buffer, sizeof(buffer), "%s\n", itemName);
}
else if (enabled)
{
if (m_AutoColors)
if (m_AutoColors)
{
ke::SafeSprintf(buffer, sizeof(buffer), "%s%d.\\w %s\n", m_ItemColor.chars(),option_display, pItem->name.chars());
ke::SafeSprintf(buffer, sizeof(buffer), "%s%d.\\w %s\n", m_ItemColor.chars(),option_display, itemName);
} else {
ke::SafeSprintf(buffer, sizeof(buffer), "%d. %s\n", option_display, pItem->name.chars());
ke::SafeSprintf(buffer, sizeof(buffer), "%d. %s\n", option_display, itemName);
}
} else {
if (m_AutoColors)
{
ke::SafeSprintf(buffer, sizeof(buffer), "\\d%d. %s\n\\w", option_display, pItem->name.chars());
ke::SafeSprintf(buffer, sizeof(buffer), "\\d%d. %s\n\\w", option_display, itemName);
} else {
ke::SafeSprintf(buffer, sizeof(buffer), "#. %s\n", pItem->name.chars());
ke::SafeSprintf(buffer, sizeof(buffer), "#. %s\n", itemName);
}
}
slots++;
@ -516,6 +544,20 @@ const char *Menu::GetTextString(int player, page_t page, int &keys)
/* Don't bother if there is only one page */
if (pages > 1)
{
auto tempItemName = m_OptNames[abs(MENU_BACK)].chars();
if (this->useMultilingual)
{
const auto language = playerlang(player);
const auto definition = translate(this->amx, language, tempItemName);
if (definition)
{
tempItemName = definition;
}
}
if (flags & Display_Back)
{
keys |= (1<<option++);
@ -526,13 +568,13 @@ const char *Menu::GetTextString(int player, page_t page, int &keys)
"%s%d. \\w%s\n",
m_ItemColor.chars(),
option == 10 ? 0 : option,
m_OptNames[abs(MENU_BACK)].chars());
tempItemName);
} else {
ke::SafeSprintf(buffer,
sizeof(buffer),
"%d. %s\n",
option == 10 ? 0 : option,
m_OptNames[abs(MENU_BACK)].chars());
tempItemName);
}
} else {
option++;
@ -542,13 +584,26 @@ const char *Menu::GetTextString(int player, page_t page, int &keys)
sizeof(buffer),
"\\d%d. %s\n\\w",
option == 10 ? 0 : option,
m_OptNames[abs(MENU_BACK)].chars());
tempItemName);
} else {
ke::SafeSprintf(buffer, sizeof(buffer), "#. %s\n", m_OptNames[abs(MENU_BACK)].chars());
ke::SafeSprintf(buffer, sizeof(buffer), "#. %s\n", tempItemName);
}
}
m_Text = m_Text + buffer;
tempItemName = m_OptNames[abs(MENU_MORE)].chars();
if (this->useMultilingual)
{
const auto language = playerlang(player);
const auto definition = translate(this->amx, language, tempItemName);
if (definition)
{
tempItemName = definition;
}
}
if (flags & Display_Next)
{
keys |= (1<<option++);
@ -559,13 +614,13 @@ const char *Menu::GetTextString(int player, page_t page, int &keys)
"%s%d. \\w%s\n",
m_ItemColor.chars(),
option == 10 ? 0 : option,
m_OptNames[abs(MENU_MORE)].chars());
tempItemName);
} else {
ke::SafeSprintf(buffer,
sizeof(buffer),
"%d. %s\n",
option == 10 ? 0 : option,
m_OptNames[abs(MENU_MORE)].chars());
tempItemName);
}
} else {
option++;
@ -575,9 +630,9 @@ const char *Menu::GetTextString(int player, page_t page, int &keys)
sizeof(buffer),
"\\d%d. %s\n\\w",
option == 10 ? 0 : option,
m_OptNames[abs(MENU_MORE)].chars());
tempItemName);
} else {
ke::SafeSprintf(buffer, sizeof(buffer), "#. %s\n", m_OptNames[abs(MENU_MORE)].chars());
ke::SafeSprintf(buffer, sizeof(buffer), "#. %s\n", tempItemName);
}
}
m_Text = m_Text + buffer;
@ -586,13 +641,26 @@ const char *Menu::GetTextString(int player, page_t page, int &keys)
option += 2;
}
}
if ((items_per_page && !m_NeverExit) || (m_ForceExit && numItems < 10))
{
auto exitName = m_OptNames[abs(MENU_EXIT)].chars();
if (this->useMultilingual)
{
const auto language = playerlang(player);
const auto definition = translate(this->amx, language, exitName);
if (definition)
{
exitName = definition;
}
}
/* Visual pad has not been added yet */
if (!items_per_page)
m_Text = m_Text + "\n";
keys |= (1<<option++);
if (m_AutoColors)
{
@ -601,17 +669,17 @@ const char *Menu::GetTextString(int player, page_t page, int &keys)
"%s%d. \\w%s\n",
m_ItemColor.chars(),
option == 10 ? 0 : option,
m_OptNames[abs(MENU_EXIT)].chars());
exitName);
} else {
ke::SafeSprintf(buffer,
sizeof(buffer),
"%d. %s\n",
option == 10 ? 0 : option,
m_OptNames[abs(MENU_EXIT)].chars());
exitName);
}
m_Text = m_Text + buffer;
}
return m_Text.ptr();
}
@ -620,38 +688,45 @@ const char *Menu::GetTextString(int player, page_t page, int &keys)
LogError(amx, AMX_ERR_NATIVE, "Invalid menu id %d(%d)", p, g_NewMenus.length()); \
return 0; }
//Makes a new menu handle (-1 for failure)
//native csdm_makemenu(title[]);
// native menu_create(const title[], const handler[], bool:ml = false);
static cell AMX_NATIVE_CALL menu_create(AMX *amx, cell *params)
{
int len;
char *title = get_amxstring(amx, params[1], 0, len);
validate_menu_text(title);
char *handler = get_amxstring(amx, params[2], 1, len);
enum args { arg_count, arg_title, arg_handler, arg_ml };
int func = registerSPForwardByName(amx, handler, FP_CELL, FP_CELL, FP_CELL, FP_DONE);
if (func == -1)
int length;
const auto title = get_amxstring(amx, params[arg_title], 0, length);
const auto handler = get_amxstring(amx, params[arg_handler], 1, length);
const auto callback = registerSPForwardByName(amx, handler, FP_CELL, FP_CELL, FP_CELL, FP_DONE);
if (callback == -1)
{
LogError(amx, AMX_ERR_NOTFOUND, "Invalid function \"%s\"", handler);
LogError(amx, AMX_ERR_NOTFOUND, R"(Invalid function "%s")", handler);
return 0;
}
Menu *pMenu = new Menu(title, amx, func);
validate_menu_text(title);
auto pMenu = new Menu(title, amx, callback, params[arg_ml] != 0);
if (g_MenuFreeStack.empty())
{
g_NewMenus.append(pMenu);
pMenu->thisId = (int)g_NewMenus.length() - 1;
} else {
int pos = g_MenuFreeStack.front();
pMenu->thisId = static_cast<int>(g_NewMenus.length()) - 1;
}
else
{
const auto position = g_MenuFreeStack.front();
g_MenuFreeStack.pop();
g_NewMenus[pos] = pMenu;
pMenu->thisId = pos;
g_NewMenus[position] = pMenu;
pMenu->thisId = position;
}
return pMenu->thisId;
}
static cell AMX_NATIVE_CALL menu_addblank(AMX *amx, cell *params)
{
GETMENU(params[1]);
@ -809,7 +884,20 @@ static cell AMX_NATIVE_CALL menu_display(AMX *amx, cell *params)
int player = params[1];
int page = params[3];
if (player < 1 || player > gpGlobals->maxClients)
{
LogError(amx, AMX_ERR_NATIVE, "Invalid player id %d.", player);
return 0;
}
CPlayer* pPlayer = GET_PLAYER_POINTER_I(player);
if (!pPlayer->ingame)
{
LogError(amx, AMX_ERR_NATIVE, "Player %d is not in game.", player);
return 0;
}
if (!CloseNewMenus(pPlayer))
{
@ -958,6 +1046,20 @@ static cell AMX_NATIVE_CALL menu_item_setcall(AMX *amx, cell *params)
return 1;
}
static cell AMX_NATIVE_CALL menu_item_setaccess(AMX *amx, cell *params)
{
GETMENU(params[1]);
menuitem *pItem = pMenu->GetMenuItem(static_cast<item_t>(params[2]));
if (!pItem)
return 0;
pItem->access = params[3];
return 1;
}
static cell AMX_NATIVE_CALL menu_setprop(AMX *amx, cell *params)
{
GETMENU(params[1]);
@ -981,7 +1083,7 @@ static cell AMX_NATIVE_CALL menu_setprop(AMX *amx, cell *params)
break;
}
int callback = registerSPForwardByName(amx, str, FP_CELL, FP_CELL, FP_DONE);
int callback = registerSPForwardByName(amx, str, FP_CELL, FP_CELL, FP_CELL, FP_DONE);
if (callback < 0)
{
LogError(amx, AMX_ERR_NATIVE, "Function %s not present", str);
@ -995,7 +1097,7 @@ static cell AMX_NATIVE_CALL menu_setprop(AMX *amx, cell *params)
}
case MPROP_SHOWPAGE:
{
pMenu->showPageNumber = (get_amxaddr(amx, params[3]) != 0);
pMenu->showPageNumber = *get_amxaddr(amx, params[3]) != 0;
break;
}
case MPROP_SET_NUMBER_COLOR:
@ -1189,6 +1291,7 @@ AMX_NATIVE_INFO g_NewMenuNatives[] =
{"menu_item_getinfo", menu_item_getinfo},
{"menu_makecallback", menu_makecallback},
{"menu_item_setcall", menu_item_setcall},
{"menu_item_setaccess", menu_item_setaccess},
{"menu_item_setcmd", menu_item_setcmd},
{"menu_item_setname", menu_item_setname},
{"menu_destroy", menu_destroy},

View File

@ -95,7 +95,7 @@ typedef unsigned int page_t;
class Menu
{
public:
Menu(const char *title, AMX *amx, int fid);
Menu(const char *title, AMX *amx, int fid, bool use_ml);
~Menu();
menuitem *GetMenuItem(item_t item);
@ -127,6 +127,8 @@ public:
bool isDestroying;
int pageCallback;
bool showPageNumber;
bool useMultilingual;
AMX *amx;
public:
unsigned int items_per_page;
};

View File

@ -9,6 +9,7 @@
#include "amxmodx.h"
#include <amxmodx_version.h>
#include <string>
void amx_command()
{
@ -25,7 +26,7 @@ void amx_command()
if (!strcmp(cmd, "plugins") || !strcmp(cmd, "list"))
{
print_srvconsole("Currently loaded plugins:\n");
print_srvconsole(" %-23.22s %-11.10s %-17.16s %-16.15s %-9.8s\n", "name", "version", "author", "file", "status");
print_srvconsole(" %-3.2s %-23.22s %-11.10s %-17.16s %-32.31s %-12.11s %-9.8s\n", "id", "name", "version", "author", "url", "file", "status");
int plugins = 0;
int running = 0;
@ -40,7 +41,7 @@ void amx_command()
if ((*a).isValid() && !(*a).isPaused())
++running;
print_srvconsole(" [%3d] %-23.22s %-11.10s %-17.16s %-16.15s %-9.8s\n", plugins, (*a).getTitle(), (*a).getVersion(), (*a).getAuthor(), (*a).getName(), (*a).getStatus());
print_srvconsole(" [%3d] %-3i %-23.22s %-11.10s %-17.16s %-32.31s %-12.11s %-9.8s\n", plugins, (*a).getId(), (*a).getTitle(), (*a).getVersion(), (*a).getAuthor(), (*a).getUrl(), (*a).getName(), (*a).getStatus());
}
++a;
}
@ -63,6 +64,52 @@ void amx_command()
print_srvconsole("%d plugins, %d running\n", plugins, running);
}
else if (!strcmp(cmd, "plugin"))
{
if (CMD_ARGC() < 3)
{
print_srvconsole("Usage: amxx plugin [ id ]\nFor a list of plugins, use the \"amxx plugins\" command\n");
}
else
{
char *pEnd;
auto id = strtol(CMD_ARGV(2), &pEnd, 10);
if (!pEnd)
{
print_srvconsole("Invalid plugin index %i.\n", id);
return;
}
auto plugin = g_plugins.findPlugin(id);
if (plugin && plugin->isValid())
{
print_srvconsole(" Name: %s\n", plugin->getTitle());
print_srvconsole(" Version: %s\n", plugin->getVersion());
print_srvconsole(" Author: %s\n", plugin->getAuthor());
auto url = plugin->getUrl();
if (url[0])
{
print_srvconsole(" URL: %s\n", url);
}
auto description = plugin->getDescription();
if (description[0])
{
print_srvconsole(" Description: %s\n", description);
}
print_srvconsole(" Filename: %s\n", plugin->getName());
print_srvconsole(" Status: %s\n", plugin->getStatus());
}
else
{
print_srvconsole("Plugin index %i not found.\n", id);
}
}
}
else if (!strcmp(cmd, "pause") && CMD_ARGC() > 2)
{
const char* sPlugin = CMD_ARGV(2);
@ -244,6 +291,7 @@ void amx_command()
print_srvconsole(" version - display amxx version info\n");
print_srvconsole(" gpl - print the license\n");
print_srvconsole(" plugins [ criteria ] - list plugins currently loaded or ones matching given search criteria\n");
print_srvconsole(" plugin [ id ] - information about a plugin\n");
print_srvconsole(" modules - list modules currently loaded\n");
print_srvconsole(" cvars [ plugin ] [ index ] - list cvars handled by amxx or show information about a cvar if index is provided\n");
print_srvconsole(" cmds [ plugin ] - list commands registered by plugins\n");

View File

@ -1,4 +1,4 @@
// vim: set ts=4 sw=4 tw=99 noet:
// 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.
@ -210,6 +210,16 @@ void copy_amxmemory(cell* dest, cell* src, int len)
*dest++=*src++;
}
bool utf8isspace(const char* string)
{
return utf8iscategory(string, 1, UTF8_CATEGORY_ISSPACE) != 0;
}
size_t utf8getspaces(const char* string)
{
return utf8iscategory(string, SIZE_MAX, UTF8_CATEGORY_ISSPACE);
}
char* parse_arg(char** line, int& state)
{
static char arg[3072];
@ -218,7 +228,7 @@ char* parse_arg(char** line, int& state)
while (**line)
{
if (isspace(**line))
if (utf8isspace(*line))
{
if (state == 1)
break;
@ -919,6 +929,7 @@ static cell AMX_NATIVE_CALL amx_strtok(AMX *amx, cell *params)
int right_pos = 0;
unsigned int i = 0;
bool done_flag = false;
size_t spaces;
int len = 0;
//string[]
@ -938,9 +949,9 @@ static cell AMX_NATIVE_CALL amx_strtok(AMX *amx, cell *params)
{
if (trim && !done_flag)
{
if (isspace(string[i]))
if ((spaces = utf8getspaces(string + i) > 0))
{
while (isspace(string[++i]));
i += spaces;
done_flag = true;
}
}
@ -974,6 +985,7 @@ static cell AMX_NATIVE_CALL amx_strtok2(AMX *amx, cell *params)
{
int left_pos = 0, right_pos = 0, len, pos = -1;
unsigned int i = 0;
size_t spaces;
char *string = get_amxstring(amx, params[1], 0, len);
char *left = new char[len + 1], *right = new char[len + 1];
@ -989,9 +1001,9 @@ static cell AMX_NATIVE_CALL amx_strtok2(AMX *amx, cell *params)
int trim = params[7];
// ltrim left
if (trim & 1 && isspace(string[i]))
if (trim & 1 && (spaces = utf8getspaces(string)) > 0)
{
while (isspace(string[++i]));
i += spaces;
}
for (; i < (unsigned int) len; ++i)
@ -1007,17 +1019,17 @@ static cell AMX_NATIVE_CALL amx_strtok2(AMX *amx, cell *params)
}
// rtrim left
if (trim & 2 && left_pos && isspace(left[left_pos - 1]))
if (trim & 2 && left_pos && utf8isspace(&left[left_pos - 1]))
{
while (--left_pos >= 0 && isspace(left[left_pos]));
while (--left_pos >= 0 && utf8isspace(&left[left_pos]));
++left_pos;
}
// ltrim right
if (trim & 4 && isspace(string[i]))
if (trim & 4 && (spaces = utf8getspaces(string + i)) > 0)
{
while (isspace(string[++i]));
i += spaces;
}
for (; i < (unsigned int) len; ++i)
@ -1026,9 +1038,9 @@ static cell AMX_NATIVE_CALL amx_strtok2(AMX *amx, cell *params)
}
// rtrim right
if (trim & 8 && right_pos && isspace(right[right_pos - 1]))
if (trim & 8 && right_pos && utf8isspace(&right[right_pos - 1]))
{
while (--right_pos >= 0 && isspace(right[right_pos]));
while (--right_pos >= 0 && utf8isspace(&right[right_pos]));
++right_pos;
}
@ -1058,8 +1070,12 @@ static cell AMX_NATIVE_CALL argparse(AMX *amx, cell *params)
// Strip all left-hand whitespace.
size_t i = start_pos;
while (i < input_len && isspace(input[i]))
i++;
size_t spaces;
if ((spaces = utf8getspaces(input + i)) > 0)
{
i += spaces;
}
if (i >= input_len) {
*buffer = '\0';
@ -1078,7 +1094,7 @@ static cell AMX_NATIVE_CALL argparse(AMX *amx, cell *params)
}
// If not in quotes, and we see a space, stop.
if (isspace(input[i]) && !in_quote)
if (utf8isspace(input + i) && !in_quote)
break;
if (size_t(bufpos - buffer) < buflen)
@ -1106,9 +1122,13 @@ static cell AMX_NATIVE_CALL strbreak(AMX *amx, cell *params) /* 5 param */
int RightMax = params[5];
size_t len = (size_t)_len;
size_t spaces;
if ((spaces = utf8getspaces(string)) > 0)
{
i += spaces;
}
while (isspace(string[i]) && i<len)
i++;
beg = i;
for (; i<len; i++)
{
@ -1120,12 +1140,12 @@ static cell AMX_NATIVE_CALL strbreak(AMX *amx, cell *params) /* 5 param */
if (i == len-1)
goto do_copy;
} else {
if (isspace(string[i]) && !in_quote)
if (!in_quote && (spaces = utf8getspaces(string + i)) > 0)
{
do_copy:
size_t pos = i;
while (isspace(string[i]))
i++;
i += spaces;
const char *start = had_quotes ? &(string[beg+1]) : &(string[beg]);
size_t _end = had_quotes ? (i==len-1 ? 1 : 2) : 0;
size_t end = (pos - _end > (size_t)LeftMax) ? (size_t)LeftMax : pos - _end;
@ -1367,18 +1387,27 @@ static cell AMX_NATIVE_CALL amx_strlen(AMX *amx, cell *params)
static cell AMX_NATIVE_CALL amx_trim(AMX *amx, cell *params)
{
int len, newlen;
char *str = get_amxstring(amx, params[1], 0, len);
int length;
auto string = get_amxstring(amx, params[1], 0, length);
UTIL_TrimLeft(str);
UTIL_TrimRight(str);
auto leftSpaces = utf8getspaces(string);
auto rightSpaces = 0u;
newlen = strlen(str);
len -= newlen;
auto originalLength = length;
set_amxstring(amx, params[1], str, newlen);
if (leftSpaces < size_t(length))
{
while (--length >= 0 && utf8isspace(string + length))
{
++rightSpaces;
}
}
return len;
auto totalSpaces = leftSpaces + rightSpaces;
set_amxstring(amx, params[1], string + leftSpaces, originalLength - totalSpaces);
return totalSpaces;
}
static cell AMX_NATIVE_CALL n_strcat(AMX *amx, cell *params)

View File

@ -44,7 +44,12 @@ cell destroyParser(cell *handle)
// native SMCParser:SMC_CreateParser();
static cell AMX_NATIVE_CALL SMC_CreateParser(AMX *amx, cell *params)
{
return createParser();
const auto handle = createParser();
const auto parseInfo = TextParsersHandles.lookup(handle);
parseInfo->handle = handle;
return handle;
}
// native SMC_SetParseStart(SMCParser:handle, const func[]);
@ -224,7 +229,12 @@ static cell AMX_NATIVE_CALL SMC_DestroyParser(AMX *amx, cell *params)
// native INIParser:INI_CreateParser();
static cell AMX_NATIVE_CALL INI_CreateParser(AMX *amx, cell *params)
{
return createParser();
const auto handle = createParser();
const auto parseInfo = TextParsersHandles.lookup(handle);
parseInfo->handle = handle;
return handle;
}
// native bool:INI_ParseFile(INIParser:handle, const file[], &line = 0, &col = 0, any:data = 0);

View File

@ -260,40 +260,54 @@ void UTIL_DHudMessage(edict_t *pEntity, const hudtextparms_t &textparms, const c
MESSAGE_END();
}
/* warning - buffer of msg must be longer than 190 chars!
(here in AMX it is always longer) */
/**
* User message size limit: 192 bytes
* Actual available size: 188 bytes (with EOS)
*/
void UTIL_ClientPrint(edict_t *pEntity, int msg_dest, char *msg)
{
if (!gmsgTextMsg)
return; // :TODO: Maybe output a warning log?
char c = msg[190];
msg[190] = 0; // truncate without checking with strlen()
const auto canUseFormatString = g_official_mod && !g_bmod_dod; // Temporary exclusion for DoD until officially supported
const auto index = canUseFormatString ? 187 : 190;
char c = msg[index];
msg[index] = 0; // truncate without checking with strlen()
if (pEntity)
MESSAGE_BEGIN(MSG_ONE, gmsgTextMsg, NULL, pEntity);
else
MESSAGE_BEGIN(MSG_BROADCAST, gmsgTextMsg);
WRITE_BYTE(msg_dest);
WRITE_STRING(msg);
MESSAGE_END();
msg[190] = c;
WRITE_BYTE(msg_dest); // 1 byte
if (canUseFormatString)
WRITE_STRING("%s"); // 3 bytes (2 + EOS)
WRITE_STRING(msg); // max 188 bytes (187 + EOS)
MESSAGE_END(); // max 192 bytes
msg[index] = c;
}
/**
* User message size limit: 192 bytes
* Actual available size: 188 bytes (with EOS)
*/
void UTIL_ClientSayText(edict_t *pEntity, int sender, char *msg)
{
if (!gmsgSayText)
return; // :TODO: Maybe output a warning log?
char c = msg[190];
msg[190] = 0; // truncate without checking with strlen()
const auto canUseFormatString = g_official_mod && !g_bmod_dod; // Temporary exclusion for DoD until officially supported
const auto index = canUseFormatString ? 187 : 190;
char c = msg[index];
msg[index] = 0; // truncate without checking with strlen()
MESSAGE_BEGIN(MSG_ONE, gmsgSayText, NULL, pEntity);
WRITE_BYTE(sender);
WRITE_STRING(msg);
MESSAGE_END();
msg[190] = c;
WRITE_BYTE(sender); // 1 byte
if (canUseFormatString)
WRITE_STRING("%s"); // 3 bytes (2 + EOS)
WRITE_STRING(msg); // max 188 bytes (187 + EOS)
MESSAGE_END(); // max 192 bytes
msg[index] = c;
}
void UTIL_TeamInfo(edict_t *pEntity, int playerIndex, const char *pszTeamName)

View File

@ -12,7 +12,7 @@ install:
- git clone https://github.com/alliedmodders/ambuild
- git clone https://github.com/alliedmodders/metamod-hl1
- git clone https://github.com/alliedmodders/hlsdk
- ps: Start-FileDownload 'https://downloads.mysql.com/archives/get/file/mysql-connector-c-6.1.1-win32.zip'
- ps: Start-FileDownload '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
@ -29,4 +29,4 @@ build_script:
- mkdir build
- cd build
- c:\python27\python ../configure.py --enable-optimize --nasm="C:\nasm\nasm-2.13.03\nasm.exe"
- c:\python27\scripts\ambuild
- ambuild

View File

@ -343,22 +343,23 @@ char *FindFileName(int argc, char **argv)
void show_help()
{
printf("Options:\n");
printf("\t-A<num> alignment in bytes of the data segment and the stack\n");
printf("\t-a output assembler code\n");
printf("\t-C[+/-] compact encoding for output file (default=-)\n");
printf("\t-c<name> codepage name or number; e.g. 1252 for Windows Latin-1\n");
printf("\t-Dpath active directory path\n");
printf("\t-d0 no symbolic information, no run-time checks\n");
printf("\t-d1 [default] run-time checks, no symbolic information\n");
printf("\t-d2 full debug information and dynamic checking\n");
printf("\t-d3 full debug information, dynamic checking, no optimization\n");
printf("\t-e<name> set name of error file (quiet compile)\n");
printf("\t-H<hwnd> window handle to send a notification message on finish\n");
printf("\t-i<name> path for include files\n");
printf("\t-l create list file (preprocess only)\n");
printf("\t-o<name> set base name of output file\n");
printf("\t-p<name> set name of \"prefix\" file\n");
printf("\t-r[name] write cross reference report to console or to specified file\n");
printf("\t-A<num> alignment in bytes of the data segment and the stack\n");
printf("\t-a output assembler code\n");
printf("\t-C[+/-] compact encoding for output file (default=-)\n");
printf("\t-c<name> codepage name or number; e.g. 1252 for Windows Latin-1\n");
printf("\t-Dpath active directory path\n");
printf("\t-d0 no symbolic information, no run-time checks\n");
printf("\t-d1 [default] run-time checks, no symbolic information\n");
printf("\t-d2 full debug information and dynamic checking\n");
printf("\t-d3 full debug information, dynamic checking, no optimization\n");
printf("\t-e<name> set name of error file (quiet compile)\n");
printf("\t-H<hwnd> window handle to send a notification message on finish\n");
printf("\t-i<name> path for include files\n");
printf("\t-l create list file (preprocess only)\n");
printf("\t-o<name> set base name of output file\n");
printf("\t-p<name> set name of \"prefix\" file\n");
printf("\t-r[name] write cross reference report to console or to specified file\n");
printf("\t-sui[+/-] show stack usage info\n");
}
#if defined(__linux__) || defined(__APPLE__)

View File

@ -54,7 +54,7 @@
#define CTRL_CHAR '^' /* default control character */
#define sCHARBITS 8 /* size of a packed character */
#define sDIMEN_MAX 3 /* maximum number of array dimensions */
#define sDIMEN_MAX 4 /* maximum number of array dimensions */
#define sLINEMAX 4095 /* input line length (in characters) */
#define sCOMP_STACK 32 /* maximum nesting of #if .. #endif sections */
#define sDEF_LITMAX 500 /* initial size of the literal pool, in "cells" */
@ -280,6 +280,12 @@ typedef struct s_stringpair {
char *documentation;
} stringpair;
typedef struct s_valuepair {
struct s_valuepair *next;
long first;
long second;
} valuepair;
/* macros for code generation */
#define opcodes(n) ((n)*sizeof(cell)) /* opcode size */
#define opargs(n) ((n)*sizeof(cell)) /* size of typical argument */
@ -700,6 +706,9 @@ SC_FUNC void delete_docstringtable(void);
SC_FUNC stringlist *insert_autolist(char *string);
SC_FUNC char *get_autolist(int index);
SC_FUNC void delete_autolisttable(void);
SC_FUNC valuepair *push_heaplist(long first, long second);
SC_FUNC int popfront_heaplist(long *first, long *second);
SC_FUNC void delete_heaplisttable(void);
SC_FUNC stringlist *insert_dbgfile(const char *filename);
SC_FUNC stringlist *insert_dbgline(int linenr);
SC_FUNC stringlist *insert_dbgsymbol(symbol *sym);
@ -726,8 +735,6 @@ int mfputs(MEMFILE *mf,char *string);
SC_FUNC int cp_path(const char *root,const char *directory);
SC_FUNC int cp_set(const char *name);
SC_FUNC cell cp_translate(const unsigned char *string,const unsigned char **endptr);
SC_FUNC cell get_utf8_char(const unsigned char *string,const unsigned char **endptr);
SC_FUNC int scan_utf8(FILE *fp,const char *filename);
/* function prototypes in SCSTATE.C */
SC_FUNC constvalue *automaton_add(const char *name);
@ -803,9 +810,9 @@ SC_VDECL int sc_status; /* read/write status */
SC_VDECL int sc_rationaltag; /* tag for rational numbers */
SC_VDECL int rational_digits; /* number of fractional digits */
SC_VDECL int sc_allowproccall;/* allow/detect tagnames in lex() */
SC_VDECL short sc_is_utf8; /* is this source file in UTF-8 encoding */
SC_VDECL char *pc_deprecate; /* if non-NULL, mark next declaration as deprecated */
SC_VDECL int sc_warnings_are_errors;
SC_VDECL int sc_stkusageinfo; /* show stack usage info? */
SC_VDECL constvalue sc_automaton_tab; /* automaton table */
SC_VDECL constvalue sc_state_tab; /* state table */

View File

@ -628,6 +628,7 @@ int pc_compile(int argc, char *argv[])
/* reset "defined" flag of all functions and global variables */
reduce_referrers(&glbtab);
delete_symbols(&glbtab,0,TRUE,FALSE);
delete_heaplisttable();
#if !defined NO_DEFINE
delete_substtable();
inst_datetime_defines();
@ -755,14 +756,55 @@ cleanup:
#if !defined SC_LIGHT
if (errnum==0 && strlen(errfname)==0) {
int flag_exceed=0;
if (sc_amxlimit > 0 && (long)(hdrsize+code_idx+glb_declared*sizeof(cell)+sc_stksize*sizeof(cell)) >= sc_amxlimit)
flag_exceed=1;
if ((sc_debug & sSYMBOLIC)!=0 || verbosity>=2 || flag_exceed) {
int recursion = 0, flag_exceed = 0;
long stacksize = 0L;
unsigned long maxStackUsage = 0L;
unsigned long dynamicStackSizeLimit = (long)sc_stksize * sizeof(cell);
if (sc_amxlimit > 0) {
long totalsize = hdrsize + code_idx + glb_declared * sizeof(cell) + dynamicStackSizeLimit;
if (totalsize >= sc_amxlimit)
flag_exceed = 1;
} /* if */
/* if */
if(sc_stkusageinfo) {
stacksize = max_stacksize(&glbtab, &recursion);
maxStackUsage = stacksize * sizeof(cell);
if (recursion) {
pc_printf("Note: estimated max. usage: unknown, due to recursion\n");
} /* if */
else if (maxStackUsage >= dynamicStackSizeLimit) {
pc_printf("Note: estimated max. stack usage is %ld cells %ld bytes, limit %ld bytes\n", stacksize, maxStackUsage, dynamicStackSizeLimit);
}
} /* if */
/* if */
/* Note: Seems like `stacksize + 32 >= (long)sc_stksize` condition in original compiler invented to show stack usage warning if it's exceeded, that's why it's defined */
if ((sc_debug & sSYMBOLIC)!=0 || verbosity>=2 || /* stacksize + 32 >= (long)sc_stksize || */ flag_exceed) {
pc_printf("Header size: %8ld bytes\n", (long)hdrsize);
pc_printf("Code size: %8ld bytes\n", (long)code_idx);
pc_printf("Data size: %8ld bytes\n", (long)glb_declared*sizeof(cell));
pc_printf("Stack/heap size: %8ld bytes\n", (long)sc_stksize*sizeof(cell));
pc_printf("Stack/heap size: %8ld bytes", dynamicStackSizeLimit);
if(sc_stkusageinfo) {
pc_printf(" | estimated max. usage");
/* if */
if (recursion) {
pc_printf(": unknown, due to recursion\n");
}
/* else if ((pc_memflags & suSLEEP_INSTR) != 0)
pc_printf(": unknown, due to the \"sleep\" instruction\n");*/
else {
pc_printf("=%ld cells (%ld bytes)\n", stacksize, maxStackUsage);
} /* if */
}
else {
pc_printf("\n");
} /* if */
pc_printf("Total requirements:%8ld bytes\n", (long)hdrsize+(long)code_idx+(long)glb_declared*sizeof(cell)+(long)sc_stksize*sizeof(cell));
} /* if */
if (flag_exceed)
@ -805,6 +847,7 @@ cleanup:
free(sc_documentation);
#endif
delete_autolisttable();
delete_heaplisttable();
if (errnum!=0) {
if (strlen(errfname)==0)
pc_printf("\n%d Error%s.\n",errnum,(errnum>1) ? "s" : "");
@ -960,6 +1003,8 @@ static void initglobals(void)
sc_documentation=NULL;
sc_makereport=FALSE; /* do not generate a cross-reference report */
#endif
sc_stkusageinfo=FALSE;/* stack usage info disabled by default */
}
/* set_extension
@ -1022,6 +1067,8 @@ static void parseoptions(int argc,char **argv,char *oname,char *ename,char *pnam
const char *ptr;
int arg,i,isoption;
static const char stackusageinfo[4] = { 's', 'u', 'i', '\0' };
for (arg=1; arg<argc; arg++) {
#if DIRSEP_CHAR=='/'
isoption= argv[arg][0]=='-';
@ -1150,9 +1197,18 @@ static void parseoptions(int argc,char **argv,char *oname,char *ename,char *pnam
else
about();
break;
case 's':
case 's': {
if(strlen(ptr) >= (sizeof(stackusageinfo) - 1)) {
if(*(ptr+1) == stackusageinfo[1] && *(ptr+2) == stackusageinfo[2]) {
ptr += 2;
sc_stkusageinfo = toggle_option(ptr, sc_stkusageinfo);
break;
}
}
skipinput=atoi(option_value(ptr));
break;
}
case 't':
i=atoi(option_value(ptr));
if (i>0)
@ -1406,43 +1462,44 @@ static void about(void)
setcaption();
pc_printf("Usage: pawncc <filename> [filename...] [options]\n\n");
pc_printf("Options:\n");
pc_printf(" -A<num> alignment in bytes of the data segment and the stack\n");
pc_printf(" -a output assembler code\n");
pc_printf(" -A<num> alignment in bytes of the data segment and the stack\n");
pc_printf(" -a output assembler code\n");
#if AMX_COMPACTMARGIN > 2
pc_printf(" -C[+/-] compact encoding for output file (default=%c)\n", sc_compress ? '+' : '-');
pc_printf(" -C[+/-] compact encoding for output file (default=%c)\n", sc_compress ? '+' : '-');
#endif
pc_printf(" -c<name> codepage name or number; e.g. 1252 for Windows Latin-1\n");
pc_printf(" -c<name> codepage name or number; e.g. 1252 for Windows Latin-1\n");
#if defined dos_setdrive
pc_printf(" -Dpath active directory path\n");
pc_printf(" -Dpath active directory path\n");
#endif
pc_printf(" -d0 no symbolic information, no run-time checks\n");
pc_printf(" -d1 [default] run-time checks, no symbolic information\n");
pc_printf(" -d2 full debug information and dynamic checking\n");
pc_printf(" -d3 full debug information, dynamic checking, no optimization\n");
pc_printf(" -e<name> set name of error file (quiet compile)\n");
pc_printf(" -d0 no symbolic information, no run-time checks\n");
pc_printf(" -d1 [default] run-time checks, no symbolic information\n");
pc_printf(" -d2 full debug information and dynamic checking\n");
pc_printf(" -d3 full debug information, dynamic checking, no optimization\n");
pc_printf(" -e<name> set name of error file (quiet compile)\n");
#if defined __WIN32__ || defined _WIN32 || defined _Windows
pc_printf(" -H<hwnd> window handle to send a notification message on finish\n");
pc_printf(" -H<hwnd> window handle to send a notification message on finish\n");
#endif
pc_printf(" -i<name> path for include files\n");
pc_printf(" -l create list file (preprocess only)\n");
pc_printf(" -o<name> set base name of (P-code) output file\n");
pc_printf(" -p<name> set name of \"prefix\" file\n");
pc_printf(" -i<name> path for include files\n");
pc_printf(" -l create list file (preprocess only)\n");
pc_printf(" -o<name> set base name of (P-code) output file\n");
pc_printf(" -p<name> set name of \"prefix\" file\n");
#if !defined SC_LIGHT
pc_printf(" -r[name] write cross reference report to console or to specified file\n");
pc_printf(" -r[name] write cross reference report to console or to specified file\n");
#endif
pc_printf(" -S<num> stack/heap size in cells (default=%d)\n",(int)sc_stksize);
pc_printf(" -s<num> skip lines from the input file\n");
pc_printf(" -t<num> TAB indent size (in character positions, default=%d)\n",sc_tabsize);
pc_printf(" -v<num> verbosity level; 0=quiet, 1=normal, 2=verbose (default=%d)\n",verbosity);
pc_printf(" -w<num> disable a specific warning by its number\n");
pc_printf(" -E treat warnings as errors\n");
pc_printf(" -X<num> abstract machine size limit in bytes\n");
pc_printf(" -\\ use '\\' for escape characters\n");
pc_printf(" -^ use '^' for escape characters\n");
pc_printf(" -;[+/-] require a semicolon to end each statement (default=%c)\n", sc_needsemicolon ? '+' : '-');
pc_printf(" -([+/-] require parantheses for function invocation (default=%c)\n", optproccall ? '-' : '+');
pc_printf(" sym=val define constant \"sym\" with value \"val\"\n");
pc_printf(" sym= define constant \"sym\" with value 0\n");
pc_printf(" -S<num> stack/heap size in cells (default=%d)\n",(int)sc_stksize);
pc_printf(" -s<num> skip lines from the input file\n");
pc_printf(" -sui[+/-] show stack usage info\n");
pc_printf(" -t<num> TAB indent size (in character positions, default=%d)\n",sc_tabsize);
pc_printf(" -v<num> verbosity level; 0=quiet, 1=normal, 2=verbose (default=%d)\n",verbosity);
pc_printf(" -w<num> disable a specific warning by its number\n");
pc_printf(" -E treat warnings as errors\n");
pc_printf(" -X<num> abstract machine size limit in bytes\n");
pc_printf(" -\\ use '\\' for escape characters\n");
pc_printf(" -^ use '^' for escape characters\n");
pc_printf(" -;[+/-] require a semicolon to end each statement (default=%c)\n", sc_needsemicolon ? '+' : '-');
pc_printf(" -([+/-] require parantheses for function invocation (default=%c)\n", optproccall ? '-' : '+');
pc_printf(" sym=val define constant \"sym\" with value \"val\"\n");
pc_printf(" sym= define constant \"sym\" with value 0\n");
#if defined __WIN32__ || defined _WIN32 || defined _Windows || defined __MSDOS__
pc_printf("\nOptions may start with a dash or a slash; the options \"-d0\" and \"/d0\" are\n");
pc_printf("equivalent.\n");
@ -2170,53 +2227,48 @@ static cell calc_arraysize(int dim[],int numdim,int cur)
return dim[cur]+(dim[cur]*calc_arraysize(dim,numdim,cur+1));
}
static cell adjust_indirectiontables(int dim[],int numdim,int cur,cell increment,
int startlit,constvalue *lastdim,int *skipdim)
static void adjust_indirectiontables(int dim[],int numdim,int startlit,
constvalue *lastdim,int *skipdim)
{
static int base;
int d;
int cur;
int i,d;
cell accum;
cell size;
assert(cur>=0 && cur<numdim);
assert(increment>=0);
assert(cur>0 && startlit==-1 || startlit>=0 && startlit<=litidx);
if (cur==0)
base=startlit;
if (cur==numdim-1)
return 0;
/* 2 or more dimensions left, fill in an indirection vector */
assert(dim[cur]>0);
if (dim[cur+1]>0) {
for (d=0; d<dim[cur]; d++)
litq[base++]=(dim[cur]+d*(dim[cur+1]-1)+increment) * sizeof(cell);
accum=dim[cur]*(dim[cur+1]-1);
} else {
/* final dimension is variable length */
constvalue *ld;
assert(dim[cur+1]==0);
assert(lastdim!=NULL);
assert(skipdim!=NULL);
accum=0;
/* skip the final dimension sizes for all earlier major dimensions */
for (d=0,ld=lastdim->next; d<*skipdim; d++,ld=ld->next) {
assert(ld!=NULL);
} /* for */
for (d=0; d<dim[cur]; d++) {
assert(ld!=NULL);
assert(strtol(ld->name,NULL,16)==d);
litq[base++]=(dim[cur]+accum+increment) * sizeof(cell);
accum+=ld->value-1;
*skipdim+=1;
ld=ld->next;
} /* for */
} /* if */
/* create the indirection tables for the lower level */
if (cur+2<numdim) { /* are there at least 2 dimensions below this one? */
increment+=(dim[cur]-1)*dim[cur+1]; /* this many indirection tables follow */
for (d=0; d<dim[cur]; d++)
increment+=adjust_indirectiontables(dim,numdim,cur+1,increment,-1,lastdim,skipdim);
} /* if */
return accum;
assert(startlit==-1 || startlit>=0 && startlit<=litidx);
base=startlit;
size=1;
for (cur=0; cur<numdim-1; cur++) {
/* 2 or more dimensions left, fill in an indirection vector */
if (dim[cur+1]>0) {
for (i=0; i<size; i++)
for (d=0; d<dim[cur]; d++)
litq[base++]=(size*dim[cur]+(dim[cur+1]-1)*(dim[cur]*i+d)) * sizeof(cell);
} else {
/* final dimension is variable length */
constvalue *ld;
assert(dim[cur+1]==0);
assert(lastdim!=NULL);
assert(skipdim!=NULL);
accum=0;
for (i=0; i<size; i++) {
/* skip the final dimension sizes for all earlier major dimensions */
for (d=0,ld=lastdim->next; d<*skipdim; d++,ld=ld->next) {
assert(ld!=NULL);
} /* for */
for (d=0; d<dim[cur]; d++) {
assert(ld!=NULL);
assert(strtol(ld->name,NULL,16)==d);
litq[base++]=(size*dim[cur]+accum) * sizeof(cell);
accum+=ld->value-1;
*skipdim+=1;
ld=ld->next;
} /* for */
} /* for */
} /* if */
size*=dim[cur];
} /* for */
}
/* initials
@ -2274,7 +2326,7 @@ static void initials2(int ident,int tag,cell *size,int dim[],int numdim,
for (tablesize=calc_arraysize(dim,numdim-1,0); tablesize>0; tablesize--)
litadd(0);
if (dim[numdim-1]!=0) /* error 9 has already been given */
adjust_indirectiontables(dim,numdim,0,0,curlit,NULL,NULL);
adjust_indirectiontables(dim,numdim,curlit,NULL,NULL);
} /* if */
return;
} /* if */
@ -2340,7 +2392,7 @@ static void initials2(int ident,int tag,cell *size,int dim[],int numdim,
* of the array and we can properly adjust the indirection vectors
*/
if (err==0)
adjust_indirectiontables(dim,numdim,0,0,curlit,&lastdim,&skipdim);
adjust_indirectiontables(dim,numdim,curlit,&lastdim,&skipdim);
delete_consttable(&lastdim); /* clear list of minor dimension sizes */
} /* if */
} /* if */
@ -5455,6 +5507,16 @@ static void doreturn(void)
/* nothing */;
sub=addvariable(curfunc->name,(argcount+3)*sizeof(cell),iREFARRAY,sGLOBAL,curfunc->tag,dim,numdim,idxtag);
sub->parent=curfunc;
/* Function that returns array can be used before it is defined, so at
* the call point (if it is before definition) we may not know if this
* function returns array and what is its size (for example inside the
* conditional operator), so we don't know how many cells on the heap
* we need. Calculating heap consumption is required for the fix of
* incorrect heap deallocation on conditional operator. That's why we
* need an additional pass.
*/
if ((curfunc->usage & uREAD)!=0)
sc_reparse=TRUE;
} /* if */
/* get the hidden parameter, copy the array (the array is on the heap;
* it stays on the heap for the moment, and it is removed -usually- at
@ -5727,3 +5789,137 @@ static int *readwhile(void)
return (wqptr-wqSIZE);
} /* if */
}
#if !defined SC_LIGHT
static long max_stacksize_recurse(symbol** sourcesym, symbol* sym, symbol** rsourcesym, long basesize, int* pubfuncparams, int* recursion)
{
long size, maxsize;
int i, stkpos;
assert(sourcesym != NULL);
assert(sym != NULL);
assert(sym->ident == iFUNCTN);
assert((sym->usage & uNATIVE) == 0);
assert(recursion != NULL);
maxsize = sym->x.stacksize;
for (i = 0; i < sym->numrefers; i++) {
if (sym->refer[i] != NULL) {
assert(sym->refer[i]->ident == iFUNCTN);
assert((sym->refer[i]->usage & uNATIVE) == 0); /* a native function cannot refer to a user-function */
*(rsourcesym) = sym;
*(rsourcesym + 1) = NULL;
for (stkpos = 0; sourcesym[stkpos] != NULL; stkpos++) {
if (sym->refer[i] == sourcesym[stkpos]) { /* recursion detection */
*recursion = 1;
goto break_recursion; /* recursion was detected, quit loop */
} /* if */
} /* for */
/* add this symbol to the stack */
sourcesym[stkpos] = sym;
sourcesym[stkpos + 1] = NULL;
/* check size of callee */
size = max_stacksize_recurse(sourcesym, sym->refer[i], rsourcesym + 1, sym->x.stacksize, pubfuncparams, recursion);
if (maxsize < size)
maxsize = size;
/* remove this symbol from the stack */
sourcesym[stkpos] = NULL;
} /* if */
} /* for */
break_recursion:
if ((sym->usage & uPUBLIC) != 0) {
/* Find out how many parameters a public function has, then see if this
* is bigger than some maximum
*/
arginfo* arg = sym->dim.arglist;
int count = 0;
assert(arg != 0);
while (arg->ident != 0) {
count++;
arg++;
} /* while */
assert(pubfuncparams != 0);
if (count > * pubfuncparams)
*pubfuncparams = count;
} /* if */
return maxsize + basesize;
}
static long max_stacksize(symbol* root, int* recursion)
{
/* Loop over all non-native functions. For each function, loop
* over all of its referrers, accumulating the stack requirements.
* Detect (indirect) recursion with a "mark-and-sweep" algorithm.
* I (mis-)use the "compound" field of the symbol structure for
* the marker, as this field is unused for functions.
*
* Note that the stack is shared with the heap. A host application
* may "eat" cells from the heap as well, through amx_Allot(). The
* stack requirements are thus only an estimate.
*/
long size, maxsize;
int maxparams, numfunctions;
symbol* sym;
symbol** symstack, ** rsymstack;
assert(root != NULL);
assert(recursion != NULL);
/* count number of functions (for allocating the stack for recursion detection) */
numfunctions = 0;
for (sym = root->next; sym != NULL; sym = sym->next) {
if (sym->ident == iFUNCTN) {
assert(sym->compound == 0);
if ((sym->usage & uNATIVE) == 0)
numfunctions++;
} /* if */
} /* if */
/* allocate function symbol stack */
symstack = (symbol**)malloc((numfunctions + 1) * sizeof(symbol*));
rsymstack = (symbol**)malloc((numfunctions + 1) * sizeof(symbol*));
if (symstack == NULL || rsymstack == NULL)
error(103); /* insufficient memory (fatal error) */
memset(symstack, 0, (numfunctions + 1) * sizeof(symbol*));
memset(rsymstack, 0, (numfunctions + 1) * sizeof(symbol*));
maxsize = 0;
maxparams = 0;
*recursion = 0; /* assume no recursion */
for (sym = root->next; sym != NULL; sym = sym->next) {
int recursion_detected;
/* drop out if this is not a user-implemented function */
if (sym->ident != iFUNCTN || (sym->usage & uNATIVE) != 0)
continue;
/* accumulate stack size for this symbol */
symstack[0] = sym;
assert(symstack[1] == NULL);
recursion_detected = 0;
size = max_stacksize_recurse(symstack, sym, rsymstack, 0L, &maxparams, &recursion_detected);
if (recursion_detected) {
if (rsymstack[1] == NULL) {
pc_printf("recursion detected: function %s directly calls itself\n", sym->name);
}
else {
int i;
pc_printf("recursion detected: function %s indirectly calls itself:\n", sym->name);
pc_printf("%s ", sym->name);
for (i = 1; rsymstack[i] != NULL; i++) {
pc_printf("<- %s ", rsymstack[i]->name);
}
pc_printf("<- %s\n", sym->name);
}
*recursion = recursion_detected;
}
assert(size >= 0);
if (maxsize < size)
maxsize = size;
} /* for */
free((void*)symstack);
free((void*)rsymstack);
maxsize++; /* +1 because a zero cell is always pushed on top
* of the stack to catch stack overwrites */
return maxsize + (maxparams + 1);/* +1 because # of parameters is always pushed on entry */
}
#endif

View File

@ -152,7 +152,6 @@ static char *extensions[] = { ".inc", ".p", ".pawn" };
PUSHSTK_I(iflevel);
assert(!SKIPPING);
assert(skiplevel==iflevel); /* these two are always the same when "parsing" */
PUSHSTK_I(sc_is_utf8);
PUSHSTK_I(icomment);
PUSHSTK_I(fcurrent);
PUSHSTK_I(fline);
@ -169,7 +168,6 @@ static char *extensions[] = { ".inc", ".p", ".pawn" };
assert(sc_status == statFIRST || strcmp(get_inputfile(fcurrent), inpfname) == 0);
setfiledirect(inpfname); /* (optionally) set in the list file */
listline=-1; /* force a #line directive when changing the file */
sc_is_utf8=(short)scan_utf8(inpf,name);
return TRUE;
}
@ -319,7 +317,6 @@ static void readline(unsigned char *line)
fline=i;
fcurrent=(short)POPSTK_I();
icomment=(short)POPSTK_I();
sc_is_utf8=(short)POPSTK_I();
iflevel=(short)POPSTK_I();
skiplevel=iflevel; /* this condition held before including the file */
assert(!SKIPPING); /* idem ditto */
@ -603,13 +600,6 @@ static int htoi(cell *val,const unsigned char *curptr)
return (int)(ptr-curptr);
}
#if defined __APPLE__
static double pow10(double d)
{
return pow(10, d);
}
#endif
/* ftoi
*
* Attempts to interpret a numeric symbol as a rational number, either as
@ -685,11 +675,7 @@ static int ftoi(cell *val,const unsigned char *curptr)
exp=(exp*10)+(*ptr-'0');
ptr++;
} /* while */
#if defined __GNUC__
fmult=pow10(exp*sign);
#else
fmult=pow(10,exp*sign);
#endif
fmult=pow(10,exp*sign);
fnum *= fmult;
dnum *= (unsigned long)(fmult+0.5);
} /* if */
@ -1204,6 +1190,8 @@ static int command(void)
if (comma)
lptr++;
} while (comma);
} else if (strcmp(str, "showstackusageinfo")==0) {
sc_stkusageinfo=TRUE;
} else {
error(207); /* unknown #pragma */
} /* if */
@ -2395,21 +2383,12 @@ static cell litchar(const unsigned char **lptr,int flags)
cptr=*lptr;
if ((flags & RAWMODE)!=0 || *cptr!=sc_ctrlchar) { /* no escape character */
#if !defined NO_UTF8
if (sc_is_utf8 && (flags & UTF8MODE)!=0) {
c=get_utf8_char(cptr,&cptr);
assert(c>=0); /* file was already scanned for conformance to UTF-8 */
} else {
#endif
#if !defined NO_CODEPAGE
c=cp_translate(cptr,&cptr);
#else
c=*cptr;
cptr+=1;
#endif
#if !defined NO_UTF8
} /* if */
#endif
} else {
cptr+=1;
if (*cptr==sc_ctrlchar) {

65
compiler/libpc300/sc3.c Executable file → Normal file
View File

@ -1010,38 +1010,60 @@ static int hier13(value *lval)
{
int lvalue=plnge1(hier12,lval);
if (matchtoken('?')) {
int locheap=decl_heap; /* save current heap delta */
long heap1,heap2; /* max. heap delta either branch */
valuepair *heaplist_node;
int flab1=getlabel();
int flab2=getlabel();
value lval2 = {0};
int array1,array2;
int orig_heap=decl_heap;
int diff1=0,diff2=0;
if (lvalue) {
rvalue(lval);
} else if (lval->ident==iCONSTEXPR) {
ldconst(lval->constval,sPRI);
error(lval->constval ? 206 : 205); /* redundant test */
} /* if */
if (sc_status==statFIRST) {
/* We should push a new node right now otherwise we will pop it in the
* wrong order on the write stage.
*/
heaplist_node=push_heaplist(0,0); /* save the pointer to write the actual data later */
} else if (sc_status==statWRITE || sc_status==statSKIP) {
#if !defined NDEBUG
int result=
#endif
popfront_heaplist(&heap1,&heap2);
assert(result); /* pop off equally many items than were pushed */
} /* if */
jmp_eq0(flab1); /* go to second expression if primary register==0 */
PUSHSTK_I(sc_allowtags);
sc_allowtags=FALSE; /* do not allow tagnames here (colon is a special token) */
if (sc_status==statWRITE) {
modheap(heap1*sizeof(cell));
decl_heap+=heap1; /* equilibrate the heap (see comment below) */
} /* if */
if (hier13(lval))
rvalue(lval);
if (lval->ident==iCONSTEXPR) /* load constant here */
ldconst(lval->constval,sPRI);
sc_allowtags=(short)POPSTK_I(); /* restore */
heap1=decl_heap-locheap; /* save heap space used in "true" branch */
assert(heap1>=0);
decl_heap=locheap; /* restore heap delta */
jumplabel(flab2);
setlabel(flab1);
if (orig_heap!=decl_heap) {
diff1=abs(decl_heap-orig_heap);
decl_heap=orig_heap;
}
needtoken(':');
if (sc_status==statWRITE) {
modheap(heap2*sizeof(cell));
decl_heap+=heap2; /* equilibrate the heap (see comment below) */
} /* if */
if (hier13(&lval2))
rvalue(&lval2);
if (lval2.ident==iCONSTEXPR) /* load constant here */
ldconst(lval2.constval,sPRI);
heap2=decl_heap-locheap; /* save heap space used in "false" branch */
assert(heap2>=0);
array1= (lval->ident==iARRAY || lval->ident==iREFARRAY);
array2= (lval2.ident==iARRAY || lval2.ident==iREFARRAY);
if (array1 && !array2) {
@ -1055,19 +1077,26 @@ static int hier13(value *lval)
if (!matchtag(lval->tag,lval2.tag,FALSE))
error(213); /* tagname mismatch ('true' and 'false' expressions) */
setlabel(flab2);
if (sc_status==statFIRST) {
/* Calculate the max. heap space used by either branch and save values of
* max - heap1 and max - heap2. On the second pass, we use these values
* to equilibrate the heap space used by either branch. This is needed
* because we don't know (at compile time) which branch will be taken,
* but the heap cannot be restored inside each branch because the result
* on the heap may needed by the remaining expression.
*/
int max=(heap1>heap2) ? heap1 : heap2;
heaplist_node->first=max-heap1;
heaplist_node->second=max-heap2;
decl_heap=locheap+max; /* otherwise it will contain locheap+heap2 and the
* max. heap usage will be wrong for the upper
* expression */
} /* if */
assert(sc_status!=statWRITE || heap1==heap2);
if (lval->ident==iARRAY)
lval->ident=iREFARRAY; /* iARRAY becomes iREFARRAY */
else if (lval->ident!=iREFARRAY)
lval->ident=iEXPRESSION; /* iREFARRAY stays iREFARRAY, rest becomes iEXPRESSION */
if (orig_heap!=decl_heap) {
diff2=abs(decl_heap-orig_heap);
decl_heap=orig_heap;
}
if (diff1==diff2) {
decl_heap+=(diff1/2);
} else {
decl_heap+=(diff1+diff2);
}
return FALSE; /* conditional expression is no lvalue */
} else {
return lvalue;
@ -2058,7 +2087,8 @@ static int nesting=0;
error(35,argidx+1); /* argument type mismatch */
/* Verify that the dimensions match with those in arg[argidx].
* A literal array always has a single dimension.
* An iARRAYCELL parameter is also assumed to have a single dimension.
* An iARRAYCELL parameter is also assumed to have a single dimension,
* but its size may be >1 in case of an enumeration pseudo-array.
*/
if (lval.sym==NULL || lval.ident==iARRAYCELL) {
if (arg[argidx].numdim!=1) {
@ -2066,7 +2096,8 @@ static int nesting=0;
} else if (arg[argidx].dim[0]!=0) {
assert(arg[argidx].dim[0]>0);
if (lval.ident==iARRAYCELL) {
error(47); /* array sizes must match */
if (lval.constval==0 || arg[argidx].dim[0]!=lval.constval)
error(47); /* array sizes must match */
} else {
assert(lval.constval!=0); /* literal array must have a size */
/* A literal array must have exactly the same size as the

View File

@ -309,120 +309,3 @@ SC_FUNC cell cp_translate(const unsigned char *string,const unsigned char **endp
}
#endif /* NO_CODEPAGE */
#if !defined NO_UTF8
SC_FUNC cell get_utf8_char(const unsigned char *string,const unsigned char **endptr)
{
int follow=0;
long lowmark=0;
unsigned char ch;
cell result=0;
if (endptr!=NULL)
*endptr=string;
for ( ;; ) {
ch=*string++;
if (follow>0 && (ch & 0xc0)==0x80) {
/* leader code is active, combine with earlier code */
result=(result << 6) | (ch & 0x3f);
if (--follow==0) {
/* encoding a character in more bytes than is strictly needed,
* is not really valid UTF-8; we are strict here to increase
* the chance of heuristic dectection of non-UTF-8 text
* (JAVA writes zero bytes as a 2-byte code UTF-8, which is invalid)
*/
if (result<lowmark)
return -1;
/* the code positions 0xd800--0xdfff and 0xfffe & 0xffff do not
* exist in UCS-4 (and hence, they do not exist in Unicode)
*/
if ((result>=0xd800 && result<=0xdfff) || result==0xfffe || result==0xffff)
return -1;
} /* if */
break;
} else if (follow==0 && (ch & 0x80)==0x80) {
/* UTF-8 leader code */
if ((ch & 0xe0)==0xc0) {
/* 110xxxxx 10xxxxxx */
follow=1;
lowmark=0x80L;
result=ch & 0x1f;
} else if ((ch & 0xf0)==0xe0) {
/* 1110xxxx 10xxxxxx 10xxxxxx (16 bits, BMP plane) */
follow=2;
lowmark=0x800L;
result=ch & 0x0f;
} else if ((ch & 0xf8)==0xf0) {
/* 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */
follow=3;
lowmark=0x10000L;
result=ch & 0x07;
} else if ((ch & 0xfc)==0xf8) {
/* 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */
follow=4;
lowmark=0x200000L;
result=ch & 0x03;
} else if ((ch & 0xfe)==0xfc) {
/* 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx (32 bits) */
follow=5;
lowmark=0x4000000L;
result=ch & 0x01;
} else {
/* this is invalid UTF-8 */
return -1;
} /* if */
} else if (follow==0 && (ch & 0x80)==0x00) {
/* 0xxxxxxx (US-ASCII) */
result=ch;
break;
} else {
/* this is invalid UTF-8 */
return -1;
} /* if */
} /* for */
if (endptr!=NULL)
*endptr=string;
return result;
}
#endif
SC_FUNC int scan_utf8(FILE *fp,const char *filename)
{
#if defined NO_UTF8
return 0;
#else
static void *resetpos=NULL;
int utf8=TRUE;
int firstchar=TRUE,bom_found=FALSE;
const unsigned char *ptr;
resetpos=pc_getpossrc(fp);
while (utf8 && pc_readsrc(fp,pline,sLINEMAX)!=NULL) {
ptr=pline;
if (firstchar) {
/* check whether the very first character on the very first line
* starts with a BYTE order mark
*/
cell c=get_utf8_char(ptr,&ptr);
bom_found= (c==0xfeff);
utf8= (c>=0);
firstchar=FALSE;
} /* if */
while (utf8 && *ptr!='\0')
utf8= (get_utf8_char(ptr,&ptr)>=0);
} /* while */
pc_resetsrc(fp,resetpos);
if (bom_found) {
unsigned char bom[3];
if (!utf8)
error(77,filename); /* malformed UTF-8 encoding */
pc_readsrc(fp,bom,3);
assert(bom[0]==0xef && bom[1]==0xbb && bom[2]==0xbf);
} /* if */
return utf8;
#endif /* NO_UTF8 */
}

View File

@ -443,6 +443,52 @@ SC_FUNC void delete_autolisttable(void)
}
/* ----- value pair list ----------------------------------------- */
static valuepair heaplist = {NULL, 0, 0};
SC_FUNC valuepair *push_heaplist(long first, long second)
{
valuepair *cur, *last;
if ((cur=malloc(sizeof(valuepair)))==NULL)
error(103); /* insufficient memory (fatal error) */
cur->first=first;
cur->second=second;
cur->next=NULL;
for (last=&heaplist; last->next!=NULL; last=last->next)
/* nothing */;
last->next=cur;
return cur;
}
SC_FUNC int popfront_heaplist(long *first, long *second)
{
valuepair *front=heaplist.next;
if (front==NULL)
return 0;
/* copy fields */
*first=front->first;
*second=front->second;
/* unlink and free */
heaplist.next=front->next;
free(front);
return 1;
}
SC_FUNC void delete_heaplisttable(void)
{
valuepair *cur;
while (heaplist.next!=NULL) {
cur=heaplist.next;
heaplist.next=cur->next;
free(cur);
} /* while */
}
/* ----- debug information --------------------------------------- */
static stringlist dbgstrings = {NULL, NULL};

View File

@ -84,10 +84,10 @@ SC_VDEFINE int sc_status; /* read/write status */
SC_VDEFINE int sc_rationaltag=0; /* tag for rational numbers */
SC_VDEFINE int rational_digits=0; /* number of fractional digits */
SC_VDEFINE int sc_allowproccall=0; /* allow/detect tagnames in lex() */
SC_VDEFINE short sc_is_utf8=FALSE; /* is this source file in UTF-8 encoding */
SC_VDEFINE char *pc_deprecate = NULL;/* if non-null, mark next declaration as deprecated */
SC_VDEFINE int sc_showincludes=0; /* show include files */
SC_VDEFINE int sc_warnings_are_errors=0;
SC_VDEFINE int sc_stkusageinfo = FALSE; /* show stack usage info? */
SC_VDEFINE constvalue sc_automaton_tab = { NULL, "", 0, 0}; /* automaton table */
SC_VDEFINE constvalue sc_state_tab = { NULL, "", 0, 0}; /* state table */

File diff suppressed because it is too large Load Diff

View File

@ -1729,6 +1729,33 @@
"linux" "2468"
"mac" "2468"
}
"m_iLastAccount" // int
{
"type" "integer"
"windows" "2480"
"linux" "2500"
"mac" "2500"
}
"m_iLastClientHealth" // int
{
"type" "integer"
"windows" "2484"
"linux" "2504"
"mac" "2504"
}
"m_tmNextAccountHealthUpdate" // float
{
"type" "float"
"windows" "2488"
"linux" "2508"
"mac" "2508"
}
}
}
}

View File

@ -23,9 +23,9 @@
{
"type" "pointer"
"windows" "2480"
"linux" "2500"
"mac" "2500"
"windows" "2492"
"linux" "2512"
"mac" "2512"
}
"m_id" // unsigned int
@ -33,57 +33,21 @@
"type" "integer"
"unsigned" "1"
"windows" "2484"
"linux" "2504"
"mac" "2504"
"windows" "2496"
"linux" "2516"
"mac" "2516"
}
"m_flNextBotThink" // float
{
"type" "float"
"windows" "2488"
"linux" "2508"
"mac" "2508"
}
"m_flNextFullBotThink" // float
{
"type" "float"
"windows" "2492"
"linux" "2512"
"mac" "2512"
}
"m_flPreviousCommandTime" // float
{
"type" "float"
"windows" "2496"
"linux" "2516"
"mac" "2516"
}
"m_isRunning" // bool
{
"type" "boolean"
"windows" "2500"
"linux" "2520"
"mac" "2520"
}
"m_isCrouching" // bool
{
"type" "boolean"
"windows" "2501"
"linux" "2521"
"mac" "2521"
}
"m_forwardSpeed" // float
"m_flNextFullBotThink" // float
{
"type" "float"
@ -92,7 +56,7 @@
"mac" "2524"
}
"m_strafeSpeed" // float
"m_flPreviousCommandTime" // float
{
"type" "float"
@ -101,26 +65,34 @@
"mac" "2528"
}
"m_verticalSpeed" // float
"m_isRunning" // bool
{
"type" "float"
"type" "boolean"
"windows" "2512"
"linux" "2532"
"mac" "2532"
}
"m_buttonFlags" // short unsigned int
"m_isCrouching" // bool
{
"type" "short"
"unsigned" "1"
"type" "boolean"
"windows" "2513"
"linux" "2533"
"mac" "2533"
}
"m_forwardSpeed" // float
{
"type" "float"
"windows" "2516"
"linux" "2536"
"mac" "2536"
}
"m_jumpTimestamp" // float
"m_strafeSpeed" // float
{
"type" "float"
@ -129,23 +101,51 @@
"mac" "2540"
}
"m_postureStack" // struct PostureContext[8]
"m_verticalSpeed" // float
{
"type" "structure"
"size" "8"
"type" "float"
"windows" "2524"
"linux" "2544"
"mac" "2544"
}
"m_buttonFlags" // short unsigned int
{
"type" "short"
"unsigned" "1"
"windows" "2528"
"linux" "2548"
"mac" "2548"
}
"m_jumpTimestamp" // float
{
"type" "float"
"windows" "2532"
"linux" "2552"
"mac" "2552"
}
"m_postureStack" // struct PostureContext[8]
{
"type" "structure"
"size" "8"
"windows" "2536"
"linux" "2556"
"mac" "2556"
}
"m_postureStackIndex" // int
{
"type" "integer"
"windows" "2540"
"linux" "2560"
"mac" "2560"
"windows" "2552"
"linux" "2572"
"mac" "2572"
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -23,21 +23,12 @@
{
"type" "integer"
"windows" "1040"
"linux" "1060"
"mac" "1060"
}
"m_painTime" // float
{
"type" "float"
"windows" "1044"
"linux" "1064"
"mac" "1064"
}
"m_checkAttackTime" // float
"m_painTime" // float
{
"type" "float"
@ -46,40 +37,49 @@
"mac" "1068"
}
"m_lastAttackCheck" // BOOL
"m_checkAttackTime" // float
{
"type" "integer"
"type" "float"
"windows" "1052"
"linux" "1072"
"mac" "1072"
}
"m_angles" // Vector
"m_lastAttackCheck" // BOOL
{
"type" "vector"
"type" "integer"
"windows" "1056"
"linux" "1076"
"mac" "1076"
}
"m_angles" // Vector
{
"type" "vector"
"windows" "1060"
"linux" "1080"
"mac" "1080"
}
"m_origin" // Vector
{
"type" "vector"
"windows" "1068"
"linux" "1088"
"mac" "1088"
"windows" "1072"
"linux" "1092"
"mac" "1092"
}
"m_flPlayerDamage" // float
{
"type" "float"
"windows" "1080"
"linux" "1100"
"mac" "1100"
"windows" "1084"
"linux" "1104"
"mac" "1104"
}
}
}

View File

@ -23,21 +23,12 @@
{
"type" "float"
"windows" "972"
"linux" "992"
"mac" "992"
}
"m_flNextPainTime" // float
{
"type" "float"
"windows" "976"
"linux" "996"
"mac" "996"
}
"m_flLastEnemySightTime" // float
"m_flNextPainTime" // float
{
"type" "float"
@ -46,25 +37,25 @@
"mac" "1000"
}
"m_vecTossVelocity" // Vector
"m_flLastEnemySightTime" // float
{
"type" "vector"
"type" "float"
"windows" "984"
"linux" "1004"
"mac" "1004"
}
"m_fThrowGrenade" // BOOL
"m_vecTossVelocity" // Vector
{
"type" "integer"
"type" "vector"
"windows" "996"
"linux" "1016"
"mac" "1016"
"windows" "988"
"linux" "1008"
"mac" "1008"
}
"m_fStanding" // BOOL
"m_fThrowGrenade" // BOOL
{
"type" "integer"
@ -73,7 +64,7 @@
"mac" "1020"
}
"m_fFirstEncounter" // BOOL
"m_fStanding" // BOOL
{
"type" "integer"
@ -82,7 +73,7 @@
"mac" "1024"
}
"m_cClipSize" // int
"m_fFirstEncounter" // BOOL
{
"type" "integer"
@ -91,7 +82,7 @@
"mac" "1028"
}
"m_voicePitch" // int
"m_cClipSize" // int
{
"type" "integer"
@ -100,7 +91,7 @@
"mac" "1032"
}
"m_iBrassShell" // int
"m_voicePitch" // int
{
"type" "integer"
@ -109,7 +100,7 @@
"mac" "1036"
}
"m_iSentence" // int
"m_iBrassShell" // int
{
"type" "integer"
@ -117,6 +108,15 @@
"linux" "1040"
"mac" "1040"
}
"m_iSentence" // int
{
"type" "integer"
"windows" "1024"
"linux" "1044"
"mac" "1044"
}
}
}
}

View File

@ -23,21 +23,12 @@
{
"type" "float"
"windows" "972"
"linux" "992"
"mac" "992"
}
"m_flNextPainTime" // float
{
"type" "float"
"windows" "976"
"linux" "996"
"mac" "996"
}
"m_flLastEnemySightTime" // float
"m_flNextPainTime" // float
{
"type" "float"
@ -46,25 +37,25 @@
"mac" "1000"
}
"m_vecTossVelocity" // Vector
"m_flLastEnemySightTime" // float
{
"type" "vector"
"type" "float"
"windows" "984"
"linux" "1004"
"mac" "1004"
}
"m_fThrowGrenade" // BOOL
"m_vecTossVelocity" // Vector
{
"type" "integer"
"type" "vector"
"windows" "996"
"linux" "1016"
"mac" "1016"
"windows" "988"
"linux" "1008"
"mac" "1008"
}
"m_fStanding" // BOOL
"m_fThrowGrenade" // BOOL
{
"type" "integer"
@ -73,7 +64,7 @@
"mac" "1020"
}
"m_fFirstEncounter" // BOOL
"m_fStanding" // BOOL
{
"type" "integer"
@ -82,7 +73,7 @@
"mac" "1024"
}
"m_cClipSize" // int
"m_fFirstEncounter" // BOOL
{
"type" "integer"
@ -91,7 +82,7 @@
"mac" "1028"
}
"m_voicePitch" // int
"m_cClipSize" // int
{
"type" "integer"
@ -100,7 +91,7 @@
"mac" "1032"
}
"m_iBrassShell" // int
"m_voicePitch" // int
{
"type" "integer"
@ -109,7 +100,7 @@
"mac" "1036"
}
"m_iSentence" // int
"m_iBrassShell" // int
{
"type" "integer"
@ -117,6 +108,15 @@
"linux" "1040"
"mac" "1040"
}
"m_iSentence" // int
{
"type" "integer"
"windows" "1024"
"linux" "1044"
"mac" "1044"
}
}
}
}

View File

@ -429,14 +429,23 @@
"mac" "928"
}
"m_iClass" // int
"m_flLastYawTime" // float
{
"type" "integer"
"type" "float"
"windows" "912"
"linux" "932"
"mac" "932"
}
"m_iClass" // int
{
"type" "integer"
"windows" "916"
"linux" "936"
"mac" "936"
}
}
}
}

View File

@ -23,39 +23,30 @@
{
"type" "float"
"windows" "916"
"linux" "936"
"mac" "936"
"windows" "920"
"linux" "940"
"mac" "940"
}
"m_iSpin" // int
{
"type" "integer"
"windows" "920"
"linux" "940"
"mac" "940"
"windows" "924"
"linux" "944"
"mac" "944"
}
"m_pEyeGlow" // CSprite*
{
"type" "classptr"
"windows" "924"
"linux" "944"
"mac" "944"
}
"m_eyeBrightness" // int
{
"type" "integer"
"windows" "928"
"linux" "948"
"mac" "948"
}
"m_iDeployHeight" // int
"m_eyeBrightness" // int
{
"type" "integer"
@ -64,7 +55,7 @@
"mac" "952"
}
"m_iRetractHeight" // int
"m_iDeployHeight" // int
{
"type" "integer"
@ -73,7 +64,7 @@
"mac" "956"
}
"m_iMinPitch" // int
"m_iRetractHeight" // int
{
"type" "integer"
@ -82,7 +73,7 @@
"mac" "960"
}
"m_iBaseTurnRate" // int
"m_iMinPitch" // int
{
"type" "integer"
@ -91,25 +82,25 @@
"mac" "964"
}
"m_fTurnRate" // float
"m_iBaseTurnRate" // int
{
"type" "float"
"type" "integer"
"windows" "948"
"linux" "968"
"mac" "968"
}
"m_iOrientation" // int
"m_fTurnRate" // float
{
"type" "integer"
"type" "float"
"windows" "952"
"linux" "972"
"mac" "972"
}
"m_iOn" // int
"m_iOrientation" // int
{
"type" "integer"
@ -118,7 +109,7 @@
"mac" "976"
}
"m_fBeserk" // int
"m_iOn" // int
{
"type" "integer"
@ -127,7 +118,7 @@
"mac" "980"
}
"m_iAutoStart" // int
"m_fBeserk" // int
{
"type" "integer"
@ -136,25 +127,25 @@
"mac" "984"
}
"m_vecLastSight" // Vector
"m_iAutoStart" // int
{
"type" "vector"
"type" "integer"
"windows" "968"
"linux" "988"
"mac" "988"
}
"m_flLastSight" // float
"m_vecLastSight" // Vector
{
"type" "float"
"type" "vector"
"windows" "980"
"linux" "1000"
"mac" "1000"
"windows" "972"
"linux" "992"
"mac" "992"
}
"m_flMaxWait" // float
"m_flLastSight" // float
{
"type" "float"
@ -163,58 +154,67 @@
"mac" "1004"
}
"m_iSearchSpeed" // int
"m_flMaxWait" // float
{
"type" "integer"
"type" "float"
"windows" "988"
"linux" "1008"
"mac" "1008"
}
"m_flStartYaw" // float
"m_iSearchSpeed" // int
{
"type" "float"
"type" "integer"
"windows" "992"
"linux" "1012"
"mac" "1012"
}
"m_vecCurAngles" // Vector
"m_flStartYaw" // float
{
"type" "vector"
"type" "float"
"windows" "996"
"linux" "1016"
"mac" "1016"
}
"m_vecCurAngles" // Vector
{
"type" "vector"
"windows" "1000"
"linux" "1020"
"mac" "1020"
}
"m_vecGoalAngles" // Vector
{
"type" "vector"
"windows" "1008"
"linux" "1028"
"mac" "1028"
"windows" "1012"
"linux" "1032"
"mac" "1032"
}
"m_flPingTime" // float
{
"type" "float"
"windows" "1020"
"linux" "1040"
"mac" "1040"
"windows" "1024"
"linux" "1044"
"mac" "1044"
}
"m_flSpinUpTime" // float
{
"type" "float"
"windows" "1024"
"linux" "1044"
"mac" "1044"
"windows" "1028"
"linux" "1048"
"mac" "1048"
}
}
}

View File

@ -23,21 +23,12 @@
{
"type" "integer"
"windows" "916"
"linux" "936"
"mac" "936"
}
"m_iszIdle" // int
{
"type" "integer"
"windows" "920"
"linux" "940"
"mac" "940"
}
"m_iszPlay" // int
"m_iszIdle" // int
{
"type" "integer"
@ -46,7 +37,7 @@
"mac" "944"
}
"m_iszEntity" // int
"m_iszPlay" // int
{
"type" "integer"
@ -55,7 +46,7 @@
"mac" "948"
}
"m_iszAttack" // int
"m_iszEntity" // int
{
"type" "integer"
@ -64,7 +55,7 @@
"mac" "952"
}
"m_iszFireOnBegin" // int
"m_iszAttack" // int
{
"type" "integer"
@ -73,7 +64,7 @@
"mac" "956"
}
"m_fMoveTo" // int
"m_iszFireOnBegin" // int
{
"type" "integer"
@ -82,7 +73,7 @@
"mac" "960"
}
"m_fTurnType" // int
"m_fMoveTo" // int
{
"type" "integer"
@ -91,7 +82,7 @@
"mac" "964"
}
"m_fAction" // int
"m_fTurnType" // int
{
"type" "integer"
@ -100,7 +91,7 @@
"mac" "968"
}
"m_iFinishSchedule" // int
"m_fAction" // int
{
"type" "integer"
@ -109,52 +100,52 @@
"mac" "972"
}
"m_flRadius" // float
"m_iFinishSchedule" // int
{
"type" "float"
"type" "integer"
"windows" "956"
"linux" "976"
"mac" "976"
}
"m_iDelay" // int
"m_flRadius" // float
{
"type" "integer"
"type" "float"
"windows" "960"
"linux" "980"
"mac" "980"
}
"m_startTime" // float
"m_iDelay" // int
{
"type" "float"
"type" "integer"
"windows" "964"
"linux" "984"
"mac" "984"
}
"m_saved_m_hTargetEnt" // EHANDLE
"m_startTime" // float
{
"type" "ehandle"
"type" "float"
"windows" "968"
"linux" "988"
"mac" "988"
}
"m_saved_m_pGoalEnt" // int
"m_saved_m_hTargetEnt" // EHANDLE
{
"type" "integer"
"type" "ehandle"
"windows" "976"
"linux" "996"
"mac" "996"
"windows" "972"
"linux" "992"
"mac" "992"
}
"m_saved_movetype" // int
"m_saved_m_pGoalEnt" // int
{
"type" "integer"
@ -163,7 +154,7 @@
"mac" "1000"
}
"m_saved_solid" // int
"m_saved_movetype" // int
{
"type" "integer"
@ -172,7 +163,7 @@
"mac" "1004"
}
"m_saved_effects" // int
"m_saved_solid" // int
{
"type" "integer"
@ -181,7 +172,7 @@
"mac" "1008"
}
"m_interruptable" // BOOL
"m_saved_effects" // int
{
"type" "integer"
@ -189,6 +180,15 @@
"linux" "1012"
"mac" "1012"
}
"m_interruptable" // BOOL
{
"type" "integer"
"windows" "996"
"linux" "1016"
"mac" "1016"
}
}
}
}

View File

@ -23,21 +23,12 @@
{
"type" "float"
"windows" "972"
"linux" "992"
"mac" "992"
}
"m_flShootTime" // float
{
"type" "float"
"windows" "976"
"linux" "996"
"mac" "996"
}
"m_flShootEnd" // float
"m_flShootTime" // float
{
"type" "float"
@ -46,14 +37,23 @@
"mac" "1000"
}
"m_flShootEnd" // float
{
"type" "float"
"windows" "984"
"linux" "1004"
"mac" "1004"
}
"m_pBall" // CSprite*[2]
{
"type" "classptr"
"size" "2"
"windows" "984"
"linux" "1004"
"mac" "1004"
"windows" "988"
"linux" "1008"
"mac" "1008"
}
"m_iBall" // int[2]
@ -61,9 +61,9 @@
"type" "integer"
"size" "2"
"windows" "992"
"linux" "1012"
"mac" "1012"
"windows" "996"
"linux" "1016"
"mac" "1016"
}
"m_iBallTime" // float[2]
@ -71,9 +71,9 @@
"type" "float"
"size" "2"
"windows" "1000"
"linux" "1020"
"mac" "1020"
"windows" "1004"
"linux" "1024"
"mac" "1024"
}
"m_iBallCurrent" // int[2]
@ -81,36 +81,36 @@
"type" "integer"
"size" "2"
"windows" "1008"
"linux" "1028"
"mac" "1028"
"windows" "1012"
"linux" "1032"
"mac" "1032"
}
"m_vecEstVelocity" // Vector
{
"type" "vector"
"windows" "1016"
"linux" "1036"
"mac" "1036"
"windows" "1020"
"linux" "1040"
"mac" "1040"
}
"m_velocity" // Vector
{
"type" "vector"
"windows" "1028"
"linux" "1048"
"mac" "1048"
"windows" "1032"
"linux" "1052"
"mac" "1052"
}
"m_fInCombat" // int
{
"type" "integer"
"windows" "1040"
"linux" "1060"
"mac" "1060"
"windows" "1044"
"linux" "1064"
"mac" "1064"
}
}
}

View File

@ -23,36 +23,36 @@
{
"type" "integer"
"windows" "916"
"linux" "936"
"mac" "936"
"windows" "920"
"linux" "940"
"mac" "940"
}
"m_flNextAttack" // int
{
"type" "integer"
"windows" "920"
"linux" "940"
"mac" "940"
"windows" "924"
"linux" "944"
"mac" "944"
}
"m_vecIdeal" // Vector
{
"type" "vector"
"windows" "924"
"linux" "944"
"mac" "944"
"windows" "928"
"linux" "948"
"mac" "948"
}
"m_hOwner" // EHANDLE
{
"type" "ehandle"
"windows" "936"
"linux" "956"
"mac" "956"
"windows" "940"
"linux" "960"
"mac" "960"
}
}
}

View File

@ -23,9 +23,9 @@
{
"type" "ehandle"
"windows" "916"
"linux" "936"
"mac" "936"
"windows" "920"
"linux" "940"
"mac" "940"
}
}
}

View File

@ -23,9 +23,9 @@
{
"type" "integer"
"windows" "916"
"linux" "936"
"mac" "936"
"windows" "920"
"linux" "940"
"mac" "940"
}
}
}

View File

@ -23,9 +23,9 @@
{
"type" "integer"
"windows" "916"
"linux" "936"
"mac" "936"
"windows" "920"
"linux" "940"
"mac" "940"
}
}
}

View File

@ -23,9 +23,9 @@
{
"type" "integer"
"windows" "916"
"linux" "936"
"mac" "936"
"windows" "920"
"linux" "940"
"mac" "940"
}
}
}

View File

@ -23,9 +23,9 @@
{
"type" "integer"
"windows" "916"
"linux" "936"
"mac" "936"
"windows" "920"
"linux" "940"
"mac" "940"
}
}
}

View File

@ -23,18 +23,18 @@
{
"type" "integer"
"windows" "916"
"linux" "936"
"mac" "936"
"windows" "920"
"linux" "940"
"mac" "940"
}
"m_spriteScale" // int
{
"type" "integer"
"windows" "920"
"linux" "940"
"mac" "940"
"windows" "924"
"linux" "944"
"mac" "944"
}
}
}

View File

@ -23,21 +23,12 @@
{
"type" "integer"
"windows" "916"
"linux" "936"
"mac" "936"
}
"m_flClipTime" // int
{
"type" "integer"
"windows" "920"
"linux" "940"
"mac" "940"
}
"m_iOldMoveType" // int
"m_flClipTime" // int
{
"type" "integer"
@ -46,7 +37,7 @@
"mac" "944"
}
"m_iBodyGibs" // int
"m_iOldMoveType" // int
{
"type" "integer"
@ -55,7 +46,7 @@
"mac" "948"
}
"m_fRegisteredSound" // BOOL
"m_iBodyGibs" // int
{
"type" "integer"
@ -63,6 +54,15 @@
"linux" "952"
"mac" "952"
}
"m_fRegisteredSound" // BOOL
{
"type" "integer"
"windows" "936"
"linux" "956"
"mac" "956"
}
}
}
}

View File

@ -23,9 +23,9 @@
{
"type" "integer"
"windows" "916"
"linux" "936"
"mac" "936"
"windows" "920"
"linux" "940"
"mac" "940"
}
}
}

View File

@ -23,9 +23,9 @@
{
"type" "integer"
"windows" "936"
"linux" "956"
"mac" "956"
"windows" "940"
"linux" "960"
"mac" "960"
}
}
}

View File

@ -23,36 +23,36 @@
{
"type" "float"
"windows" "916"
"linux" "936"
"mac" "936"
"windows" "920"
"linux" "940"
"mac" "940"
}
"m_flNextSmellTime" // float
{
"type" "float"
"windows" "920"
"linux" "940"
"mac" "940"
"windows" "924"
"linux" "944"
"mac" "944"
}
"m_fLightHacked" // BOOL
{
"type" "integer"
"windows" "924"
"linux" "944"
"mac" "944"
"windows" "928"
"linux" "948"
"mac" "948"
}
"m_iMode" // int
{
"type" "integer"
"windows" "928"
"linux" "948"
"mac" "948"
"windows" "932"
"linux" "952"
"mac" "952"
}
}
}

View File

@ -23,36 +23,36 @@
{
"type" "float"
"windows" "916"
"linux" "936"
"mac" "936"
"windows" "920"
"linux" "940"
"mac" "940"
}
"m_flNextSmellTime" // float
{
"type" "float"
"windows" "920"
"linux" "940"
"mac" "940"
"windows" "924"
"linux" "944"
"mac" "944"
}
"m_fLightHacked" // BOOL
{
"type" "integer"
"windows" "924"
"linux" "944"
"mac" "944"
"windows" "928"
"linux" "948"
"mac" "948"
}
"m_iMode" // int
{
"type" "integer"
"windows" "928"
"linux" "948"
"mac" "948"
"windows" "932"
"linux" "952"
"mac" "952"
}
}
}

View File

@ -23,21 +23,12 @@
{
"type" "integer"
"windows" "1040"
"linux" "1060"
"mac" "1060"
}
"m_painTime" // float
{
"type" "float"
"windows" "1044"
"linux" "1064"
"mac" "1064"
}
"m_checkAttackTime" // float
"m_painTime" // float
{
"type" "float"
@ -46,14 +37,23 @@
"mac" "1068"
}
"m_lastAttackCheck" // BOOL
"m_checkAttackTime" // float
{
"type" "integer"
"type" "float"
"windows" "1052"
"linux" "1072"
"mac" "1072"
}
"m_lastAttackCheck" // BOOL
{
"type" "integer"
"windows" "1056"
"linux" "1076"
"mac" "1076"
}
}
}
}

View File

@ -23,9 +23,9 @@
{
"type" "ehandle"
"windows" "916"
"linux" "936"
"mac" "936"
"windows" "920"
"linux" "940"
"mac" "940"
}
"m_hSquadMember" // EHANDLE[4]
@ -33,45 +33,45 @@
"type" "ehandle"
"size" "4"
"windows" "924"
"linux" "944"
"mac" "944"
"windows" "928"
"linux" "948"
"mac" "948"
}
"m_afSquadSlots" // int
{
"type" "integer"
"windows" "956"
"linux" "976"
"mac" "976"
"windows" "960"
"linux" "980"
"mac" "980"
}
"m_flLastEnemySightTime" // float
{
"type" "float"
"windows" "960"
"linux" "980"
"mac" "980"
"windows" "964"
"linux" "984"
"mac" "984"
}
"m_fEnemyEluded" // BOOL
{
"type" "integer"
"windows" "964"
"linux" "984"
"mac" "984"
"windows" "968"
"linux" "988"
"mac" "988"
}
"m_iMySlot" // int
{
"type" "integer"
"windows" "968"
"linux" "988"
"mac" "988"
"windows" "972"
"linux" "992"
"mac" "992"
}
}
}

View File

@ -23,21 +23,12 @@
{
"type" "integer"
"windows" "916"
"linux" "936"
"mac" "936"
}
"m_nSpeak" // int
{
"type" "integer"
"windows" "920"
"linux" "940"
"mac" "940"
}
"m_voicePitch" // int
"m_nSpeak" // int
{
"type" "integer"
@ -46,35 +37,35 @@
"mac" "944"
}
"m_szGrp" // const char*[19]
"m_voicePitch" // int
{
"type" "stringptr"
"size" "19"
"type" "integer"
"windows" "928"
"linux" "948"
"mac" "948"
}
"m_szGrp" // const char*[19]
{
"type" "stringptr"
"size" "19"
"windows" "932"
"linux" "952"
"mac" "952"
}
"m_useTime" // float
{
"type" "float"
"windows" "1004"
"linux" "1024"
"mac" "1024"
}
"m_iszUse" // int
{
"type" "integer"
"windows" "1008"
"linux" "1028"
"mac" "1028"
}
"m_iszUnUse" // int
"m_iszUse" // int
{
"type" "integer"
@ -83,7 +74,7 @@
"mac" "1032"
}
"m_iszDecline" // int
"m_iszUnUse" // int
{
"type" "integer"
@ -92,7 +83,7 @@
"mac" "1036"
}
"m_iszSpeakAs" // int
"m_iszDecline" // int
{
"type" "integer"
@ -101,16 +92,16 @@
"mac" "1040"
}
"m_flLastSaidSmelled" // float
"m_iszSpeakAs" // int
{
"type" "float"
"type" "integer"
"windows" "1024"
"linux" "1044"
"mac" "1044"
}
"m_flStopTalkTime" // float
"m_flLastSaidSmelled" // float
{
"type" "float"
@ -119,14 +110,23 @@
"mac" "1048"
}
"m_hTalkTarget" // EHANDLE
"m_flStopTalkTime" // float
{
"type" "ehandle"
"type" "float"
"windows" "1032"
"linux" "1052"
"mac" "1052"
}
"m_hTalkTarget" // EHANDLE
{
"type" "ehandle"
"windows" "1036"
"linux" "1056"
"mac" "1056"
}
}
}
}

View File

@ -23,9 +23,9 @@
{
"type" "vector"
"windows" "916"
"linux" "936"
"mac" "936"
"windows" "920"
"linux" "940"
"mac" "940"
}
}
}

View File

@ -23,9 +23,9 @@
{
"type" "integer"
"windows" "1028"
"linux" "1048"
"mac" "1048"
"windows" "1032"
"linux" "1052"
"mac" "1052"
}
}
}

View File

@ -23,9 +23,9 @@
{
"type" "integer"
"windows" "916"
"linux" "936"
"mac" "936"
"windows" "920"
"linux" "940"
"mac" "940"
}
}
}

View File

@ -23,21 +23,12 @@
{
"type" "integer"
"windows" "764"
"linux" "784"
"mac" "784"
}
"m_flNextHornetAttackCheck" // float
{
"type" "float"
"windows" "768"
"linux" "788"
"mac" "788"
}
"m_flNextPainTime" // float
"m_flNextHornetAttackCheck" // float
{
"type" "float"
@ -46,7 +37,7 @@
"mac" "792"
}
"m_flNextSpeakTime" // float
"m_flNextPainTime" // float
{
"type" "float"
@ -55,7 +46,7 @@
"mac" "796"
}
"m_flNextWordTime" // float
"m_flNextSpeakTime" // float
{
"type" "float"
@ -64,14 +55,23 @@
"mac" "800"
}
"m_iLastWord" // int
"m_flNextWordTime" // float
{
"type" "integer"
"type" "float"
"windows" "784"
"linux" "804"
"mac" "804"
}
"m_iLastWord" // int
{
"type" "integer"
"windows" "788"
"linux" "808"
"mac" "808"
}
}
}
}

View File

@ -23,9 +23,9 @@
{
"type" "integer"
"windows" "712"
"linux" "732"
"mac" "732"
"windows" "716"
"linux" "736"
"mac" "736"
}
}
}

View File

@ -23,21 +23,12 @@
{
"type" "integer"
"windows" "708"
"linux" "728"
"mac" "728"
}
"m_flForce" // float
{
"type" "float"
"windows" "712"
"linux" "732"
"mac" "732"
}
"m_flNextRocket" // float
"m_flForce" // float
{
"type" "float"
@ -46,88 +37,88 @@
"mac" "736"
}
"m_vecTarget" // Vector
"m_flNextRocket" // float
{
"type" "vector"
"type" "float"
"windows" "720"
"linux" "740"
"mac" "740"
}
"m_vecTarget" // Vector
{
"type" "vector"
"windows" "724"
"linux" "744"
"mac" "744"
}
"m_posTarget" // Vector
{
"type" "vector"
"windows" "732"
"linux" "752"
"mac" "752"
"windows" "736"
"linux" "756"
"mac" "756"
}
"m_vecDesired" // Vector
{
"type" "vector"
"windows" "744"
"linux" "764"
"mac" "764"
"windows" "748"
"linux" "768"
"mac" "768"
}
"m_posDesired" // Vector
{
"type" "vector"
"windows" "756"
"linux" "776"
"mac" "776"
"windows" "760"
"linux" "780"
"mac" "780"
}
"m_vecGoal" // Vector
{
"type" "vector"
"windows" "768"
"linux" "788"
"mac" "788"
"windows" "772"
"linux" "792"
"mac" "792"
}
"m_angGun" // Vector
{
"type" "vector"
"windows" "780"
"linux" "800"
"mac" "800"
"windows" "784"
"linux" "804"
"mac" "804"
}
"m_flLastSeen" // float
{
"type" "float"
"windows" "792"
"linux" "812"
"mac" "812"
}
"m_flPrevSeen" // float
{
"type" "float"
"windows" "796"
"linux" "816"
"mac" "816"
}
"m_iSoundState" // int
"m_flPrevSeen" // float
{
"type" "integer"
"type" "float"
"windows" "800"
"linux" "820"
"mac" "820"
}
"m_iSpriteTexture" // int
"m_iSoundState" // int
{
"type" "integer"
@ -136,7 +127,7 @@
"mac" "824"
}
"m_iExplode" // int
"m_iSpriteTexture" // int
{
"type" "integer"
@ -145,7 +136,7 @@
"mac" "828"
}
"m_iBodyGibs" // int
"m_iExplode" // int
{
"type" "integer"
@ -154,32 +145,41 @@
"mac" "832"
}
"m_flGoalSpeed" // float
"m_iBodyGibs" // int
{
"type" "float"
"type" "integer"
"windows" "816"
"linux" "836"
"mac" "836"
}
"m_iDoSmokePuff" // int
"m_flGoalSpeed" // float
{
"type" "integer"
"type" "float"
"windows" "820"
"linux" "840"
"mac" "840"
}
"m_pBeam" // CBeam*
"m_iDoSmokePuff" // int
{
"type" "classptr"
"type" "integer"
"windows" "824"
"linux" "844"
"mac" "844"
}
"m_pBeam" // CBeam*
{
"type" "classptr"
"windows" "828"
"linux" "848"
"mac" "848"
}
}
}
}

View File

@ -23,18 +23,18 @@
{
"type" "integer"
"windows" "712"
"linux" "732"
"mac" "732"
"windows" "716"
"linux" "736"
"mac" "736"
}
"m_vecForward" // Vector
{
"type" "vector"
"windows" "716"
"linux" "736"
"mac" "736"
"windows" "720"
"linux" "740"
"mac" "740"
}
}
}

View File

@ -23,30 +23,21 @@
{
"type" "float"
"windows" "708"
"linux" "728"
"mac" "728"
"windows" "712"
"linux" "732"
"mac" "732"
}
"m_flKillVictimTime" // float
{
"type" "float"
"windows" "712"
"linux" "732"
"mac" "732"
}
"m_cGibs" // int
{
"type" "integer"
"windows" "716"
"linux" "736"
"mac" "736"
}
"m_fTongueExtended" // BOOL
"m_cGibs" // int
{
"type" "integer"
@ -55,7 +46,7 @@
"mac" "740"
}
"m_fLiftingPrey" // BOOL
"m_fTongueExtended" // BOOL
{
"type" "integer"
@ -64,14 +55,23 @@
"mac" "744"
}
"m_flTongueAdj" // float
"m_fLiftingPrey" // BOOL
{
"type" "float"
"type" "integer"
"windows" "728"
"linux" "748"
"mac" "748"
}
"m_flTongueAdj" // float
{
"type" "float"
"windows" "732"
"linux" "752"
"mac" "752"
}
}
}
}

View File

@ -23,21 +23,12 @@
{
"type" "integer"
"windows" "824"
"linux" "844"
"mac" "844"
}
"m_painTime" // float
{
"type" "float"
"windows" "828"
"linux" "848"
"mac" "848"
}
"m_checkAttackTime" // float
"m_painTime" // float
{
"type" "float"
@ -46,23 +37,32 @@
"mac" "852"
}
"m_lastAttackCheck" // BOOL
"m_checkAttackTime" // float
{
"type" "integer"
"type" "float"
"windows" "836"
"linux" "856"
"mac" "856"
}
"m_flPlayerDamage" // float
"m_lastAttackCheck" // BOOL
{
"type" "float"
"type" "integer"
"windows" "840"
"linux" "860"
"mac" "860"
}
"m_flPlayerDamage" // float
{
"type" "float"
"windows" "844"
"linux" "864"
"mac" "864"
}
}
}
}

View File

@ -55,11 +55,47 @@
"mac" "16"
}
"m_pfnThink" // (*__pfn)(CBaseEntity*)
{
"type" "function"
"windows" "20"
"linux" "20"
"mac" "20"
}
"m_pfnTouch" // (*__pfn)(CBaseEntity*, CBaseEntity*)
{
"type" "function"
"windows" "24"
"linux" "28"
"mac" "28"
}
"m_pfnUse" // (*__pfn)(CBaseEntity*, CBaseEntity*, CBaseEntity*, USE_TYPE, float)
{
"type" "function"
"windows" "28"
"linux" "36"
"mac" "36"
}
"m_pfnBlocked" // (*__pfn)(CBaseEntity*, CBaseEntity*)
{
"type" "function"
"windows" "32"
"linux" "44"
"mac" "44"
}
"ammo_9mm" // int
{
"type" "integer"
"windows" "52"
"windows" "36"
"linux" "52"
"mac" "52"
}
@ -68,7 +104,7 @@
{
"type" "integer"
"windows" "56"
"windows" "40"
"linux" "56"
"mac" "56"
}
@ -77,7 +113,7 @@
{
"type" "integer"
"windows" "60"
"windows" "44"
"linux" "60"
"mac" "60"
}
@ -86,7 +122,7 @@
{
"type" "integer"
"windows" "64"
"windows" "48"
"linux" "64"
"mac" "64"
}
@ -95,7 +131,7 @@
{
"type" "integer"
"windows" "68"
"windows" "52"
"linux" "68"
"mac" "68"
}
@ -104,7 +140,7 @@
{
"type" "integer"
"windows" "72"
"windows" "56"
"linux" "72"
"mac" "72"
}
@ -113,7 +149,7 @@
{
"type" "integer"
"windows" "76"
"windows" "60"
"linux" "76"
"mac" "76"
}
@ -122,7 +158,7 @@
{
"type" "integer"
"windows" "80"
"windows" "64"
"linux" "80"
"mac" "80"
}
@ -131,7 +167,7 @@
{
"type" "integer"
"windows" "84"
"windows" "68"
"linux" "84"
"mac" "84"
}
@ -140,7 +176,7 @@
{
"type" "integer"
"windows" "88"
"windows" "72"
"linux" "88"
"mac" "88"
}
@ -149,7 +185,7 @@
{
"type" "float"
"windows" "92"
"windows" "76"
"linux" "92"
"mac" "92"
}
@ -158,7 +194,7 @@
{
"type" "float"
"windows" "96"
"windows" "80"
"linux" "96"
"mac" "96"
}
@ -167,7 +203,7 @@
{
"type" "integer"
"windows" "100"
"windows" "84"
"linux" "100"
"mac" "100"
}
@ -176,7 +212,7 @@
{
"type" "integer"
"windows" "104"
"windows" "88"
"linux" "104"
"mac" "104"
}
@ -185,7 +221,7 @@
{
"type" "integer"
"windows" "108"
"windows" "92"
"linux" "108"
"mac" "108"
}

View File

@ -491,6 +491,15 @@
"linux" "724"
"mac" "724"
}
"m_flLastYawTime" // float
{
"type" "float"
"windows" "708"
"linux" "728"
"mac" "728"
}
}
}
}

View File

@ -145,11 +145,20 @@
"mac" "224"
}
"m_pfnCallWhenMoveDone" // (*__pfn)(CBaseToggle*)
{
"type" "function"
"windows" "216"
"linux" "232"
"mac" "232"
}
"m_vecFinalDest" // Vector
{
"type" "vector"
"windows" "224"
"windows" "220"
"linux" "240"
"mac" "240"
}
@ -158,7 +167,7 @@
{
"type" "vector"
"windows" "236"
"windows" "232"
"linux" "252"
"mac" "252"
}
@ -167,7 +176,7 @@
{
"type" "integer"
"windows" "248"
"windows" "244"
"linux" "264"
"mac" "264"
}
@ -176,7 +185,7 @@
{
"type" "stringint"
"windows" "252"
"windows" "248"
"linux" "268"
"mac" "268"
}

View File

@ -23,39 +23,30 @@
{
"type" "float"
"windows" "708"
"linux" "728"
"mac" "728"
"windows" "712"
"linux" "732"
"mac" "732"
}
"m_iSpin" // int
{
"type" "integer"
"windows" "712"
"linux" "732"
"mac" "732"
"windows" "716"
"linux" "736"
"mac" "736"
}
"m_pEyeGlow" // CSprite*
{
"type" "classptr"
"windows" "716"
"linux" "736"
"mac" "736"
}
"m_eyeBrightness" // int
{
"type" "integer"
"windows" "720"
"linux" "740"
"mac" "740"
}
"m_iDeployHeight" // int
"m_eyeBrightness" // int
{
"type" "integer"
@ -64,7 +55,7 @@
"mac" "744"
}
"m_iRetractHeight" // int
"m_iDeployHeight" // int
{
"type" "integer"
@ -73,7 +64,7 @@
"mac" "748"
}
"m_iMinPitch" // int
"m_iRetractHeight" // int
{
"type" "integer"
@ -82,7 +73,7 @@
"mac" "752"
}
"m_iBaseTurnRate" // int
"m_iMinPitch" // int
{
"type" "integer"
@ -91,25 +82,25 @@
"mac" "756"
}
"m_fTurnRate" // float
"m_iBaseTurnRate" // int
{
"type" "float"
"type" "integer"
"windows" "740"
"linux" "760"
"mac" "760"
}
"m_iOrientation" // int
"m_fTurnRate" // float
{
"type" "integer"
"type" "float"
"windows" "744"
"linux" "764"
"mac" "764"
}
"m_iOn" // int
"m_iOrientation" // int
{
"type" "integer"
@ -118,7 +109,7 @@
"mac" "768"
}
"m_fBeserk" // int
"m_iOn" // int
{
"type" "integer"
@ -127,7 +118,7 @@
"mac" "772"
}
"m_iAutoStart" // int
"m_fBeserk" // int
{
"type" "integer"
@ -136,25 +127,25 @@
"mac" "776"
}
"m_vecLastSight" // Vector
"m_iAutoStart" // int
{
"type" "vector"
"type" "integer"
"windows" "760"
"linux" "780"
"mac" "780"
}
"m_flLastSight" // float
"m_vecLastSight" // Vector
{
"type" "float"
"type" "vector"
"windows" "772"
"linux" "792"
"mac" "792"
"windows" "764"
"linux" "784"
"mac" "784"
}
"m_flMaxWait" // float
"m_flLastSight" // float
{
"type" "float"
@ -163,58 +154,67 @@
"mac" "796"
}
"m_iSearchSpeed" // int
"m_flMaxWait" // float
{
"type" "integer"
"type" "float"
"windows" "780"
"linux" "800"
"mac" "800"
}
"m_flStartYaw" // float
"m_iSearchSpeed" // int
{
"type" "float"
"type" "integer"
"windows" "784"
"linux" "804"
"mac" "804"
}
"m_vecCurAngles" // Vector
"m_flStartYaw" // float
{
"type" "vector"
"type" "float"
"windows" "788"
"linux" "808"
"mac" "808"
}
"m_vecCurAngles" // Vector
{
"type" "vector"
"windows" "792"
"linux" "812"
"mac" "812"
}
"m_vecGoalAngles" // Vector
{
"type" "vector"
"windows" "800"
"linux" "820"
"mac" "820"
"windows" "804"
"linux" "824"
"mac" "824"
}
"m_flPingTime" // float
{
"type" "float"
"windows" "812"
"linux" "832"
"mac" "832"
"windows" "816"
"linux" "836"
"mac" "836"
}
"m_flSpinUpTime" // float
{
"type" "float"
"windows" "816"
"linux" "836"
"mac" "836"
"windows" "820"
"linux" "840"
"mac" "840"
}
}
}

View File

@ -23,21 +23,12 @@
{
"type" "float"
"windows" "708"
"linux" "728"
"mac" "728"
}
"m_crabTime" // float
{
"type" "float"
"windows" "712"
"linux" "732"
"mac" "732"
}
"m_mortarTime" // float
"m_crabTime" // float
{
"type" "float"
@ -46,7 +37,7 @@
"mac" "736"
}
"m_painSoundTime" // float
"m_mortarTime" // float
{
"type" "float"
@ -55,14 +46,23 @@
"mac" "740"
}
"m_crabCount" // int
"m_painSoundTime" // float
{
"type" "integer"
"type" "float"
"windows" "724"
"linux" "744"
"mac" "744"
}
"m_crabCount" // int
{
"type" "integer"
"windows" "728"
"linux" "748"
"mac" "748"
}
}
}
}

View File

@ -23,27 +23,27 @@
{
"type" "integer"
"windows" "708"
"linux" "728"
"mac" "728"
"windows" "712"
"linux" "732"
"mac" "732"
}
"m_flLastHurtTime" // float
{
"type" "float"
"windows" "712"
"linux" "732"
"mac" "732"
"windows" "716"
"linux" "736"
"mac" "736"
}
"m_flNextSpitTime" // float
{
"type" "float"
"windows" "716"
"linux" "736"
"mac" "736"
"windows" "720"
"linux" "740"
"mac" "740"
}
}
}

View File

@ -23,21 +23,12 @@
{
"type" "integer"
"windows" "708"
"linux" "728"
"mac" "728"
}
"m_iszPlay" // int
{
"type" "integer"
"windows" "712"
"linux" "732"
"mac" "732"
}
"m_iszEntity" // int
"m_iszPlay" // int
{
"type" "integer"
@ -46,7 +37,7 @@
"mac" "736"
}
"m_fMoveTo" // int
"m_iszEntity" // int
{
"type" "integer"
@ -55,7 +46,7 @@
"mac" "740"
}
"m_iFinishSchedule" // int
"m_fMoveTo" // int
{
"type" "integer"
@ -64,16 +55,16 @@
"mac" "744"
}
"m_flRadius" // float
"m_iFinishSchedule" // int
{
"type" "float"
"type" "integer"
"windows" "728"
"linux" "748"
"mac" "748"
}
"m_flRepeat" // float
"m_flRadius" // float
{
"type" "float"
@ -82,34 +73,34 @@
"mac" "752"
}
"m_iDelay" // int
"m_flRepeat" // float
{
"type" "integer"
"type" "float"
"windows" "736"
"linux" "756"
"mac" "756"
}
"m_startTime" // float
"m_iDelay" // int
{
"type" "float"
"type" "integer"
"windows" "740"
"linux" "760"
"mac" "760"
}
"m_saved_movetype" // int
"m_startTime" // float
{
"type" "integer"
"type" "float"
"windows" "744"
"linux" "764"
"mac" "764"
}
"m_saved_solid" // int
"m_saved_movetype" // int
{
"type" "integer"
@ -118,7 +109,7 @@
"mac" "768"
}
"m_saved_effects" // int
"m_saved_solid" // int
{
"type" "integer"
@ -127,7 +118,7 @@
"mac" "772"
}
"m_interruptable" // BOOL
"m_saved_effects" // int
{
"type" "integer"
@ -135,6 +126,15 @@
"linux" "776"
"mac" "776"
}
"m_interruptable" // BOOL
{
"type" "integer"
"windows" "760"
"linux" "780"
"mac" "780"
}
}
}
}

View File

@ -23,27 +23,27 @@
{
"type" "float"
"windows" "824"
"linux" "844"
"mac" "844"
"windows" "828"
"linux" "848"
"mac" "848"
}
"m_healTime" // float
{
"type" "float"
"windows" "828"
"linux" "848"
"mac" "848"
"windows" "832"
"linux" "852"
"mac" "852"
}
"m_fearTime" // float
{
"type" "float"
"windows" "832"
"linux" "852"
"mac" "852"
"windows" "836"
"linux" "856"
"mac" "856"
}
}
}

View File

@ -23,21 +23,12 @@
{
"type" "float"
"windows" "764"
"linux" "784"
"mac" "784"
}
"m_flShootTime" // float
{
"type" "float"
"windows" "768"
"linux" "788"
"mac" "788"
}
"m_flShootEnd" // float
"m_flShootTime" // float
{
"type" "float"
@ -46,14 +37,23 @@
"mac" "792"
}
"m_flShootEnd" // float
{
"type" "float"
"windows" "776"
"linux" "796"
"mac" "796"
}
"m_pBall" // CSprite*[2]
{
"type" "classptr"
"size" "2"
"windows" "776"
"linux" "796"
"mac" "796"
"windows" "780"
"linux" "800"
"mac" "800"
}
"m_iBall" // int[2]
@ -61,9 +61,9 @@
"type" "integer"
"size" "2"
"windows" "784"
"linux" "804"
"mac" "804"
"windows" "788"
"linux" "808"
"mac" "808"
}
"m_iBallTime" // float[2]
@ -71,9 +71,9 @@
"type" "float"
"size" "2"
"windows" "792"
"linux" "812"
"mac" "812"
"windows" "796"
"linux" "816"
"mac" "816"
}
"m_iBallCurrent" // int[2]
@ -81,36 +81,36 @@
"type" "integer"
"size" "2"
"windows" "800"
"linux" "820"
"mac" "820"
"windows" "804"
"linux" "824"
"mac" "824"
}
"m_vecEstVelocity" // Vector
{
"type" "vector"
"windows" "808"
"linux" "828"
"mac" "828"
"windows" "812"
"linux" "832"
"mac" "832"
}
"m_velocity" // Vector
{
"type" "vector"
"windows" "820"
"linux" "840"
"mac" "840"
"windows" "824"
"linux" "844"
"mac" "844"
}
"m_fInCombat" // int
{
"type" "integer"
"windows" "832"
"linux" "852"
"mac" "852"
"windows" "836"
"linux" "856"
"mac" "856"
}
}
}

View File

@ -23,36 +23,36 @@
{
"type" "integer"
"windows" "708"
"linux" "728"
"mac" "728"
"windows" "712"
"linux" "732"
"mac" "732"
}
"m_flNextAttack" // int
{
"type" "integer"
"windows" "712"
"linux" "732"
"mac" "732"
"windows" "716"
"linux" "736"
"mac" "736"
}
"m_vecIdeal" // Vector
{
"type" "vector"
"windows" "716"
"linux" "736"
"mac" "736"
"windows" "720"
"linux" "740"
"mac" "740"
}
"m_hOwner" // EHANDLE
{
"type" "ehandle"
"windows" "728"
"linux" "748"
"mac" "748"
"windows" "732"
"linux" "752"
"mac" "752"
}
}
}

View File

@ -23,9 +23,9 @@
{
"type" "ehandle"
"windows" "708"
"linux" "728"
"mac" "728"
"windows" "712"
"linux" "732"
"mac" "732"
}
}
}

View File

@ -23,18 +23,18 @@
{
"type" "integer"
"windows" "708"
"linux" "728"
"mac" "728"
"windows" "712"
"linux" "732"
"mac" "732"
}
"m_iCyclerBody" // int
{
"type" "integer"
"windows" "712"
"linux" "732"
"mac" "732"
"windows" "716"
"linux" "736"
"mac" "736"
}
}
}

View File

@ -23,9 +23,9 @@
{
"type" "integer"
"windows" "708"
"linux" "728"
"mac" "728"
"windows" "712"
"linux" "732"
"mac" "732"
}
}
}

View File

@ -23,9 +23,9 @@
{
"type" "integer"
"windows" "708"
"linux" "728"
"mac" "728"
"windows" "712"
"linux" "732"
"mac" "732"
}
}
}

View File

@ -23,9 +23,9 @@
{
"type" "integer"
"windows" "708"
"linux" "728"
"mac" "728"
"windows" "712"
"linux" "732"
"mac" "732"
}
}
}

View File

@ -23,9 +23,9 @@
{
"type" "integer"
"windows" "708"
"linux" "728"
"mac" "728"
"windows" "712"
"linux" "732"
"mac" "732"
}
}
}

View File

@ -23,9 +23,9 @@
{
"type" "integer"
"windows" "708"
"linux" "728"
"mac" "728"
"windows" "712"
"linux" "732"
"mac" "732"
}
}
}

View File

@ -23,9 +23,9 @@
{
"type" "integer"
"windows" "708"
"linux" "728"
"mac" "728"
"windows" "712"
"linux" "732"
"mac" "732"
}
}
}

View File

@ -23,18 +23,18 @@
{
"type" "integer"
"windows" "708"
"linux" "728"
"mac" "728"
"windows" "712"
"linux" "732"
"mac" "732"
}
"m_iGruntHead" // int
{
"type" "integer"
"windows" "712"
"linux" "732"
"mac" "732"
"windows" "716"
"linux" "736"
"mac" "736"
}
}
}

View File

@ -23,9 +23,9 @@
{
"type" "integer"
"windows" "708"
"linux" "728"
"mac" "728"
"windows" "712"
"linux" "732"
"mac" "732"
}
}
}

View File

@ -23,9 +23,9 @@
{
"type" "integer"
"windows" "708"
"linux" "728"
"mac" "728"
"windows" "712"
"linux" "732"
"mac" "732"
}
}
}

View File

@ -23,9 +23,9 @@
{
"type" "integer"
"windows" "708"
"linux" "728"
"mac" "728"
"windows" "712"
"linux" "732"
"mac" "732"
}
}
}

View File

@ -23,9 +23,9 @@
{
"type" "integer"
"windows" "708"
"linux" "728"
"mac" "728"
"windows" "712"
"linux" "732"
"mac" "732"
}
}
}

View File

@ -23,9 +23,9 @@
{
"type" "integer"
"windows" "708"
"linux" "728"
"mac" "728"
"windows" "712"
"linux" "732"
"mac" "732"
}
}
}

View File

@ -23,9 +23,9 @@
{
"type" "integer"
"windows" "708"
"linux" "728"
"mac" "728"
"windows" "712"
"linux" "732"
"mac" "732"
}
}
}

View File

@ -23,9 +23,9 @@
{
"type" "integer"
"windows" "708"
"linux" "728"
"mac" "728"
"windows" "712"
"linux" "732"
"mac" "732"
}
}
}

View File

@ -23,21 +23,12 @@
{
"type" "integer"
"windows" "824"
"linux" "844"
"mac" "844"
}
"m_painTime" // float
{
"type" "float"
"windows" "828"
"linux" "848"
"mac" "848"
}
"m_checkAttackTime" // float
"m_painTime" // float
{
"type" "float"
@ -46,23 +37,32 @@
"mac" "852"
}
"m_lastAttackCheck" // BOOL
"m_checkAttackTime" // float
{
"type" "integer"
"type" "float"
"windows" "836"
"linux" "856"
"mac" "856"
}
"m_flPlayerDamage" // float
"m_lastAttackCheck" // BOOL
{
"type" "float"
"type" "integer"
"windows" "840"
"linux" "860"
"mac" "860"
}
"m_flPlayerDamage" // float
{
"type" "float"
"windows" "844"
"linux" "864"
"mac" "864"
}
}
}
}

View File

@ -23,18 +23,18 @@
{
"type" "integer"
"windows" "708"
"linux" "728"
"mac" "728"
"windows" "712"
"linux" "732"
"mac" "732"
}
"m_spriteScale" // int
{
"type" "integer"
"windows" "712"
"linux" "732"
"mac" "732"
"windows" "716"
"linux" "736"
"mac" "736"
}
}
}

View File

@ -23,30 +23,21 @@
{
"type" "classptr"
"windows" "708"
"linux" "728"
"mac" "728"
"windows" "712"
"linux" "732"
"mac" "732"
}
"m_pSquadNext" // CFlockingFlyer*
{
"type" "classptr"
"windows" "712"
"linux" "732"
"mac" "732"
}
"m_fTurning" // BOOL
{
"type" "integer"
"windows" "716"
"linux" "736"
"mac" "736"
}
"m_fCourseAdjust" // BOOL
"m_fTurning" // BOOL
{
"type" "integer"
@ -55,7 +46,7 @@
"mac" "740"
}
"m_fPathBlocked" // BOOL
"m_fCourseAdjust" // BOOL
{
"type" "integer"
@ -64,43 +55,43 @@
"mac" "744"
}
"m_vecReferencePoint" // Vector
"m_fPathBlocked" // BOOL
{
"type" "vector"
"type" "integer"
"windows" "728"
"linux" "748"
"mac" "748"
}
"m_vecReferencePoint" // Vector
{
"type" "vector"
"windows" "732"
"linux" "752"
"mac" "752"
}
"m_vecAdjustedVelocity" // Vector
{
"type" "vector"
"windows" "740"
"linux" "760"
"mac" "760"
"windows" "744"
"linux" "764"
"mac" "764"
}
"m_flGoalSpeed" // float
{
"type" "float"
"windows" "752"
"linux" "772"
"mac" "772"
}
"m_flLastBlockedTime" // float
{
"type" "float"
"windows" "756"
"linux" "776"
"mac" "776"
}
"m_flFakeBlockedTime" // float
"m_flLastBlockedTime" // float
{
"type" "float"
@ -109,7 +100,7 @@
"mac" "780"
}
"m_flAlertTime" // float
"m_flFakeBlockedTime" // float
{
"type" "float"
@ -118,7 +109,7 @@
"mac" "784"
}
"m_flFlockNextSoundTime" // float
"m_flAlertTime" // float
{
"type" "float"
@ -126,6 +117,15 @@
"linux" "788"
"mac" "788"
}
"m_flFlockNextSoundTime" // float
{
"type" "float"
"windows" "772"
"linux" "792"
"mac" "792"
}
}
}
}

View File

@ -23,18 +23,18 @@
{
"type" "integer"
"windows" "708"
"linux" "728"
"mac" "728"
"windows" "712"
"linux" "732"
"mac" "732"
}
"m_flFlockRadius" // float
{
"type" "float"
"windows" "712"
"linux" "732"
"mac" "732"
"windows" "716"
"linux" "736"
"mac" "736"
}
}
}

View File

@ -23,30 +23,21 @@
{
"type" "vector"
"windows" "708"
"linux" "728"
"mac" "728"
"windows" "712"
"linux" "732"
"mac" "732"
}
"m_flightSpeed" // float
{
"type" "float"
"windows" "720"
"linux" "740"
"mac" "740"
}
"m_stopTime" // float
{
"type" "float"
"windows" "724"
"linux" "744"
"mac" "744"
}
"m_momentum" // float
"m_stopTime" // float
{
"type" "float"
@ -55,14 +46,32 @@
"mac" "748"
}
"m_pFlapSound" // const char*
"m_momentum" // float
{
"type" "stringptr"
"type" "float"
"windows" "732"
"linux" "752"
"mac" "752"
}
"m_pFlapSound" // const char*
{
"type" "stringptr"
"windows" "736"
"linux" "756"
"mac" "756"
}
"m_flLastZYawTime" // float
{
"type" "float"
"windows" "740"
"linux" "760"
"mac" "760"
}
}
}
}

View File

@ -23,9 +23,9 @@
{
"type" "classptr"
"windows" "708"
"linux" "728"
"mac" "728"
"windows" "712"
"linux" "732"
"mac" "732"
}
"m_pFlame" // CBeam*[4]
@ -33,30 +33,21 @@
"type" "classptr"
"size" "4"
"windows" "712"
"linux" "732"
"mac" "732"
"windows" "716"
"linux" "736"
"mac" "736"
}
"m_eyeBrightness" // int
{
"type" "integer"
"windows" "728"
"linux" "748"
"mac" "748"
}
"m_seeTime" // float
{
"type" "float"
"windows" "732"
"linux" "752"
"mac" "752"
}
"m_flameTime" // float
"m_seeTime" // float
{
"type" "float"
@ -65,7 +56,7 @@
"mac" "756"
}
"m_painSoundTime" // float
"m_flameTime" // float
{
"type" "float"
@ -74,7 +65,7 @@
"mac" "760"
}
"m_streakTime" // float
"m_painSoundTime" // float
{
"type" "float"
@ -83,7 +74,7 @@
"mac" "764"
}
"m_flameX" // float
"m_streakTime" // float
{
"type" "float"
@ -92,7 +83,7 @@
"mac" "768"
}
"m_flameY" // float
"m_flameX" // float
{
"type" "float"
@ -100,6 +91,15 @@
"linux" "772"
"mac" "772"
}
"m_flameY" // float
{
"type" "float"
"windows" "756"
"linux" "776"
"mac" "776"
}
}
}
}

View File

@ -23,36 +23,36 @@
{
"type" "float"
"windows" "708"
"linux" "728"
"mac" "728"
"windows" "712"
"linux" "732"
"mac" "732"
}
"m_hTalkTarget" // EHANDLE
{
"type" "ehandle"
"windows" "712"
"linux" "732"
"mac" "732"
"windows" "716"
"linux" "736"
"mac" "736"
}
"m_flIdealYaw" // float
{
"type" "float"
"windows" "720"
"linux" "740"
"mac" "740"
"windows" "724"
"linux" "744"
"mac" "744"
}
"m_flCurrentYaw" // float
{
"type" "float"
"windows" "724"
"linux" "744"
"mac" "744"
"windows" "728"
"linux" "748"
"mac" "748"
}
}
}

View File

@ -23,27 +23,27 @@
{
"type" "ehandle"
"windows" "708"
"linux" "728"
"mac" "728"
"windows" "712"
"linux" "732"
"mac" "732"
}
"m_hTalkTarget" // EHANDLE
{
"type" "ehandle"
"windows" "716"
"linux" "736"
"mac" "736"
"windows" "720"
"linux" "740"
"mac" "740"
}
"m_flTalkTime" // float
{
"type" "float"
"windows" "724"
"linux" "744"
"mac" "744"
"windows" "728"
"linux" "748"
"mac" "748"
}
}
}

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