Skip to content

PawnPlus v1.1

Compare
Choose a tag to compare
@IS4Code IS4Code released this 09 Aug 12:47
· 246 commits to master since this release

Additions

Pools

  • A new type of collection providing support for efficient storage of data using reusable integer indices.
  • When an element is added to a pool, it gets assigned an index which is then used to refer to the element.
  • Pools come in two versions with the same API – ordered (new indices are assigned in a specific order), and unordered. Ordered pools will always assign the lowest unused index to a newly added element.
  • A pool can grow to any size if there are no unused slots for new elements.

Expressions

  • Dynamic run-time representations of operations.
  • Can be constructed from components in a tree-like manner, or parsed from string with expr_parse.
  • The parser supports all standard Pawn operators and some PawnPlus-specific ones. It can also find and use non-public Pawn variables (via the debug API).
  • Expressions can be used in collections and new types of iterators to easily perform queries on multiple elements.

Async

  • async pseudo-attribute for functions using the async pattern (together with return async).
  • The await macro has an alternative definition supporting multiline expression, but requires additional configuration for all tags (enabled via PP_MULTILINE_AWAIT).
  • await_arr and await_var added.

Collections

  • The API is now more unified, so all collections have roughly the same functions with the same semantics.
  • The capacity of the underlying container can be obtained.

Strings

  • If {} is used in str_format and it doesn't correspond to a color code or a parameter selector, it is parsed and executed as a piece of code.
  • %f in str_format accepts a width parameter.
  • str_append_format added.

Pawn and AMX

  • pawn_create_callback can be used to create a new callback/public function and attach it to the current script. The function consists of an expression that is executed every time the public function is called.
  • Declarational initializers and finalizers added. Any public function whose name starts with _pp@on_init@ will be called first before every other function, when the script is loaded. Any function whose name starts with _pp@on_exit@ will be called last after all other functions, when the script is unloaded. Macros pawn_on_init and pawn_on_exit can be used for easy creation of these functions.
  • AMX guards introduced. While a Pawn guard protects the object for the duration of the current context (analogous to a local variable), an AMX guard protects it for the duration of the script (analogous to a global/static local variable).
  • Handling public function index incompatibility with SAMPGDK can be resolved by pp_public_min_index or pp_use_funcidx. Callback handlers can be registered for negative indices.
  • Captured arguments (in pawn_register_callback or pawn_add_hook) now accept v, h, and x as new types of values. v corresponds to a Variant: argument which is copied to the closure and loaded when it is restored, h corresponds to a Handle: argument which is prolonged by the closure (so the underlying object is not destroyed) and whose value is loaded when the closure is restored, and x corresponds to an Expression: argument containing an expression which is executed every time the argument is restored.

Error handling

  • Dynamically called external natives that raise a system error/signal do not crash the server, but are handled and reported via PawnPlus errors.

C API

  • Support for errors and serialization.

Changes

Error handling

  • pp_on_error is only called for a native called directly by the script. Errors in internally called natives are handled or propagated by the code that called them. pawn_try_call_native never invokes pp_on_error.

Collections

  • Iterators are invalidated on addition only when necessary (when the underlying buffer needs to be reallocated).

Variants

  • Calling operations on variables that are incompatible (different tags or sizes) now produces an error (used to return null).

Math

  • Dynamically called operations on signed: and unsigned: values can raise an error.

Pawn and AMX

  • Incorrect public function index caused by SAMPGDK is detected and warned about.

Fixes

Variants

  • collect operation is now correctly called in some places.

Async

  • When a context is stored after a call to an asynchronous function, reset_stk and reset_hea are now used to correctly restore the original values of stk and hea, fixing a memory leak that happened when a public function with parameters was stored (because the parameters were not taken into account when stk was restored).

Math

  • signed: and unsigned: subtraction fixed.

Error handling

  • Allocation of more data than the script supports is prevented.

Pawn and AMX

  • Removing a hook handler when it is running will not crash the server.

Examples

Format expressions

new val1 = 5, val2 = 10;
print_s(str_format("the sum of {val1} and {val2} is {val1 + val2}"));

Queries

new Map:m = map_new();
map_add(m, 1, 10);
map_add(m, 2, 21);
map_add(m, 3, 30);
map_add(m, 4, 41);
map_add(m, 5, 50);
    
map_remove_if(m, expr_parse("10*$key != $value")); //removes 2 and 4

Caching expressions

static Expression:expr;
if(!expr)
{
    expr = expr_parse("$value*$value");
    amx_guard(expr);
}

Declarational callback handler

pawn_on_init[callback1]
{
    new id = pawn_create_callback("OnPlayerConnect", expr_const(0));
    pawn_register_callback(amx_encode_public(id), "MyOnPlayerConnect");
}