In #705 SourceMod received support for x64 binaries. The `IBinTools` interface was updated to call functions in 64bit binaries. The `PassInfo` struct's size was increased and the `Create(V)Call()` functions signatures changed, thus making the interface incompatible for consumers which were compiled against an earlier version.
`SMInterface::IsVersionCompatible` wasn't adjusted to that fact, so extensions compiled against pre SM 1.10 could request an `IBinTools` interface pointer, but crash when they try to use it.
This change makes requests to older interface versions invalid, thus letting `RequestInterface` return `NULL` for older extensions. It doesn't fix the backwards incompatibility, but at least makes the problem more blatant, so extensions can handle it themselves.
When lookup of a more specialized entry in the maplists.cfg failed, it wouldn't fallback to the "default" section, but just try to parse the same section again.
The `TopMenu` methodmap natives weren't marked as optional if the extension was optional like the other normal natives.
The `Regex` natives weren't marked as optional at all before if the regex extension was included optionally.
This makes the error message cleaner in case topmenus aren't loaded.
```
adminmenu.smx (Admin Menu): Required extension "TopMenus" file("topmenus.ext") not running
basebans.smx (Basic Ban Commands): Native "TopMenu.Display" was not found
```
Prepared statements can return multiple result sets since MySQL 5.5. That can happen when calling stored procedures using `CALL x();`.
This change removes the previous caching of result bindings, since the number of fields in a result can differ from result set to result set. This could potentially have a negative impact on prepared statements always only returning one result set, since the result binding buffers are recreated everytime the statement is executed instead of once. That difference should be negligible.
Fixes#823.
MySQL defines its own timespec_t. Official mysql builds are built using VS2013, so you still need to compile the client library yourself to be able to link it, but this change makes the dbi extension compatible with future versions already.
This adds support for platform specific custom key values in the `Keys` section in game config files. Now you can have different values for the same key per platform.
Previously you could only add general key values in gamedata files that were the same on all platforms like
```
"Keys"
{
"key" "value"
}
```
This patch allows you to set the value per platform in a subsection like
```
"Keys"
{
"key"
{
"windows" "value1"
"linux" "value2"
"mac" "value3"
}
}
```
Looking up the `key` will return the value matching the host platform.
Valid core config options aren't cached to be retrieved using `GetCoreConfigValue` after they've been loaded from core.cfg or set through the `sm config` root console menu.
E.g. `sm config ServerLang` would return `[SM] No such config option "ServerLang" exists.` all the time.
Stop notifying other listeners if the config key was consumed, but don't skip adding it to the cache.
Also fix `FollowCSGOServerGuidelines` always showing as unhandled command when being changed through `sm config FollowCSGOServerGuidelines yes`.
Be able to push NULL_[VECTOR|STRING] to a forward or direct function call.
The callee can check the parameter using the IsNullVector/IsNullString natives.
* Add OnPlayerRunCmdPost forward
Allow plugins to catch the values that are actually used by the game
after some eventual changes by other plugins.
* Add |const| qualifier to arrays in OnPlayerRunCmdPost forward
Be able to push NULL_[VECTOR|STRING] to a forward or direct function call.
The callee can check the parameter using the IsNullVector/IsNullString natives.
Add GetArrayBlockSize and GetStackBlockSize and equivalent properties to
the methodmaps to get the blocksize the array or stack was created with.
Useful when getting array handles from other plugins you didn't create
yourself.
Regression in #583
The `CBaseHandle *` was compared to a `IHandleEntity **` always failing
instead of comparing the actual base handles.
Fixes a small typo in MatchTypeDescAsInteger too, where a FIELD_CUSTOM
could fall through badly.
If one of the queries fails in a transaction, the DBI system would only allocate an array of the size of the amount of all the successful queries before the failed one. It writes data for all the queries though effectively writing past the array bounds leading to heap corruption.
Create the right sized array!
Plugins were able to close the results handle in the threaded query
callback causing a double free crash. The access rights are setup right
before the handle is created, but weren't used.
Round end reasons in CS:GO are +1 from the ones in CS:S. The
CSRoundEnd_GameStart reason for when the OnMapTimeLeftChanged forward
should be called should be one higher than in CS:S.
SourceMod itself and thirdparty extensions call functions in plugins
without making sure it is runnable. The plugin pausing feature isn't
supported anymore and is set to get nuked #438 which will reduce the
amount of not-runnable error reports.
We can't fix every third party extension, so suppressing the error from
the logs will stop the spam until pausing is removed.
#489 can be reverted after this.
When the server crashed and the process got terminated, the SqDriver
instance was killed first (e.g. by atexit). SqDatabase tries to access
SqDriver in its destructor.
This patch tells SqDatabase to not use anything from SqDriver anymore
after SqDriver got destroyed.
Next to that, the clientprefs extension relied on the IDatabase pointer
being valid to get the driver pointer. Cache the pointer, so the dbi
system still knows the IDBThreadOperation belonged to the now gone
driver, even after the database object is gone.
Add an ICellArray interface to expose the adt_array CellArray class from
logic to core.
Add methods to ISourceMod to create and delete ICellArray instances in
logic.
Bug 6518
Starting from no plugins loaded, after the final step of the following,
basetriggers will be marked as errored because mapchooser is missing:
Load basetriggers
Load mapchooser
Unload mapchooser
Load mapchooser
Unload mapchooser
We lose the SP_NTVFLAG_OPTIONAL when removing a WeakNative. The
__pl_mapchooser_SetNTVOptional() is only called in basetriggers when it
is loaded. It adds the OPTIONAL flag to the mapchooser natives the
basetrigger plugin uses.
When mapchooser is loaded, the native is overwritten and the OPTIONAL
flag consumed (WeakNative registered), but not preserved. Later when
mapchooser is unloaded the WeakNative is removed in
CNativeOwner::UnbindWeakRef, but the OPTIONAL flag isn't added again.
The next time mapchooser is loaded, the natives aren't optional anymore
and will cause a real dependency.
The change in ShareSys isn't needed to fix the error, but is included to
keep the SP_NTVFLAG_OPTIONAL flag consistent.
The buffer for menu options was 64 chars. That limit can easily be
reached by some utf8 string which would get truncated. Double the buffer
size to 128 chars.
This avoids spam of "Plugin not runnable" exceptions on shutdown or
plugin unload.
When re/unloading a plugin which has other ones depending on it, like
the adminmenu, It pauses the depending plugins putting them in an
"Depends on plugin: %s" error state. ForwardSys doesn't remove them from
the forward lists on pause, specially the global forwards, and still
tries to call all the global forwards like OnPlayerRunCmd and
OnLibraryAdded etc. on the paused plugins. Executing functions in paused
runtimes has been ignored in the VM before introducing the "Exception"
mechanism, but now they're all logged.
This adds checks to make sure the plugin is runnable before calling a
function. (Stolen from #438)
When unloading a plugin no plugin is allowed to execute code. There's
been some flawed logic in the scheduling, leading it to bail out if the
plugin was marked for scheduled unloading..
Also change the "error" message of `sm plugins unload` to something
nice.
Fix regression in ad7d920
GetMenuStyleHandle(MenuStyle_Radio) crashes games, which don't support
the radio menu style. The style is never added to the menu manager, if
it's not supported, so GetMenuStyleHandle tries to call IsSupported on a
nullptr
Looks like the |weapon| parameter went missing during the switch to the
transitional syntax.
There was no -Post typedef including the |damagecustom| bit at all too.
I doubt we're interested in the filename of every single file
contained in the mysql archive when it's decompressed.
It bloats up the travis build log.
Change the meaning of Plugin_Failed status to indicate, that the plugin
can't recover from the error.
Make sure those previously loaded plugins are shown correctly in sm
plugins info x.
When a plugin calls SetFailState it is paused and all natives it
registered are unavailable. Other plugins, which depend on those natives
keep running and error whenever they try to call those natives.
This correctly sets the dependent plugins to an error state as if the
plugin which called SetFailState was unloaded.
Adds type safety to CDataPack. Cells can't be read as Float anymore. Now
you're able to store a function pointer in a datapack and be sure the
pointer can't be read as a cell and a cell can't be read as a function
pointer.
commit cd0d31805c
Author: Peace-Maker <[email protected]>
Date: Wed May 28 03:07:25 2014 +0200
Ignore \ ctrlchar in lexing
commit cf617a4d20
Author: Peace-Maker <[email protected]>
Date: Tue May 27 13:32:59 2014 +0200
Add string literal concatenation using ellipses "..." (bug 4261)
Backported the changes CompuPhase did to the compiler to support string
literal concatenation including all fixes in later commits from r30 on.
http://code.google.com/p/pawnscript/source/detail?r=30
Pawn uses ellipses "..." to concatenate so it looks like this:
#define PROJECT_AUTHOR "Greyscale"
#define PROJECT_COPYRIGHT "Copyright (C) 2010 " ... PROJECT_AUTHOR
This would result in PROJECT_COPYRIGHT being defined as
"Copyright (C) 2010 Greyscale"
While i've been at it, that stringizing a macro parameter feature was
ported too.
From the changelog for version 3.3.4026
(http://www.compuphase.com/pawn/pawnhistory.htm):
The macro substition processor now recognizes the "#" character for
"stringizing" a parameter. For example, if you have the definition
#define log(%1) #%1
Then the expression log(test) will result in "test".
Note that concatenation of literal strings requires an ellipsis in pawn
(which is different than C/C++). So to combine the parameter with
literal strings, use a syntax like:
#define log(%1) "logging: " ... #%1 ... "\n"
The stringize operator is only available in the replacement text of a
macro.
Doing
PrintToServer(log(hello));
would print
logging: hello\n
commit c1b064c9232553045f6f5bfaf7df0feb6ceb4571
Author: Peace-Maker <[email protected]>
Date: Wed May 28 03:16:22 2014 +0200
Coding style adjustments
commit 37a16dbba24cc2035fb8838be8729067cb9bc13a
Author: Peace-Maker <[email protected]>
Date: Wed May 28 03:03:25 2014 +0200
Load core.phrases before calling OnLibraryAdded
commit 676ac951111c7e8f565debbd4316850a4c4a8d00
Author: Peace-Maker <[email protected]>
Date: Tue May 27 13:18:48 2014 +0200
Call OnLibraryAdded for all available librarys (bug 5925)
When loading multiple plugins at once (on server start or mapchange)
OnLibraryAdded is only called for libraries which are loaded after the
current plugin. The plugin isn't informed about the libraries that were
added before its OnPluginStart forward was called.
This patch calls OnLibraryAdded for all already registered libraries the
current plugin has missed.
Backported the changes CompuPhase did to the compiler to support string
literal concatenation including all fixes in later commits from r30 on.
http://code.google.com/p/pawnscript/source/detail?r=30
Pawn uses ellipses "..." to concatenate so it looks like this:
#define PROJECT_AUTHOR "Greyscale"
#define PROJECT_COPYRIGHT "Copyright (C) 2010 " ... PROJECT_AUTHOR
This would result in PROJECT_COPYRIGHT being defined as
"Copyright (C) 2010 Greyscale"
While i've been at it, that stringizing a macro parameter feature was
ported too.
From the changelog for version 3.3.4026
(http://www.compuphase.com/pawn/pawnhistory.htm):
The macro substition processor now recognizes the "#" character for
"stringizing" a parameter. For example, if you have the definition
#define log(%1) #%1
Then the expression log(test) will result in "test".
Note that concatenation of literal strings requires an ellipsis in pawn
(which is different than C/C++). So to combine the parameter with
literal strings, use a syntax like:
#define log(%1) "logging: " ... #%1 ... "\n"
The stringize operator is only available in the replacement text of a
macro.
Doing
PrintToServer(log(hello));
would print
logging: hello\n