diff --git a/Makefile b/Makefile index e13ca5b..7e292f1 100644 --- a/Makefile +++ b/Makefile @@ -4,8 +4,8 @@ SOURCEDIR=src SMINCLUDES=env/include BUILDDIR=build -SPCOMP_LINUX=env/linux/bin/spcomp-1.6.0 -SPCOMP_DARWIN=env/darwin/bin/spcomp-1.6.0 +SPCOMP_LINUX=env/linux/bin/spcomp-1.7.0 +SPCOMP_DARWIN=env/darwin/bin/spcomp-1.7.0 DOS2UNIX_LINUX=dos2unix -p DOS2UNIX_DARWIN=env/darwin/bin/dos2unix -p VERSIONDUMP=./updateversion.sh diff --git a/compile.bat b/compile.bat index fecb379..d80a6bb 100644 --- a/compile.bat +++ b/compile.bat @@ -3,7 +3,7 @@ set SOURCEDIR=src set SMINCLUDES=env\include set BUILDDIR=build -set SPCOMP=env\win32\bin\spcomp-1.6.0.exe +set SPCOMP=env\win32\bin\spcomp-1.7.0.exe set VERSIONDUMP=updateversion.bat :: Dump version and revision information first. diff --git a/env/darwin/bin/spcomp-1.7.0 b/env/darwin/bin/spcomp-1.7.0 new file mode 100755 index 0000000..2dd729d Binary files /dev/null and b/env/darwin/bin/spcomp-1.7.0 differ diff --git a/env/include/admin.inc b/env/include/admin.inc index 40c5907..fa354f0 100644 --- a/env/include/admin.inc +++ b/env/include/admin.inc @@ -356,7 +356,7 @@ native GetAdminUsername(AdminId:id, String:name[], maxlength); * @param auth Auth method to use, predefined or from RegisterAuthIdentType(). * @param ident String containing the arbitrary, unique identity. * @return True on success, false if the auth method was not found, - * or ident was already taken. + * ident was already taken, or ident invalid for auth method. */ native bool:BindAdminIdentity(AdminId:id, const String:auth[], const String:ident[]); diff --git a/env/include/adminmenu.inc b/env/include/adminmenu.inc index f96eb2a..42d00b9 100644 --- a/env/include/adminmenu.inc +++ b/env/include/adminmenu.inc @@ -65,7 +65,7 @@ * @param topmenu Handle to the admin menu's TopMenu. * @noreturn */ -forward OnAdminMenuCreated(Handle:topmenu); +forward OnAdminMenuCreated(Handle topmenu); /** * Called when the admin menu is ready to have items added. @@ -73,7 +73,7 @@ forward OnAdminMenuCreated(Handle:topmenu); * @param topmenu Handle to the admin menu's TopMenu. * @noreturn */ -forward OnAdminMenuReady(Handle:topmenu); +forward OnAdminMenuReady(Handle topmenu); /** * Retrieves the Handle to the admin top menu. @@ -81,7 +81,7 @@ forward OnAdminMenuReady(Handle:topmenu); * @return Handle to the admin menu's TopMenu, * or INVALID_HANDLE if not created yet. */ -native Handle:GetAdminTopMenu(); +native TopMenu GetAdminTopMenu(); /** * Adds targets to an admin menu. diff --git a/env/include/adt_array.inc b/env/include/adt_array.inc index 798ae55..6c44ad8 100644 --- a/env/include/adt_array.inc +++ b/env/include/adt_array.inc @@ -1,7 +1,7 @@ /** - * vim: set ts=4 : + * vim: set ts=4 sw=4 tw=99 noet : * ============================================================================= - * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * SourceMod (C)2004-2014 AlliedModders LLC. All rights reserved. * ============================================================================= * * This file is part of the SourceMod/SourcePawn SDK. @@ -45,13 +45,172 @@ stock ByteCountToCells(size) { if (!size) - { return 1; - } - return (size + 3) / 4; } +methodmap ArrayList < Handle { + // Creates a dynamic global cell array. While slower than a normal array, + // it can be used globally AND dynamically, which is otherwise impossible. + // + // The contents of the array are uniform; i.e. storing a string at index X + // and then retrieving it as an integer is NOT the same as StringToInt()! + // The "blocksize" determines how many cells each array slot has; it cannot + // be changed after creation. + // + // @param blocksize The number of cells each member of the array can + // hold. For example, 32 cells is equivalent to: + // new Array[X][32] + // @param startsize Initial size of the array. Note that data will + // NOT be auto-intialized. + // @return New Handle to the array object. + public native ArrayList(int blocksize=1, int startsize=0); + + // Clears an array of all entries. This is the same as Resize(0). + public native void Clear(); + + // Clones an array, returning a new handle with the same size and data. + // This should NOT be confused with CloneHandle. This is a completely new + // handle with the same data but no relation to the original. It should + // closed when no longer needed. + // + // @return New handle to the cloned array object + public native ArrayList Clone(); + + // Resizes an array. If the size is smaller than the current size, the + // array is truncated. + // + // @param newsize New size. + public native void Resize(int newsize); + + // Pushes a value onto the end of an array, adding a new index. + // + // This may safely be used even if the array has a blocksize greater + // than 1. + // + // @param value Value to push. + // @return Index of the new entry. + // @error Invalid Handle or out of memory. + // + public native int Push(any value); + + // Pushes a string onto the end of an array, truncating it if it is too big. + // + // @param value String to push. + // @return Index of the new entry. + public native int PushString(const char[] value); + + // Pushes an array of cells onto the end of an array. The cells + // are pushed as a block (i.e. the entire array sits at the index), + // rather than pushing each cell individually. + // + // @param values Block of values to copy. + // @param size If not set, the number of elements copied from the array + // will be equal to the blocksize. If set higher than the + // blocksize, the operation will be truncated. + // @return Index of the new entry. + public native int PushArray(const any[] values, int size=-1); + + // Retrieves a cell value from an array. + // + // @param index Index in the array. + // @param block Optionally specify which block to read from + // (useful if the blocksize > 0). + // @param asChar Optionally read as a byte instead of a cell. + // @return Value read. + // @error Invalid index. + public native any Get(int index, int block=0, bool asChar=false); + + // Retrieves a string value from an array. + // + // @param index Index in the array. + // @param buffer Buffer to copy to. + // @param maxlength Maximum size of the buffer. + // @return Number of characters copied. + // @error Invalid index. + public native int GetString(int index, char[] buffer, maxlength); + + // Retrieves an array of cells from an array. + // + // @param index Index in the array. + // @param buffer Buffer to store the array in. + // @param size If not set, assumes the buffer size is equal to the + // blocksize. Otherwise, the size passed is used. + // @return Number of cells copied. + // @error Invalid index. + public native int GetArray(int index, any[] buffer, int size=-1); + + // Sets a cell value in an array. + // + // @param index Index in the array. + // @param value Cell value to set. + // @param block Optionally specify which block to write to + // (useful if the blocksize > 0). + // @param asChar Optionally set as a byte instead of a cell. + // @error Invalid index, or invalid block. + public native void Set(int index, any value, int block=0, bool asChar=false); + + // Sets a string value in an array. + // + // @param index Index in the array. + // @param value String value to set. + // @return Number of characters copied. + // @error Invalid index. + public native void SetString(int index, const char[] value); + + // Sets an array of cells in an array. + // + // @param index Index in the array. + // @param values Array to copy. + // @param size If not set, assumes the buffer size is equal to the + // blocksize. Otherwise, the size passed is used. + // @return Number of cells copied. + // @error Invalid index. + public native void SetArray(int index, const any[] values, int size=-1); + + // Shifts an array up. All array contents after and including the given + // index are shifted up by one, and the given index is then "free." + // After shifting, the contents of the given index is undefined. + // + // @param index Index in the array to shift up from. + // @error Invalid index. + public native void ShiftUp(int index); + + // Removes an array index, shifting the entire array down from that position + // on. For example, if item 8 of 10 is removed, the last 3 items will then be + // (6,7,8) instead of (7,8,9), and all indexes before 8 will remain unchanged. + // + // @param index Index in the array to remove at. + // @error Invalid index. + public native void Erase(int index); + + // Swaps two items in the array. + // + // @param index1 First index. + // @param index2 Second index. + // @error Invalid index. + public native void SwapAt(int index1, int index2); + + // Returns the index for the first occurance of the provided string. If + // the string cannot be located, -1 will be returned. + // + // @param item String to search for + // @return Array index, or -1 on failure + public native int FindString(const char[] item); + + // Returns the index for the first occurance of the provided value. If the + // value cannot be located, -1 will be returned. + // + // @param item Value to search for + // @return Array index, or -1 on failure + public native int FindValue(any item); + + // Retrieve the size of the array. + property int Length { + public native get(); + } +}; + /** * Creates a dynamic global cell array. While slower than a normal array, * it can be used globally AND dynamically, which is otherwise impossible. @@ -68,16 +227,15 @@ stock ByteCountToCells(size) * NOT be auto-intialized. * @return New Handle to the array object. */ -native Handle:CreateArray(blocksize=1, startsize=0); +native ArrayList CreateArray(int blocksize=1, int startsize=0); /** * Clears an array of all entries. This is the same as ResizeArray(0). * * @param array Array Handle. - * @noreturn * @error Invalid Handle. */ -native ClearArray(Handle:array); +native void ClearArray(Handle array); /** * Clones an array, returning a new handle with the same size and data. This should NOT @@ -88,7 +246,7 @@ native ClearArray(Handle:array); * @return New handle to the cloned array object * @error Invalid Handle */ -native Handle:CloneArray(Handle:array); +native Handle CloneArray(Handle array); /** * Resizes an array. If the size is smaller than the current size, @@ -99,7 +257,7 @@ native Handle:CloneArray(Handle:array); * @noreturn * @error Invalid Handle or out of memory. */ -native bool:ResizeArray(Handle:array, newsize); +native bool ResizeArray(Handle array, int newsize); /** * Returns the array size. @@ -108,7 +266,7 @@ native bool:ResizeArray(Handle:array, newsize); * @return Number of elements in the array. * @error Invalid Handle. */ -native GetArraySize(Handle:array); +native int GetArraySize(Handle array); /** * Pushes a value onto the end of an array, adding a new index. @@ -121,7 +279,7 @@ native GetArraySize(Handle:array); * @return Index of the new entry. * @error Invalid Handle or out of memory. */ -native PushArrayCell(Handle:array, any:value); +native int PushArrayCell(Handle array, any value); /** * Pushes a string onto the end of an array, truncating it @@ -132,7 +290,7 @@ native PushArrayCell(Handle:array, any:value); * @return Index of the new entry. * @error Invalid Handle or out of memory. */ -native PushArrayString(Handle:array, const String:value[]); +native int PushArrayString(Handle array, const char[] value); /** * Pushes an array of cells onto the end of an array. The cells @@ -147,7 +305,7 @@ native PushArrayString(Handle:array, const String:value[]); * @return Index of the new entry. * @error Invalid Handle or out of memory. */ -native PushArrayArray(Handle:array, const any:values[], size=-1); +native int PushArrayArray(Handle array, const any[] values, int size=-1); /** * Retrieves a cell value from an array. @@ -160,7 +318,7 @@ native PushArrayArray(Handle:array, const any:values[], size=-1); * @return Value read. * @error Invalid Handle, invalid index, or invalid block. */ -native any:GetArrayCell(Handle:array, index, block=0, bool:asChar=false); +native any GetArrayCell(Handle array, int index, int block=0, bool asChar=false); /** * Retrieves a string value from an array. @@ -172,7 +330,7 @@ native any:GetArrayCell(Handle:array, index, block=0, bool:asChar=false); * @return Number of characters copied. * @error Invalid Handle or invalid index. */ -native GetArrayString(Handle:array, index, String:buffer[], maxlength); +native int GetArrayString(Handle array, int index, char[] buffer, maxlength); /** * Retrieves an array of cells from an array. @@ -185,7 +343,7 @@ native GetArrayString(Handle:array, index, String:buffer[], maxlength); * @return Number of cells copied. * @error Invalid Handle or invalid index. */ -native GetArrayArray(Handle:array, index, any:buffer[], size=-1); +native int GetArrayArray(Handle array, int index, any[] buffer, int size=-1); /** * Sets a cell value in an array. @@ -196,10 +354,9 @@ native GetArrayArray(Handle:array, index, any:buffer[], size=-1); * @param block Optionally specify which block to write to * (useful if the blocksize > 0). * @param asChar Optionally set as a byte instead of a cell. - * @noreturn * @error Invalid Handle, invalid index, or invalid block. */ -native SetArrayCell(Handle:array, index, any:value, block=0, bool:asChar=false); +native void SetArrayCell(Handle array, int index, any value, int block=0, bool asChar=false); /** * Sets a string value in an array. @@ -210,7 +367,7 @@ native SetArrayCell(Handle:array, index, any:value, block=0, bool:asChar=false); * @return Number of characters copied. * @error Invalid Handle or invalid index. */ -native SetArrayString(Handle:array, index, const String:value[]); +native int SetArrayString(Handle array, int index, const char[] value); /** * Sets an array of cells in an array. @@ -223,7 +380,7 @@ native SetArrayString(Handle:array, index, const String:value[]); * @return Number of cells copied. * @error Invalid Handle or invalid index. */ -native SetArrayArray(Handle:array, index, const any:values[], size=-1); +native int SetArrayArray(Handle array, int index, const any[] values, int size=-1); /** * Shifts an array up. All array contents after and including the given @@ -232,10 +389,9 @@ native SetArrayArray(Handle:array, index, const any:values[], size=-1); * * @param array Array Handle. * @param index Index in the array to shift up from. - * @noreturn * @error Invalid Handle or invalid index. */ -native ShiftArrayUp(Handle:array, index); +native void ShiftArrayUp(Handle array, int index); /** * Removes an array index, shifting the entire array down from that position @@ -244,10 +400,9 @@ native ShiftArrayUp(Handle:array, index); * * @param array Array Handle. * @param index Index in the array to remove at. - * @noreturn * @error Invalid Handle or invalid index. */ -native RemoveFromArray(Handle:array, index); +native void RemoveFromArray(Handle array, int index); /** * Swaps two items in the array. @@ -255,10 +410,9 @@ native RemoveFromArray(Handle:array, index); * @param array Array Handle. * @param index1 First index. * @param index2 Second index. - * @noreturn * @error Invalid Handle or invalid index. */ -native SwapArrayItems(Handle:array, index1, index2); +native void SwapArrayItems(Handle array, int index1, int index2); /** * Returns the index for the first occurance of the provided string. If the string @@ -269,7 +423,7 @@ native SwapArrayItems(Handle:array, index1, index2); * @return Array index, or -1 on failure * @error Invalid Handle */ -native FindStringInArray(Handle:array, const String:item[]); +native int FindStringInArray(Handle array, const char[] item); /** * Returns the index for the first occurance of the provided value. If the value @@ -280,4 +434,4 @@ native FindStringInArray(Handle:array, const String:item[]); * @return Array index, or -1 on failure * @error Invalid Handle */ -native FindValueInArray(Handle:array, any:item); +native int FindValueInArray(Handle array, any item); diff --git a/env/include/adt_stack.inc b/env/include/adt_stack.inc index 54029c3..b7d6f75 100644 --- a/env/include/adt_stack.inc +++ b/env/include/adt_stack.inc @@ -1,7 +1,7 @@ /** - * vim: set ts=4 : + * vim: set ts=4 sw=4 tw=99 noet : * ============================================================================= - * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * SourceMod (C)2004-2014 AlliedModders LLC. All rights reserved. * ============================================================================= * * This file is part of the SourceMod/SourcePawn SDK. @@ -35,6 +35,82 @@ #endif #define _adt_stack_included +methodmap ArrayStack < Handle +{ + // Creates a stack structure. A stack is a LIFO (last in, first out) + // vector (array) of items. It has O(1) insertion and O(1) removal. + // + // Stacks have two operations: Push (adding an item) and Pop (removes + // items in reverse-push order). + // + // The contents of the stack are uniform; i.e. storing a string and then + // retrieving it as an integer is NOT the same as StringToInt()! + // + // The "blocksize" determines how many cells each slot has; it cannot + // be changed after creation. + // + // @param blocksize The number of cells each entry in the stack can + // hold. For example, 32 cells is equivalent to: + // new Array[X][32] + public native ArrayStack(int blocksize=1); + + // Pushes a value onto the end of the stack, adding a new index. + // + // This may safely be used even if the stack has a blocksize + // greater than 1. + // + // @param value Value to push. + public native void Push(any value); + + // Pushes a copy of a string onto the end of a stack, truncating it if it + // is too big. + // + // @param value String to push. + public native void PushString(const char[] value); + + // Pushes a copy of an array of cells onto the end of a stack. The cells + // are pushed as a block (i.e. the entire array takes up one stack slot), + // rather than pushing each cell individually. + // + // @param stack Stack Handle. + // @param values Block of values to copy. + // @param size If not set, the number of elements copied from the array + // will be equal to the blocksize. If set higher than the + // blocksize, the operation will be truncated. + public native void PushArray(const any[] values, int size=-1); + + // Pops a cell value from a stack. + // + // @param block Optionally specify which block to read from + // (useful if the blocksize > 0). + // @param asChar Optionally read as a byte instead of a cell. + // @return True on success, false if the stack is empty. + // @error The stack is empty. + public native any Pop(int block=0, bool asChar=false); + + // Pops a string value from a stack. + // + // @param buffer Buffer to store string. + // @param maxlength Maximum size of the buffer. + // @oaram written Number of characters written to buffer, not including + // the null terminator. + // @error The stack is empty. + public native void PopString(char[] buffer, int maxlength, int &written = 0); + + // Pops an array of cells from a stack. + // + // @param buffer Buffer to store the array in. + // @param size If not set, assumes the buffer size is equal to the + // blocksize. Otherwise, the size passed is used. + // @error The stack is empty. + public native void PopArray(any[] buffer, int size=-1); + + // Returns true if the stack is empty, false otherwise. + property bool Empty { + public native get(); + } +}; + /** * Creates a stack structure. A stack is a LIFO (last in, first out) * vector (array) of items. It has O(1) insertion and O(1) removal. @@ -53,7 +129,7 @@ * new Array[X][32] * @return New stack Handle. */ -native Handle:CreateStack(blocksize=1); +native ArrayStack CreateStack(int blocksize=1); /** * Pushes a value onto the end of the stack, adding a new index. @@ -63,24 +139,22 @@ native Handle:CreateStack(blocksize=1); * * @param stack Stack Handle. * @param value Value to push. - * @noreturn * @error Invalid Handle or out of memory. */ -native PushStackCell(Handle:stack, any:value); +native void PushStackCell(Handle stack, any value); /** - * Pushes a string onto the end of a stack, truncating it if it is + * Pushes a copy of a string onto the end of a stack, truncating it if it is * too big. * * @param stack Stack Handle. * @param value String to push. - * @noreturn * @error Invalid Handle or out of memory. */ -native PushStackString(Handle:stack, const String:value[]); +native void PushStackString(Handle stack, const char[] value); /** - * Pushes an array of cells onto the end of a stack. The cells + * Pushes a copy of an array of cells onto the end of a stack. The cells * are pushed as a block (i.e. the entire array takes up one stack slot), * rather than pushing each cell individually. * @@ -89,10 +163,9 @@ native PushStackString(Handle:stack, const String:value[]); * @param size If not set, the number of elements copied from the array * will be equal to the blocksize. If set higher than the * blocksize, the operation will be truncated. - * @noreturn * @error Invalid Handle or out of memory. */ -native PushStackArray(Handle:stack, const any:values[], size=-1); +native void PushStackArray(Handle stack, const any[] values, int size=-1); /** * Pops a cell value from a stack. @@ -105,7 +178,7 @@ native PushStackArray(Handle:stack, const any:values[], size=-1); * @return True on success, false if the stack is empty. * @error Invalid Handle. */ -native bool:PopStackCell(Handle:stack, &any:value, block=0, bool:asChar=false); +native bool PopStackCell(Handle stack, any &value, int block=0, bool asChar=false); /** * Pops a string value from a stack. @@ -116,7 +189,7 @@ native bool:PopStackCell(Handle:stack, &any:value, block=0, bool:asChar=false); * @return True on success, false if the stack is empty. * @error Invalid Handle. */ -native bool:PopStackString(Handle:stack, String:buffer[], maxlength, &written=0); +native bool PopStackString(Handle stack, char[] buffer, int maxlength, int &written=0); /** * Pops an array of cells from a stack. @@ -128,7 +201,7 @@ native bool:PopStackString(Handle:stack, String:buffer[], maxlength, &written=0) * @return True on success, false if the stack is empty. * @error Invalid Handle. */ -native bool:PopStackArray(Handle:stack, any:buffer[], size=-1); +native bool PopStackArray(Handle stack, any[] buffer, int size=-1); /** * Checks if a stack is empty. @@ -137,7 +210,7 @@ native bool:PopStackArray(Handle:stack, any:buffer[], size=-1); * @return True if empty, false if not empty. * @error Invalid Handle. */ -native bool:IsStackEmpty(Handle:stack); +native bool IsStackEmpty(Handle stack); /** * Pops a value off a stack, ignoring it completely. @@ -146,9 +219,8 @@ native bool:IsStackEmpty(Handle:stack); * @return True if something was popped, false otherwise. * @error Invalid Handle. */ -stock PopStack(Handle:stack) +stock bool PopStack(Handle stack) { new value; - return PopStackCell(stack, value); } diff --git a/env/include/adt_trie.inc b/env/include/adt_trie.inc index 4e9f120..e6e9895 100644 --- a/env/include/adt_trie.inc +++ b/env/include/adt_trie.inc @@ -1,7 +1,7 @@ /** * vim: set ts=4 sw=4 tw=99 noet : * ============================================================================= - * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * SourceMod (C)2004-2014 AlliedModders LLC. All rights reserved. * ============================================================================= * * This file is part of the SourceMod/SourcePawn SDK. @@ -35,6 +35,123 @@ #endif #define _adt_trie_included +/* Object-oriented wrapper for maps. */ +methodmap StringMap < Handle +{ + // Creates a hash map. A hash map is a container that can map strings (called + // "keys") to arbitrary values (cells, arrays, or strings). Keys in a hash map + // are unique. That is, there is at most one entry in the map for a given key. + // + // Insertion, deletion, and lookup in a hash map are all considered to be fast + // operations, amortized to O(1), or constant time. + // + // The word "Trie" in this API is historical. As of SourceMod 1.6, tries have + // been internally replaced with hash tables, which have O(1) insertion time + // instead of O(n). + // + // The StringMap must be freed via delete or CloseHandle(). + public native StringMap(); + + // Sets a value in a hash map, either inserting a new entry or replacing an old one. + // + // @param key Key string. + // @param value Value to store at this key. + // @param replace If false, operation will fail if the key is already set. + // @return True on success, false on failure. + public native bool SetValue(const char[] key, any value, bool replace=true); + + // Sets an array value in a Map, either inserting a new entry or replacing an old one. + // + // @param key Key string. + // @param array Array to store. + // @param num_items Number of items in the array. + // @param replace If false, operation will fail if the key is already set. + // @return True on success, false on failure. + public native bool SetArray(const char[] key, const any[] array, int num_items, bool replace=true); + + // Sets a string value in a Map, either inserting a new entry or replacing an old one. + // + // @param key Key string. + // @param value String to store. + // @param replace If false, operation will fail if the key is already set. + // @return True on success, false on failure. + public native bool SetString(const char[] key, const char[] value, bool replace=true); + + // Retrieves a value in a Map. + // + // @param key Key string. + // @param value Variable to store value. + // @return True on success. False if the key is not set, or the key is set + // as an array or string (not a value). + public native bool GetValue(const char[] key, any &value); + + // Retrieves an array in a Map. + // + // @param map Map Handle. + // @param key Key string. + // @param array Buffer to store array. + // @param max_size Maximum size of array buffer. + // @param size Optional parameter to store the number of elements written to the buffer. + // @return True on success. False if the key is not set, or the key is set + // as a value or string (not an array). + public native bool GetArray(const char[] key, any[] array, int max_size, int &size=0); + + // Retrieves a string in a Map. + // + // @param key Key string. + // @param value Buffer to store value. + // @param max_size Maximum size of string buffer. + // @param size Optional parameter to store the number of bytes written to the buffer. + // @return True on success. False if the key is not set, or the key is set + // as a value or array (not a string). + public native bool GetString(const char[] key, char[] value, int max_size, int &size=0); + + // Removes a key entry from a Map. + // + // @param key Key string. + // @return True on success, false if the value was never set. + public native bool Remove(const char[] key); + + // Clears all entries from a Map. + public native void Clear(); + + // Create a snapshot of the map's keys. See StringMapSnapshot. + public native StringMapSnapshot Snapshot(); + + // Retrieves the number of elements in a map. + property int Size { + public native get(); + } +}; + +// A StringMapSnapshot is created via StringMap.Snapshot(). It captures the +// keys on a map so they can be read. Snapshots must be freed with delete or +// CloseHandle(). +methodmap StringMapSnapshot < Handle +{ + // Returns the number of keys in the map snapshot. + property int Length { + public native get(); + } + + // Returns the buffer size required to store a given key. That is, it + // returns the length of the key plus one. + // + // @param index Key index (starting from 0). + // @return Buffer size required to store the key string. + // @error Index out of range. + public native int KeyBufferSize(int index); + + // Retrieves the key string of a given key in a map snapshot. + // + // @param index Key index (starting from 0). + // @param buffer String buffer. + // @param maxlength Maximum buffer length. + // @return Number of bytes written to the buffer. + // @error Index out of range. + public native int GetKey(int index, char[] buffer, int maxlength); +}; + /** * Creates a hash map. A hash map is a container that can map strings (called * "keys") to arbitrary values (cells, arrays, or strings). Keys in a hash map @@ -49,7 +166,7 @@ * * @return New Map Handle, which must be freed via CloseHandle(). */ -native Handle:CreateTrie(); +native StringMap:CreateTrie(); /** * Sets a value in a hash map, either inserting a new entry or replacing an old one. @@ -61,7 +178,7 @@ native Handle:CreateTrie(); * @return True on success, false on failure. * @error Invalid Handle. */ -native bool:SetTrieValue(Handle:map, const String:key[], any:value, bool:replace=true); +native bool SetTrieValue(Handle map, const char[] key, any value, bool replace=true); /** * Sets an array value in a Map, either inserting a new entry or replacing an old one. @@ -74,7 +191,7 @@ native bool:SetTrieValue(Handle:map, const String:key[], any:value, bool:replace * @return True on success, false on failure. * @error Invalid Handle. */ -native bool:SetTrieArray(Handle:map, const String:key[], const any:array[], num_items, bool:replace=true); +native bool SetTrieArray(Handle map, const char[] key, const any[] array, int num_items, bool replace=true); /** * Sets a string value in a Map, either inserting a new entry or replacing an old one. @@ -86,7 +203,7 @@ native bool:SetTrieArray(Handle:map, const String:key[], const any:array[], num_ * @return True on success, false on failure. * @error Invalid Handle. */ -native bool:SetTrieString(Handle:map, const String:key[], const String:value[], bool:replace=true); +native bool SetTrieString(Handle map, const char[] key, const char[] value, bool replace=true); /** * Retrieves a value in a Map. @@ -98,7 +215,7 @@ native bool:SetTrieString(Handle:map, const String:key[], const String:value[], * as an array or string (not a value). * @error Invalid Handle. */ -native bool:GetTrieValue(Handle:map, const String:key[], &any:value); +native bool GetTrieValue(Handle map, const char[] key, any &value); /** * Retrieves an array in a Map. @@ -112,7 +229,7 @@ native bool:GetTrieValue(Handle:map, const String:key[], &any:value); * as a value or string (not an array). * @error Invalid Handle. */ -native bool:GetTrieArray(Handle:map, const String:key[], any:array[], max_size, &size=0); +native bool GetTrieArray(Handle map, const char[] key, any[] array, int max_size, int &size=0); /** * Retrieves a string in a Map. @@ -126,7 +243,7 @@ native bool:GetTrieArray(Handle:map, const String:key[], any:array[], max_size, * as a value or array (not a string). * @error Invalid Handle. */ -native bool:GetTrieString(Handle:map, const String:key[], String:value[], max_size, &size=0); +native bool GetTrieString(Handle map, const char[] key, char[] value, int max_size, int &size=0); /** * Removes a key entry from a Map. @@ -136,7 +253,7 @@ native bool:GetTrieString(Handle:map, const String:key[], String:value[], max_si * @return True on success, false if the value was never set. * @error Invalid Handle. */ -native RemoveFromTrie(Handle:map, const String:key[]); +native RemoveFromTrie(Handle map, const char[] key); /** * Clears all entries from a Map. @@ -144,7 +261,7 @@ native RemoveFromTrie(Handle:map, const String:key[]); * @param map Map Handle. * @error Invalid Handle. */ -native ClearTrie(Handle:map); +native ClearTrie(Handle map); /** * Retrieves the number of elements in a map. @@ -153,4 +270,48 @@ native ClearTrie(Handle:map); * @return Number of elements in the trie. * @error Invalid Handle. */ -native GetTrieSize(Handle:map); +native GetTrieSize(Handle map); + +/** + * Creates a snapshot of all keys in the map. If the map is changed after this + * call, the changes are not reflected in the snapshot. Keys are not sorted. + * + * @param map Map Handle. + * @return New Map Snapshot Handle, which must be closed via CloseHandle(). + * @error Invalid Handle. + */ +native Handle CreateTrieSnapshot(Handle map); + +/** + * Returns the number of keys in a map snapshot. Note that this may be + * different from the size of the map, since the map can change after the + * snapshot of its keys was taken. + * + * @param snapshot Map snapshot. + * @return Number of keys. + * @error Invalid Handle. + */ +native TrieSnapshotLength(Handle snapshot); + +/** + * Returns the buffer size required to store a given key. That is, it returns + * the length of the key plus one. + * + * @param snapshot Map snapshot. + * @param index Key index (starting from 0). + * @return Buffer size required to store the key string. + * @error Invalid Handle or index out of range. + */ +native TrieSnapshotKeyBufferSize(Handle snapshot, int index); + +/** + * Retrieves the key string of a given key in a map snapshot. + * + * @param snapshot Map snapshot. + * @param index Key index (starting from 0). + * @param buffer String buffer. + * @param maxlength Maximum buffer length. + * @return Number of bytes written to the buffer. + * @error Invalid Handle or index out of range. + */ +native GetTrieSnapshotKey(Handle snapshot, int index, char[] buffer, int maxlength); diff --git a/env/include/bitbuffer.inc b/env/include/bitbuffer.inc index fd1c18e..cbf71b7 100644 --- a/env/include/bitbuffer.inc +++ b/env/include/bitbuffer.inc @@ -1,7 +1,7 @@ /** - * vim: set ts=4 : + * vim: set ts=4 sw=4 tw=99 noet : * ============================================================================= - * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * SourceMod (C)2004-2014 AlliedModders LLC. All rights reserved. * ============================================================================= * * This file is part of the SourceMod/SourcePawn SDK. @@ -35,85 +35,239 @@ #endif #define _bitbuffer_included +methodmap BfWrite < Handle +{ + // Writes a single bit to a writable bitbuffer (bf_write). + // + // @param bit Bit to write (true for 1, false for 0). + public native void WriteBool(bool bit); + + // Writes a byte to a writable bitbuffer (bf_write). + // + // @param byte Byte to write (value will be written as 8bit). + public native void WriteByte(int byte); + + // Writes a byte to a writable bitbuffer (bf_write). + // + // @param chr Character to write. + public native void WriteChar(int chr); + + // Writes a 16bit integer to a writable bitbuffer (bf_write). + // + // @param num Integer to write (value will be written as 16bit). + public native void WriteShort(int num); + + // Writes a 16bit unsigned integer to a writable bitbuffer (bf_write). + // + // @param num Integer to write (value will be written as 16bit). + public native void WriteWord(int num); + + // Writes a normal integer to a writable bitbuffer (bf_write). + // + // @param num Integer to write (value will be written as 32bit). + public native void WriteNum(int num); + + // Writes a floating point number to a writable bitbuffer (bf_write). + // + // @param num Number to write. + public native void WriteFloat(float num); + + // Writes a string to a writable bitbuffer (bf_write). + // + // @param string Text string to write. + public native void WriteString(const char[] string); + + // Writes an entity to a writable bitbuffer (bf_write). + // + // @param ent Entity index to write. + public native void WriteEntity(int ent); + + // Writes a bit angle to a writable bitbuffer (bf_write). + // + // @param angle Angle to write. + // @param numBits Optional number of bits to use. + public native void WriteAngle(float angle, int numBits=8); + + // Writes a coordinate to a writable bitbuffer (bf_write). + // + // @param coord Coordinate to write. + public native void WriteCoord(float coord); + + // Writes a 3D vector of coordinates to a writable bitbuffer (bf_write). + // + // @param coord Coordinate array to write. + public native void WriteVecCoord(float coord[3]); + + // Writes a 3D normal vector to a writable bitbuffer (bf_write). + // + // @param vec Vector to write. + public native void WriteVecNormal(float vec[3]); + + // Writes a 3D angle vector to a writable bitbuffer (bf_write). + // + // @param angles Angle vector to write. + public native void WriteAngles(float angles[3]); +}; + +methodmap BfRead < Handle +{ + // Reads a single bit from a readable bitbuffer (bf_read). + // + // @return Bit value read. + public native bool ReadBool(); + + // Reads a byte from a readable bitbuffer (bf_read). + // + // @return Byte value read (read as 8bit). + public native int ReadByte(); + + // Reads a character from a readable bitbuffer (bf_read). + // + // @return Character value read. + public native int ReadChar(); + + // Reads a 16bit integer from a readable bitbuffer (bf_read). + // + // @param bf bf_read handle to read from. + // @return Integer value read (read as 16bit). + public native int ReadShort(); + + // Reads a 16bit unsigned integer from a readable bitbuffer (bf_read). + // + // @param bf bf_read handle to read from. + // @return Integer value read (read as 16bit). + public native int ReadWord(); + + // Reads a normal integer to a readable bitbuffer (bf_read). + // + // @return Integer value read (read as 32bit). + public native int ReadNum(); + + // Reads a floating point number from a readable bitbuffer (bf_read). + // + // @return Floating point value read. + public native float ReadFloat(); + + // Reads a string from a readable bitbuffer (bf_read). + // + // @param buffer Destination string buffer. + // @param maxlength Maximum length of output string buffer. + // @param line If true the buffer will be copied until it reaches a '\n' or a null terminator. + // @return Number of bytes written to the buffer. If the bitbuffer stream overflowed, + // that is, had no terminator before the end of the stream, then a negative + // number will be returned equal to the number of characters written to the + // buffer minus 1. The buffer will be null terminated regardless of the + // return value. + public native int ReadString(char[] buffer, int maxlength, bool line=false); + + // Reads an entity from a readable bitbuffer (bf_read). + // + // @return Entity index read. + public native int ReadEntity(); + + // Reads a bit angle from a readable bitbuffer (bf_read). + // + // @param numBits Optional number of bits to use. + // @return Angle read. + public native float ReadAngle(int numBits=8); + + // Reads a coordinate from a readable bitbuffer (bf_read). + // + // @return Coordinate read. + public native float ReadCoord(); + + // Reads a 3D vector of coordinates from a readable bitbuffer (bf_read). + // + // @param coord Destination coordinate array. + public native void ReadVecCoord(float coord[3]); + + // Reads a 3D normal vector from a readable bitbuffer (bf_read). + // + // @param vec Destination vector array. + public native void ReadVecNormal(float vec[3]); + + // Reads a 3D angle vector from a readable bitbuffer (bf_read). + // + // @param angles Destination angle vector. + public native void ReadAngles(float angles[3]); + + // Returns the number of bytes left in a readable bitbuffer (bf_read). + property int BytesLeft { + public native get(); + } +}; + /** * Writes a single bit to a writable bitbuffer (bf_write). * * @param bf bf_write handle to write to. * @param bit Bit to write (true for 1, false for 0). - * @noreturn * @error Invalid or incorrect Handle. */ -native BfWriteBool(Handle:bf, bool:bit); +native void BfWriteBool(Handle bf, bool bit); /** * Writes a byte to a writable bitbuffer (bf_write). * * @param bf bf_write handle to write to. * @param byte Byte to write (value will be written as 8bit). - * @noreturn * @error Invalid or incorrect Handle. */ -native BfWriteByte(Handle:bf, byte); +native void BfWriteByte(Handle bf, int byte); /** * Writes a byte to a writable bitbuffer (bf_write). * * @param bf bf_write handle to write to. * @param chr Character to write. - * @noreturn * @error Invalid or incorrect Handle. */ -native BfWriteChar(Handle:bf, chr); +native void BfWriteChar(Handle bf, int chr); /** * Writes a 16bit integer to a writable bitbuffer (bf_write). * * @param bf bf_write handle to write to. * @param num Integer to write (value will be written as 16bit). - * @noreturn * @error Invalid or incorrect Handle. */ -native BfWriteShort(Handle:bf, num); +native void BfWriteShort(Handle bf, int num); /** * Writes a 16bit unsigned integer to a writable bitbuffer (bf_write). * * @param bf bf_write handle to write to. * @param num Integer to write (value will be written as 16bit). - * @noreturn * @error Invalid or incorrect Handle. */ -native BfWriteWord(Handle:bf, num); +native void BfWriteWord(Handle bf, int num); /** * Writes a normal integer to a writable bitbuffer (bf_write). * * @param bf bf_write handle to write to. * @param num Integer to write (value will be written as 32bit). - * @noreturn * @error Invalid or incorrect Handle. */ -native BfWriteNum(Handle:bf, num); +native void BfWriteNum(Handle bf, int num); /** * Writes a floating point number to a writable bitbuffer (bf_write). * * @param bf bf_write handle to write to. * @param num Number to write. - * @noreturn * @error Invalid or incorrect Handle. */ -native BfWriteFloat(Handle:bf, Float:num); +native void BfWriteFloat(Handle bf, float num); /** * Writes a string to a writable bitbuffer (bf_write). * * @param bf bf_write handle to write to. * @param string Text string to write. - * @noreturn * @error Invalid or incorrect Handle. */ -native BfWriteString(Handle:bf, const String:string[]); +native void BfWriteString(Handle bf, const char[] string); /** * Writes an entity to a writable bitbuffer (bf_write). @@ -121,10 +275,9 @@ native BfWriteString(Handle:bf, const String:string[]); * * @param bf bf_write handle to write to. * @param ent Entity index to write. - * @noreturn * @error Invalid or incorrect Handle, or invalid entity. */ -native BfWriteEntity(Handle:bf, ent); +native void BfWriteEntity(Handle bf, int ent); /** * Writes a bit angle to a writable bitbuffer (bf_write). @@ -132,30 +285,27 @@ native BfWriteEntity(Handle:bf, ent); * @param bf bf_write handle to write to. * @param angle Angle to write. * @param numBits Optional number of bits to use. - * @noreturn * @error Invalid or incorrect Handle. */ -native BfWriteAngle(Handle:bf, Float:angle, numBits=8); +native void BfWriteAngle(Handle bf, float angle, int numBits=8); /** * Writes a coordinate to a writable bitbuffer (bf_write). * * @param bf bf_write handle to write to. * @param coord Coordinate to write. - * @noreturn * @error Invalid or incorrect Handle. */ -native BfWriteCoord(Handle:bf, Float:coord); +native void BfWriteCoord(Handle bf, float coord); /** * Writes a 3D vector of coordinates to a writable bitbuffer (bf_write). * * @param bf bf_write handle to write to. * @param coord Coordinate array to write. - * @noreturn * @error Invalid or incorrect Handle. */ -native BfWriteVecCoord(Handle:bf, Float:coord[3]); +native void BfWriteVecCoord(Handle bf, float coord[3]); /** * Writes a 3D normal vector to a writable bitbuffer (bf_write). @@ -165,17 +315,16 @@ native BfWriteVecCoord(Handle:bf, Float:coord[3]); * @noreturn * @error Invalid or incorrect Handle. */ -native BfWriteVecNormal(Handle:bf, Float:vec[3]); +native void BfWriteVecNormal(Handle bf, float vec[3]); /** * Writes a 3D angle vector to a writable bitbuffer (bf_write). * * @param bf bf_write handle to write to. * @param angles Angle vector to write. - * @noreturn * @error Invalid or incorrect Handle. */ -native BfWriteAngles(Handle:bf, Float:angles[3]); +native void BfWriteAngles(Handle bf, float angles[3]); /** * Reads a single bit from a readable bitbuffer (bf_read). @@ -184,7 +333,7 @@ native BfWriteAngles(Handle:bf, Float:angles[3]); * @return Bit value read. * @error Invalid or incorrect Handle. */ -native bool:BfReadBool(Handle:bf); +native bool BfReadBool(Handle bf); /** * Reads a byte from a readable bitbuffer (bf_read). @@ -193,7 +342,7 @@ native bool:BfReadBool(Handle:bf); * @return Byte value read (read as 8bit). * @error Invalid or incorrect Handle. */ -native BfReadByte(Handle:bf); +native int BfReadByte(Handle bf); /** * Reads a character from a readable bitbuffer (bf_read). @@ -202,7 +351,7 @@ native BfReadByte(Handle:bf); * @return Character value read. * @error Invalid or incorrect Handle. */ -native BfReadChar(Handle:bf); +native int BfReadChar(Handle bf); /** * Reads a 16bit integer from a readable bitbuffer (bf_read). @@ -211,7 +360,7 @@ native BfReadChar(Handle:bf); * @return Integer value read (read as 16bit). * @error Invalid or incorrect Handle. */ -native BfReadShort(Handle:bf); +native int BfReadShort(Handle bf); /** * Reads a 16bit unsigned integer from a readable bitbuffer (bf_read). @@ -220,7 +369,7 @@ native BfReadShort(Handle:bf); * @return Integer value read (read as 16bit). * @error Invalid or incorrect Handle. */ -native BfReadWord(Handle:bf); +native int BfReadWord(Handle bf); /** * Reads a normal integer to a readable bitbuffer (bf_read). @@ -229,7 +378,7 @@ native BfReadWord(Handle:bf); * @return Integer value read (read as 32bit). * @error Invalid or incorrect Handle. */ -native BfReadNum(Handle:bf); +native int BfReadNum(Handle bf); /** * Reads a floating point number from a readable bitbuffer (bf_read). @@ -238,7 +387,7 @@ native BfReadNum(Handle:bf); * @return Floating point value read. * @error Invalid or incorrect Handle. */ -native Float:BfReadFloat(Handle:bf); +native float BfReadFloat(Handle bf); /** * Reads a string from a readable bitbuffer (bf_read). @@ -254,7 +403,7 @@ native Float:BfReadFloat(Handle:bf); * return value. * @error Invalid or incorrect Handle. */ -native BfReadString(Handle:bf, String:buffer[], maxlength, bool:line=false); +native int BfReadString(Handle bf, char[] buffer, int maxlength, bool line=false); /** * Reads an entity from a readable bitbuffer (bf_read). @@ -264,7 +413,7 @@ native BfReadString(Handle:bf, String:buffer[], maxlength, bool:line=false); * @return Entity index read. * @error Invalid or incorrect Handle. */ -native BfReadEntity(Handle:bf); +native int BfReadEntity(Handle bf); /** * Reads a bit angle from a readable bitbuffer (bf_read). @@ -274,7 +423,7 @@ native BfReadEntity(Handle:bf); * @return Angle read. * @error Invalid or incorrect Handle. */ -native Float:BfReadAngle(Handle:bf, numBits=8); +native float BfReadAngle(Handle bf, int numBits=8); /** * Reads a coordinate from a readable bitbuffer (bf_read). @@ -283,37 +432,34 @@ native Float:BfReadAngle(Handle:bf, numBits=8); * @return Coordinate read. * @error Invalid or incorrect Handle. */ -native Float:BfReadCoord(Handle:bf); +native float BfReadCoord(Handle bf); /** * Reads a 3D vector of coordinates from a readable bitbuffer (bf_read). * * @param bf bf_read handle to read from. * @param coord Destination coordinate array. - * @noreturn * @error Invalid or incorrect Handle. */ -native BfReadVecCoord(Handle:bf, Float:coord[3]); +native void BfReadVecCoord(Handle bf, float coord[3]); /** * Reads a 3D normal vector from a readable bitbuffer (bf_read). * * @param bf bf_read handle to read from. * @param vec Destination vector array. - * @noreturn * @error Invalid or incorrect Handle. */ -native BfReadVecNormal(Handle:bf, Float:vec[3]); +native void BfReadVecNormal(Handle bf, float vec[3]); /** * Reads a 3D angle vector from a readable bitbuffer (bf_read). * * @param bf bf_read handle to read from. * @param angles Destination angle vector. - * @noreturn * @error Invalid or incorrect Handle. */ -native BfReadAngles(Handle:bf, Float:angles[3]); +native void BfReadAngles(Handle bf, float angles[3]); /** * Returns the number of bytes left in a readable bitbuffer (bf_read). @@ -322,4 +468,4 @@ native BfReadAngles(Handle:bf, Float:angles[3]); * @return Number of bytes left unread. * @error Invalid or incorrect Handle. */ -native BfGetNumBytesLeft(Handle:bf); +native int BfGetNumBytesLeft(Handle bf); diff --git a/env/include/clientprefs.inc b/env/include/clientprefs.inc index c6ac023..d708e40 100644 --- a/env/include/clientprefs.inc +++ b/env/include/clientprefs.inc @@ -165,9 +165,16 @@ forward OnClientCookiesCached(client); * @param action CookieMenuAction being performed. * @param info Info data passed. * @param buffer Outbut buffer. - * @param maxlen Max length of the output buffer. + * @param maxlen Max length of the output buffer. + * @noreturn */ -functag public CookieMenuHandler(client, CookieMenuAction:action, any:info, String:buffer[], maxlen); +typedef CookieMenuHandler = function void ( + int client, + CookieMenuAction action, + any info, + char[] buffer, + int maxlen +); /** * Add a new prefab item to the client cookie settings menu. @@ -182,7 +189,7 @@ functag public CookieMenuHandler(client, CookieMenuAction:action, any:info, Stri * @noreturn * @error Invalid cookie handle. */ -native SetCookiePrefabMenu(Handle:cookie, CookieMenu:type, const String:display[], CookieMenuHandler:handler=CookieMenuHandler:-1, info=0); +native SetCookiePrefabMenu(Handle:cookie, CookieMenu:type, const String:display[], CookieMenuHandler:handler=INVALID_FUNCTION, info=0); /** * Adds a new item to the client cookie settings menu. diff --git a/env/include/clients.inc b/env/include/clients.inc index 13381c3..991d120 100644 --- a/env/include/clients.inc +++ b/env/include/clients.inc @@ -45,6 +45,25 @@ enum NetFlow NetFlow_Both, /**< Both values added together */ }; +/** + * Auth string types. + * + * Note that for the Steam2 and Steam3 types, the following ids are + * also valid values: + * "STEAM_ID_PENDING" - Authentication is pending. + * "STEAM_ID_LAN" - Authentication is disabled because of being on a LAN server. + * "BOT" - The client is a bot. + */ +enum AuthIdType +{ + AuthId_Engine = 0, /**< The game-specific auth string as returned from the engine */ + + // The following are only available on games that support Steam authentication. + AuthId_Steam2, /**< Steam2 rendered format, ex "STEAM_1:1:4153990" */ + AuthId_Steam3, /**< Steam3 rendered format, ex "[U:1:8307981]" */ + AuthId_SteamID64, /**< A SteamID64 (uint64) as a String, ex "76561197968573709" */ +}; + /** * MAXPLAYERS is not the same as MaxClients. * MAXPLAYERS is a hardcoded value as an upper limit. MaxClients changes based on the server. @@ -80,7 +99,7 @@ forward bool:OnClientConnect(client, String:rejectmsg[], maxlen); * @param client Client index. * @noreturn */ -forward OnClientConnected(client); +forward void OnClientConnected(client); /** * Called when a client is entering the game. @@ -96,7 +115,7 @@ forward OnClientConnected(client); * @param client Client index. * @noreturn */ -forward OnClientPutInServer(client); +forward void OnClientPutInServer(client); /** * Called when a client is disconnecting from the server. @@ -104,7 +123,7 @@ forward OnClientPutInServer(client); * @param client Client index. * @noreturn */ -forward OnClientDisconnect(client); +forward void OnClientDisconnect(client); /** * Called when a client is disconnected from the server. @@ -112,7 +131,7 @@ forward OnClientDisconnect(client); * @param client Client index. * @noreturn */ -forward OnClientDisconnect_Post(client); +forward void OnClientDisconnect_Post(client); /** * Called when a client is sending a command. @@ -132,20 +151,20 @@ forward Action:OnClientCommand(client, args); * @param client Client index. * @noreturn */ -forward OnClientSettingsChanged(client); +forward void OnClientSettingsChanged(client); /** - * Called when a client receives a Steam ID. The state of a client's + * Called when a client receives an auth ID. The state of a client's * authorization as an admin is not guaranteed here. Use * OnClientPostAdminCheck() if you need a client's admin status. * * This is called by bots, but the ID will be "BOT". * * @param client Client index. - * @param auth Client auth string. + * @param auth Client Steam2 id, if available, else engine auth id. * @noreturn */ -forward OnClientAuthorized(client, const String:auth[]); +forward void OnClientAuthorized(client, const String:auth[]); /** * Called once a client is authorized and fully in-game, but @@ -180,7 +199,7 @@ forward Action:OnClientPreAdminCheck(client); * @param client Client index. * @noreturn */ -forward OnClientPostAdminFilter(client); +forward void OnClientPostAdminFilter(client); /** * Called once a client is authorized and fully in-game, and @@ -192,7 +211,7 @@ forward OnClientPostAdminFilter(client); * @param client Client index. * @noreturn */ -forward OnClientPostAdminCheck(client); +forward void OnClientPostAdminCheck(client); /** * This function will be deprecated in a future release. Use the MaxClients variable instead. @@ -267,8 +286,24 @@ native bool:GetClientIP(client, String:ip[], maxlen, bool:remport=true); * @return True on success, false otherwise. * @error If the client is not connected or the index is invalid. */ +#pragma deprecated Use GetClientAuthId native bool:GetClientAuthString(client, String:auth[], maxlen, bool:validate=true); +/** + * Retrieves a client's authentication string (SteamID). + * + * @param client Player index. + * @param authType Auth id type and format to use. + * @param auth Buffer to store the client's auth id. + * @param maxlen Maximum length of string buffer (includes NULL terminator). + * @param validate Check backend validation status. + * DO NOT PASS FALSE UNLESS YOU UNDERSTAND THE CONSEQUENCES, + * You WILL KNOW if you need to use this, MOST WILL NOT. + * @return True on success, false otherwise. + * @error If the client is not connected or the index is invalid. + */ +native bool:GetClientAuthId(client, AuthIdType:authType, String:auth[], maxlen, bool:validate=true); + /** * Returns the client's Steam account ID. * diff --git a/env/include/commandfilters.inc b/env/include/commandfilters.inc index 6ea447c..2ddd5a5 100644 --- a/env/include/commandfilters.inc +++ b/env/include/commandfilters.inc @@ -140,7 +140,7 @@ stock ReplyToTargetError(client, reason) * @param clients Array to fill with unique, valid client indexes. * @return True if pattern was recognized, false otherwise. */ -functag public bool:MultiTargetFilter(const String:pattern[], Handle:clients); +typedef MultiTargetFilter = function bool (const char[] pattern, Handle clients); /** * Adds a multi-target filter function for ProcessTargetString(). diff --git a/env/include/commandline.inc b/env/include/commandline.inc new file mode 100644 index 0000000..291a8b6 --- /dev/null +++ b/env/include/commandline.inc @@ -0,0 +1,87 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This file is part of the SourceMod/SourcePawn SDK. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#if defined _commandline_included_ + #endinput +#endif +#define _commandline_included_ + +/** + * Gets the full command line the server was launched with. + * + * @param commandLine Buffer to store the command line in. + * @param maxlen Maximum length of the command line buffer. + * @return True if the command line is valid; otherwise, false. + * @error No command line available, or no mod support. + */ +native bool:GetCommandLine(String:commandLine[], maxlen); + +/** + * Gets the value of a command line parameter the server was launched with. + * + * @param param The command line parameter to get the value of. + * @param value Buffer to store the parameter value in. + * @param maxlen Maximum length of the value buffer. + * @param defValue The default value to return if the parameter wasn't specified. + * @return True if the command line is valid; otherwise, false. + * @error No command line available, or no mod support. + */ +native GetCommandLineParam(const String:param[], String:value[], maxlen, const String:defValue[]=""); + +/** + * Gets the value of a command line parameter the server was launched with. + * + * @param param The command line parameter to get the value of. + * @param defValue The default value to return if the parameter wasn't specified. + * @return The integer value of the command line parameter value. + * @error No command line available, or no mod support. + */ +native GetCommandLineParamInt(const String:param[], defValue=0); + +/** + * Gets the value of a command line parameter the server was launched with. + * + * @param param The command line parameter to get the value of. + * @param defValue The default value to return if the parameter wasn't specified. + * @return The floating point value of the command line parameter value. + * @error No command line available, or no mod support. + */ +native Float:GetCommandLineParamFloat(const String:param[], Float:defValue=0.0); + +/** + * Determines if a specific command line parameter is present. + * + * @param param The command line parameter to test. + * @return True if the command line parameter is specified; otherwise, false. + * @error No command line available, or no mod support. + */ +native bool:FindCommandLineParam(const String:param[]); diff --git a/env/include/console.inc b/env/include/console.inc index d89bcbc..3275041 100644 --- a/env/include/console.inc +++ b/env/include/console.inc @@ -29,7 +29,7 @@ * * Version: $Id$ */ - + #if defined _console_included #endinput #endif @@ -37,15 +37,6 @@ #define INVALID_FCVAR_FLAGS (-1) -/** - * Console variable bound values used with Get/SetConVarBounds() - */ -enum ConVarBounds -{ - ConVarBound_Upper = 0, - ConVarBound_Lower -}; - /** * Console variable query helper values. */ @@ -63,17 +54,6 @@ enum ReplySource SM_REPLY_TO_CHAT = 1, }; -/** - * Console variable query result values. - */ -enum ConVarQueryResult -{ - ConVarQuery_Okay = 0, /**< Retrieval of client convar value was successful. */ - ConVarQuery_NotFound, /**< Client convar was not found. */ - ConVarQuery_NotValid, /**< A console command with the same name was found, but there is no convar. */ - ConVarQuery_Protected /**< Client convar was found, but it is protected. The server cannot retrieve its value. */ -}; - /** * @section Flags for console commands and console variables. The descriptions * for each constant come directly from the Source SDK. @@ -328,7 +308,7 @@ native FormatActivitySource(client, target, const String:namebuf[], maxlength); * @return An Action value. Not handling the command * means that Source will report it as "not found." */ -functag public Action:SrvCmd(args); +typedef SrvCmd = function Action (int args); /** * Creates a server-only console command, or hooks an already existing one. @@ -352,7 +332,7 @@ native RegServerCmd(const String:cmd[], SrvCmd:callback, const String:descriptio * @return An Action value. Not handling the command * means that Source will report it as "not found." */ -functag public Action:ConCmd(client, args); +typedef ConCmd = function Action (int client, int args); /** * Creates a console command, or hooks an already existing one. @@ -424,293 +404,6 @@ native GetCmdArg(argnum, String:buffer[], maxlength); */ native GetCmdArgString(String:buffer[], maxlength); -/** - * Creates a new console variable. - * - * @param name Name of new convar. - * @param defaultValue String containing the default value of new convar. - * @param description Optional description of the convar. - * @param flags Optional bitstring of flags determining how the convar should be handled. See FCVAR_* constants for more details. - * @param hasMin Optional boolean that determines if the convar has a minimum value. - * @param min Minimum floating point value that the convar can have if hasMin is true. - * @param hasMax Optional boolean that determines if the convar has a maximum value. - * @param max Maximum floating point value that the convar can have if hasMax is true. - * @return A handle to the newly created convar. If the convar already exists, a handle to it will still be returned. - * @error Convar name is blank or is the same as an existing console command. - */ -native Handle:CreateConVar(const String:name[], const String:defaultValue[], const String:description[]="", flags=0, bool:hasMin=false, Float:min=0.0, bool:hasMax=false, Float:max=0.0); - -/** - * Searches for a console variable. - * - * @param name Name of convar to find. - * @return A handle to the convar if it is found. INVALID_HANDLE otherwise. - */ -native Handle:FindConVar(const String:name[]); - -/** - * Called when a console variable's value is changed. - * - * @param convar Handle to the convar that was changed. - * @param oldValue String containing the value of the convar before it was changed. - * @param newValue String containing the new value of the convar. - * @noreturn - */ -functag public ConVarChanged(Handle:convar, const String:oldValue[], const String:newValue[]); - -/** - * Creates a hook for when a console variable's value is changed. - * - * @param convar Handle to the convar. - * @param callback An OnConVarChanged function pointer. - * @noreturn - * @error Invalid or corrupt Handle or invalid callback function. - */ -native HookConVarChange(Handle:convar, ConVarChanged:callback); - -/** - * Removes a hook for when a console variable's value is changed. - * - * @param convar Handle to the convar. - * @param callback An OnConVarChanged function pointer. - * @noreturn - * @error Invalid or corrupt Handle, invalid callback function, or no active hook on convar. - */ -native UnhookConVarChange(Handle:convar, ConVarChanged:callback); - -/** - * Returns the boolean value of a console variable. - * - * @param convar Handle to the convar. - * @return The boolean value of the convar. - * @error Invalid or corrupt Handle. - */ -native bool:GetConVarBool(Handle:convar); - -/** - * Sets the boolean value of a console variable. - * - * Note: The replicate and notify params are only relevant for the original, Dark Messiah, and - * Episode 1 engines. Newer engines automatically do these things when the convar value is changed. - * - * @param convar Handle to the convar. - * @param value New boolean value. - * @param replicate If set to true, the new convar value will be set on all clients. - * This will only work if the convar has the FCVAR_REPLICATED flag - * and actually exists on clients. - * @param notify If set to true, clients will be notified that the convar has changed. - * This will only work if the convar has the FCVAR_NOTIFY flag. - * @noreturn - * @error Invalid or corrupt Handle. - */ -native SetConVarBool(Handle:convar, bool:value, bool:replicate=false, bool:notify=false); - -/** - * Returns the integer value of a console variable. - * - * @param convar Handle to the convar. - * @return The integer value of the convar. - * @error Invalid or corrupt Handle. - */ -native GetConVarInt(Handle:convar); - -/** - * Sets the integer value of a console variable. - * - * Note: The replicate and notify params are only relevant for the original, Dark Messiah, and - * Episode 1 engines. Newer engines automatically do these things when the convar value is changed. - * - * @param convar Handle to the convar. - * @param value New integer value. - * @param replicate If set to true, the new convar value will be set on all clients. - * This will only work if the convar has the FCVAR_REPLICATED flag - * and actually exists on clients. - * @param notify If set to true, clients will be notified that the convar has changed. - * This will only work if the convar has the FCVAR_NOTIFY flag. - * @noreturn - * @error Invalid or corrupt Handle. - */ -native SetConVarInt(Handle:convar, value, bool:replicate=false, bool:notify=false); - -/** - * Returns the floating point value of a console variable. - * - * @param convar Handle to the convar. - * @return The floating point value of the convar. - * @error Invalid or corrupt Handle. - */ -native Float:GetConVarFloat(Handle:convar); - -/** - * Sets the floating point value of a console variable. - * - * Note: The replicate and notify params are only relevant for the original, Dark Messiah, and - * Episode 1 engines. Newer engines automatically do these things when the convar value is changed. - * - * @param convar Handle to the convar. - * @param value New floating point value. - * @param replicate If set to true, the new convar value will be set on all clients. - * This will only work if the convar has the FCVAR_REPLICATED flag - * and actually exists on clients. - * @param notify If set to true, clients will be notified that the convar has changed. - * This will only work if the convar has the FCVAR_NOTIFY flag. - * @noreturn - * @error Invalid or corrupt Handle. - */ -native SetConVarFloat(Handle:convar, Float:value, bool:replicate=false, bool:notify=false); - -/** - * Retrieves the string value of a console variable. - * - * @param convar Handle to the convar. - * @param value Buffer to store the value of the convar. - * @param maxlength Maximum length of string buffer. - * @noreturn - * @error Invalid or corrupt Handle. - */ -native GetConVarString(Handle:convar, String:value[], maxlength); - -/** - * Sets the string value of a console variable. - * - * Note: The replicate and notify params are only relevant for the original, Dark Messiah, and - * Episode 1 engines. Newer engines automatically do these things when the convar value is changed. - * - * @param convar Handle to the convar. - * @param value New string value. - * @param replicate If set to true, the new convar value will be set on all clients. - * This will only work if the convar has the FCVAR_REPLICATED flag - * and actually exists on clients. - * @param notify If set to true, clients will be notified that the convar has changed. - * This will only work if the convar has the FCVAR_NOTIFY flag. - * @noreturn - * @error Invalid or corrupt Handle. - */ -native SetConVarString(Handle:convar, const String:value[], bool:replicate=false, bool:notify=false); - -/** - * Resets the console variable to its default value. - * - * Note: The replicate and notify params are only relevant for the original, Dark Messiah, and - * Episode 1 engines. Newer engines automatically do these things when the convar value is changed. - * - * @param convar Handle to the convar. - * @param replicate If set to true, the new convar value will be set on all clients. - * This will only work if the convar has the FCVAR_REPLICATED flag - * and actually exists on clients. - * @param notify If set to true, clients will be notified that the convar has changed. - * This will only work if the convar has the FCVAR_NOTIFY flag. - * @noreturn - * @error Invalid or corrupt Handle. - */ -native ResetConVar(Handle:convar, bool:replicate=false, bool:notify=false); - -/** - * Retrieves the default string value of a console variable. - * - * @param convar Handle to the convar. - * @param value Buffer to store the default value of the convar. - * @param maxlength Maximum length of string buffer. - * @return Number of bytes written to the buffer (UTF-8 safe). - * @error Invalid or corrupt Handle. - */ -native GetConVarDefault(Handle:convar, String:value[], maxlength); - -/** - * Returns the bitstring of flags on a console variable. - * - * @param convar Handle to the convar. - * @return A bitstring containing the FCVAR_* flags that are enabled. - * @error Invalid or corrupt Handle. - */ -native GetConVarFlags(Handle:convar); - -/** - * Sets the bitstring of flags on a console variable. - * - * @param convar Handle to the convar. - * @param flags A bitstring containing the FCVAR_* flags to enable. - * @noreturn - * @error Invalid or corrupt Handle. - */ -native SetConVarFlags(Handle:convar, flags); - -/** - * Retrieves the specified bound of a console variable. - * - * @param convar Handle to the convar. - * @param type Type of bound to retrieve, ConVarBound_Lower or ConVarBound_Upper. - * @param value By-reference cell to store the specified floating point bound value. - * @return True if the convar has the specified bound set, false otherwise. - * @error Invalid or corrupt Handle. - */ -native bool:GetConVarBounds(Handle:convar, ConVarBounds:type, &Float:value); - -/** - * Sets the specified bound of a console variable. - * - * @param convar Handle to the convar. - * @param type Type of bound to set, ConVarBound_Lower or ConVarBound_Upper - * @param set If set to true, convar will use specified bound. If false, bound will be removed. - * @param value Floating point value to use as the specified bound. - * @noreturn - * @error Invalid or corrupt Handle. - */ -native SetConVarBounds(Handle:convar, ConVarBounds:type, bool:set, Float:value=0.0); - -/** - * Retrieves the name of a console variable. - * - * @param convar Handle to the convar. - * @param name Buffer to store the name of the convar. - * @param maxlength Maximum length of string buffer. - * @noreturn - * @error Invalid or corrupt Handle. - */ -native GetConVarName(Handle:convar, String:name[], maxlength); - -funcenum ConVarQueryFinished -{ - /** - * Called when a query to retrieve a client's console variable has finished. - * - * @param cookie Unique identifier of query. - * @param client Player index. - * @param result Result of query that tells one whether or not query was successful. - * See ConVarQueryResult enum for more details. - * @param convarName Name of client convar that was queried. - * @param convarValue Value of client convar that was queried if successful. This will be "" if it was not. - * @param value Value that was passed when query was started. - * @noreturn - */ - public(QueryCookie:cookie, client, ConVarQueryResult:result, const String:cvarName[], const String:cvarValue[], any:value), - - /** - * Called when a query to retrieve a client's console variable has finished. - * - * @param cookie Unique identifier of query. - * @param client Player index. - * @param result Result of query that tells one whether or not query was successful. - * See ConVarQueryResult enum for more details. - * @param convarName Name of client convar that was queried. - * @param convarValue Value of client convar that was queried if successful. This will be "" if it was not. - * @noreturn - */ - public(QueryCookie:cookie, client, ConVarQueryResult:result, const String:cvarName[], const String:cvarValue[]) -}; - -/** - * Starts a query to retrieve the value of a client's console variable. - * - * @param client Player index. - * @param cvarName Name of client convar to query. - * @param callback A function to use as a callback when the query has finished. - * @param value Optional value to pass to the callback function. - * @return A cookie that uniquely identifies the query. - * Returns QUERYCOOKIE_FAILED on failure, such as when used on a bot. - */ -native QueryCookie:QueryClientConVar(client, const String:cvarName[], ConVarQueryFinished:callback, any:value=0); - /** * Gets a command iterator. Must be freed with CloseHandle(). * @@ -781,17 +474,6 @@ native bool:CheckAccess(AdminId:id, flags, bool:override_only=false); -/** - * Returns true if the supplied character is valid in a ConVar name. - * - * @param c Character to validate. - * @return True is valid for ConVars, false otherwise - */ -stock bool:IsValidConVarChar(c) -{ - return (c == '_' || IsCharAlpha(c) || IsCharNumeric(c)); -} - /** * Returns the bitstring of flags of a command. * @@ -850,17 +532,6 @@ native Handle:FindFirstConCommand(String:buffer[], max_size, &bool:isCommand, &f */ native bool:FindNextConCommand(Handle:search, String:buffer[], max_size, &bool:isCommand, &flags=0, String:description[]="", descrmax_size=0); -/** - * Replicates a convar value to a specific client. This does not change the actual convar value. - * - * @param client Client index - * @param convar ConVar handle - * @param value String value to send - * @return True on success, false on failure - * @error Invalid client index, client not in game, or client is fake - */ -native bool:SendConVarValue(client, Handle:convar, const String:value[]); - /** * Adds an informational string to the server's public "tags". * This string should be a short, unique identifier. @@ -905,7 +576,7 @@ native RemoveServerTag(const String:tag[]); * @param argc Argument count. * @return Action to take (see extended notes above). */ -functag public Action:CommandListener(client, const String:command[], argc); +typedef CommandListener = function Action (int client, const char[] command, int argc); #define FEATURECAP_COMMANDLISTENER "command listener" @@ -968,4 +639,4 @@ forward Action:OnClientSayCommand(client, const String:command[], const String:s * @param sArgs Chat argument string. * */ -forward OnClientSayCommand_Post(client, const String:command[], const String:sArgs[]); +forward void OnClientSayCommand_Post(int client, const char[] command, const char[] sArgs); diff --git a/env/include/convars.inc b/env/include/convars.inc new file mode 100644 index 0000000..bc7c345 --- /dev/null +++ b/env/include/convars.inc @@ -0,0 +1,493 @@ +/** + * vim: set ts=4 sw=4 tw=99 noet : + * ============================================================================= + * SourceMod (C)2004-2014 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This file is part of the SourceMod/SourcePawn SDK. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +/** + * Console variable bound values used with Get/SetConVarBounds() + */ +enum ConVarBounds +{ + ConVarBound_Upper = 0, + ConVarBound_Lower +}; + +/** + * Console variable query result values. + */ +enum ConVarQueryResult +{ + ConVarQuery_Okay = 0, //< Retrieval of client convar value was successful. */ + ConVarQuery_NotFound, //< Client convar was not found. */ + ConVarQuery_NotValid, //< A console command with the same name was found, but there is no convar. */ + ConVarQuery_Protected //< Client convar was found, but it is protected. The server cannot retrieve its value. */ +}; + +// Called when a console variable's value is changed. +// +// @param convar Handle to the convar that was changed. +// @param oldValue String containing the value of the convar before it was changed. +// @param newValue String containing the new value of the convar. +typedef ConVarChanged = function void (ConVar convar, const char[] oldValue, const char[] newValue); + +// Creates a new console variable. +// +// @param name Name of new convar. +// @param defaultValue String containing the default value of new convar. +// @param description Optional description of the convar. +// @param flags Optional bitstring of flags determining how the convar should be handled. See FCVAR_* constants for more details. +// @param hasMin Optional boolean that determines if the convar has a minimum value. +// @param min Minimum floating point value that the convar can have if hasMin is true. +// @param hasMax Optional boolean that determines if the convar has a maximum value. +// @param max Maximum floating point value that the convar can have if hasMax is true. +// @return A handle to the newly created convar. If the convar already exists, a handle to it will still be returned. +// @error Convar name is blank or is the same as an existing console command. +native ConVar CreateConVar( + const char[] name, + const char[] defaultValue, + const char[] description="", + int flags=0, + bool hasMin=false, float min=0.0, + bool hasMax=false, float max=0.0); + +// Searches for a console variable. +// +// @param name Name of convar to find. +// @return A ConVar object if found; null otherwise. +native ConVar FindConVar(const char[] name); + +// A ConVar is a configurable, named setting in the srcds console. +methodmap ConVar < Handle +{ + // Retrieves or sets a boolean value for the convar. + property bool BoolValue { + public native get(); + public native set(bool b); + } + + // Retrieves or sets an integer value for the convar. + property int IntValue { + public native get(); + public native set(int value); + } + + // Retrieves or sets a float value for the convar. + property float FloatValue { + public native get(); + public native set(float value); + } + + // Gets or sets the flag bits (FCVAR_*) on the convar. + property int Flags { + public native get(); + public native set(int flags); + } + + // Sets the boolean value of a console variable. + // + // Note: The replicate and notify params are only relevant for the + // original, Dark Messiah, and Episode 1 engines. Newer engines + // automatically do these things when the convar value is changed. + // + // @param value New boolean value. + // @param replicate If set to true, the new convar value will be set on all clients. + // This will only work if the convar has the FCVAR_REPLICATED flag + // and actually exists on clients. + // @param notify If set to true, clients will be notified that the convar has changed. + // This will only work if the convar has the FCVAR_NOTIFY flag. + public native void SetBool(bool value, bool replicate=false, bool notify=false); + + // Sets the integer value of a console variable. + // + // Note: The replicate and notify params are only relevant for the + // original, Dark Messiah, and Episode 1 engines. Newer engines + // automatically do these things when the convar value is changed. + // + // @param value New integer value. + // @param replicate If set to true, the new convar value will be set on all clients. + // This will only work if the convar has the FCVAR_REPLICATED flag + // and actually exists on clients. + // @param notify If set to true, clients will be notified that the convar has changed. + // This will only work if the convar has the FCVAR_NOTIFY flag. + public native void SetInt(int value, bool replicate=false, bool notify=false); + + // Sets the floating point value of a console variable. + // + // Note: The replicate and notify params are only relevant for the + // original, Dark Messiah, and Episode 1 engines. Newer engines + // automatically do these things when the convar value is changed. + // + // @param value New floating point value. + // @param replicate If set to true, the new convar value will be set on all clients. + // This will only work if the convar has the FCVAR_REPLICATED flag + // and actually exists on clients. + // @param notify If set to true, clients will be notified that the convar has changed. + // This will only work if the convar has the FCVAR_NOTIFY flag. + public native void SetFloat(float value, bool replicate=false, bool notify=false); + + // Retrieves the string value of a console variable. + // + // @param convar Handle to the convar. + // @param value Buffer to store the value of the convar. + // @param maxlength Maximum length of string buffer. + public native void GetString(char[] value, int maxlength); + + // Sets the string value of a console variable. + // + // Note: The replicate and notify params are only relevant for the + // original, Dark Messiah, and Episode 1 engines. Newer engines + // automatically do these things when the convar value is changed. + // + // @param value New string value. + // @param replicate If set to true, the new convar value will be set on all clients. + // This will only work if the convar has the FCVAR_REPLICATED flag + // and actually exists on clients. + // @param notify If set to true, clients will be notified that the convar has changed. + // This will only work if the convar has the FCVAR_NOTIFY flag. + public native void SetString(const char[] value, bool replicate=false, bool notify=false); + + // Resets the console variable to its default value. + // + // Note: The replicate and notify params are only relevant for the + // original, Dark Messiah, and Episode 1 engines. Newer engines + // automatically do these things when the convar value is changed. + // + // @param replicate If set to true, the new convar value will be set on all clients. + // This will only work if the convar has the FCVAR_REPLICATED flag + // and actually exists on clients. + // @param notify If set to true, clients will be notified that the convar has changed. + // This will only work if the convar has the FCVAR_NOTIFY flag. + public native void RestoreDefault(bool replicate=false, bool notify=false); + + // Retrieves the default string value of a console variable. + // + // @param value Buffer to store the default value of the convar. + // @param maxlength Maximum length of string buffer. + // @return Number of bytes written to the buffer (UTF-8 safe). + public native int GetDefault(char[] value, int maxlength); + + // Retrieves the specified bound of a console variable. + // + // @param type Type of bound to retrieve, ConVarBound_Lower or ConVarBound_Upper. + // @param value By-reference cell to store the specified floating point bound value. + // @return True if the convar has the specified bound set, false otherwise. + public native bool GetBounds(ConVarBounds type, float &value); + + // Sets the specified bound of a console variable. + // + // @param type Type of bound to set, ConVarBound_Lower or ConVarBound_Upper + // @param set If set to true, convar will use specified bound. If false, bound will be removed. + // @param value Floating point value to use as the specified bound. + public native void SetBounds(ConVarBounds type, bool set, float value=0.0); + + // Retrieves the name of a console variable. + // + // @param name Buffer to store the name of the convar. + // @param maxlength Maximum length of string buffer. + public native void GetName(char[] name, maxlength); + + // Replicates a convar value to a specific client. This does not change the actual convar value. + // + // @param client Client index + // @param value String value to send + // @return True on success, false on failure + // @error Invalid client index, client not in game, or client is fake + public native bool ReplicateToClient(int client, const char[] value); + + // Creates a hook for when a console variable's value is changed. + // + // @param callback An OnConVarChanged function pointer. + public native void AddChangeHook(ConVarChanged callback); + + // Removes a hook for when a console variable's value is changed. + // + // @param convar Handle to the convar. + // @param callback An OnConVarChanged function pointer. + // @error No active hook on convar. + public native void RemoveChangeHook(ConVarChanged callback); +} + +/** + * Creates a hook for when a console variable's value is changed. + * + * @param convar Handle to the convar. + * @param callback An OnConVarChanged function pointer. + * @error Invalid or corrupt Handle or invalid callback function. + */ +native void HookConVarChange(Handle convar, ConVarChanged callback); + +/** + * Removes a hook for when a console variable's value is changed. + * + * @param convar Handle to the convar. + * @param callback An OnConVarChanged function pointer. + * @error Invalid or corrupt Handle, invalid callback function, or no active hook on convar. + */ +native void UnhookConVarChange(Handle convar, ConVarChanged callback); + +/** + * Returns the boolean value of a console variable. + * + * @param convar Handle to the convar. + * @return The boolean value of the convar. + * @error Invalid or corrupt Handle. + */ +native bool GetConVarBool(Handle convar); + +/** + * Sets the boolean value of a console variable. + * + * Note: The replicate and notify params are only relevant for the original, Dark Messiah, and + * Episode 1 engines. Newer engines automatically do these things when the convar value is changed. + * + * @param convar Handle to the convar. + * @param value New boolean value. + * @param replicate If set to true, the new convar value will be set on all clients. + * This will only work if the convar has the FCVAR_REPLICATED flag + * and actually exists on clients. + * @param notify If set to true, clients will be notified that the convar has changed. + * This will only work if the convar has the FCVAR_NOTIFY flag. + * @error Invalid or corrupt Handle. + */ +native void SetConVarBool(Handle convar, bool value, bool replicate=false, bool notify=false); + +/** + * Returns the integer value of a console variable. + * + * @param convar Handle to the convar. + * @return The integer value of the convar. + * @error Invalid or corrupt Handle. + */ +native int GetConVarInt(Handle convar); + +/** + * Sets the integer value of a console variable. + * + * Note: The replicate and notify params are only relevant for the original, Dark Messiah, and + * Episode 1 engines. Newer engines automatically do these things when the convar value is changed. + * + * @param convar Handle to the convar. + * @param value New integer value. + * @param replicate If set to true, the new convar value will be set on all clients. + * This will only work if the convar has the FCVAR_REPLICATED flag + * and actually exists on clients. + * @param notify If set to true, clients will be notified that the convar has changed. + * This will only work if the convar has the FCVAR_NOTIFY flag. + * @error Invalid or corrupt Handle. + */ +native void SetConVarInt(Handle convar, int value, bool replicate=false, bool notify=false); + +/** + * Returns the floating point value of a console variable. + * + * @param convar Handle to the convar. + * @return The floating point value of the convar. + * @error Invalid or corrupt Handle. + */ +native float GetConVarFloat(Handle convar); + +/** + * Sets the floating point value of a console variable. + * + * Note: The replicate and notify params are only relevant for the original, Dark Messiah, and + * Episode 1 engines. Newer engines automatically do these things when the convar value is changed. + * + * @param convar Handle to the convar. + * @param value New floating point value. + * @param replicate If set to true, the new convar value will be set on all clients. + * This will only work if the convar has the FCVAR_REPLICATED flag + * and actually exists on clients. + * @param notify If set to true, clients will be notified that the convar has changed. + * This will only work if the convar has the FCVAR_NOTIFY flag. + * @error Invalid or corrupt Handle. + */ +native void SetConVarFloat(Handle convar, float value, bool replicate=false, bool notify=false); + +/** + * Retrieves the string value of a console variable. + * + * @param convar Handle to the convar. + * @param value Buffer to store the value of the convar. + * @param maxlength Maximum length of string buffer. + * @error Invalid or corrupt Handle. + */ +native void GetConVarString(Handle convar, char[] value, int maxlength); + +/** + * Sets the string value of a console variable. + * + * Note: The replicate and notify params are only relevant for the original, Dark Messiah, and + * Episode 1 engines. Newer engines automatically do these things when the convar value is changed. + * + * @param convar Handle to the convar. + * @param value New string value. + * @param replicate If set to true, the new convar value will be set on all clients. + * This will only work if the convar has the FCVAR_REPLICATED flag + * and actually exists on clients. + * @param notify If set to true, clients will be notified that the convar has changed. + * This will only work if the convar has the FCVAR_NOTIFY flag. + * @error Invalid or corrupt Handle. + */ +native void SetConVarString(Handle convar, const char[] value, bool replicate=false, bool notify=false); + +/** + * Resets the console variable to its default value. + * + * Note: The replicate and notify params are only relevant for the original, Dark Messiah, and + * Episode 1 engines. Newer engines automatically do these things when the convar value is changed. + * + * @param convar Handle to the convar. + * @param replicate If set to true, the new convar value will be set on all clients. + * This will only work if the convar has the FCVAR_REPLICATED flag + * and actually exists on clients. + * @param notify If set to true, clients will be notified that the convar has changed. + * This will only work if the convar has the FCVAR_NOTIFY flag. + * @error Invalid or corrupt Handle. + */ +native void ResetConVar(Handle convar, bool replicate=false, bool notify=false); + +/** + * Retrieves the default string value of a console variable. + * + * @param convar Handle to the convar. + * @param value Buffer to store the default value of the convar. + * @param maxlength Maximum length of string buffer. + * @return Number of bytes written to the buffer (UTF-8 safe). + * @error Invalid or corrupt Handle. + */ +native int GetConVarDefault(Handle convar, char[] value, int maxlength); + +/** + * Returns the bitstring of flags on a console variable. + * + * @param convar Handle to the convar. + * @return A bitstring containing the FCVAR_* flags that are enabled. + * @error Invalid or corrupt Handle. + */ +native int GetConVarFlags(Handle convar); + +/** + * Sets the bitstring of flags on a console variable. + * + * @param convar Handle to the convar. + * @param flags A bitstring containing the FCVAR_* flags to enable. + * @error Invalid or corrupt Handle. + */ +native void SetConVarFlags(Handle convar, flags); + +/** + * Retrieves the specified bound of a console variable. + * + * @param convar Handle to the convar. + * @param type Type of bound to retrieve, ConVarBound_Lower or ConVarBound_Upper. + * @param value By-reference cell to store the specified floating point bound value. + * @return True if the convar has the specified bound set, false otherwise. + * @error Invalid or corrupt Handle. + */ +native bool GetConVarBounds(Handle convar, ConVarBounds type, float &value); + +/** + * Sets the specified bound of a console variable. + * + * @param convar Handle to the convar. + * @param type Type of bound to set, ConVarBound_Lower or ConVarBound_Upper + * @param set If set to true, convar will use specified bound. If false, bound will be removed. + * @param value Floating point value to use as the specified bound. + * @error Invalid or corrupt Handle. + */ +native void SetConVarBounds(Handle convar, ConVarBounds type, bool set, float value=0.0); + +/** + * Retrieves the name of a console variable. + * + * @param convar Handle to the convar. + * @param name Buffer to store the name of the convar. + * @param maxlength Maximum length of string buffer. + * @error Invalid or corrupt Handle. + */ +native void GetConVarName(Handle convar, char[] name, maxlength); + +/** + * Replicates a convar value to a specific client. This does not change the actual convar value. + * + * @param client Client index + * @param convar ConVar handle + * @param value String value to send + * @return True on success, false on failure + * @error Invalid client index, client not in game, or client is fake + */ +native bool SendConVarValue(int client, Handle convar, const char[] value); + +typeset ConVarQueryFinished +{ + // Called when a query to retrieve a client's console variable has finished. + // + // @param cookie Unique identifier of query. + // @param client Player index. + // @param result Result of query that tells one whether or not query was successful. + // See ConVarQueryResult enum for more details. + // @param convarName Name of client convar that was queried. + // @param convarValue Value of client convar that was queried if successful. This will be "" if it was not. + // @param value Value that was passed when query was started. + function void (QueryCookie cookie, int client, ConVarQueryResult result, const char[] cvarName, const char[] cvarValue, any value); + + // Called when a query to retrieve a client's console variable has finished. + // + // @param cookie Unique identifier of query. + // @param client Player index. + // @param result Result of query that tells one whether or not query was successful. + // See ConVarQueryResult enum for more details. + // @param convarName Name of client convar that was queried. + // @param convarValue Value of client convar that was queried if successful. This will be "" if it was not. + function void (QueryCookie cookie, int client, ConVarQueryResult result, const char[] cvarName, const char[] cvarValue); +}; + +/** + * Starts a query to retrieve the value of a client's console variable. + * + * @param client Player index. + * @param cvarName Name of client convar to query. + * @param callback A function to use as a callback when the query has finished. + * @param value Optional value to pass to the callback function. + * @return A cookie that uniquely identifies the query. + * Returns QUERYCOOKIE_FAILED on failure, such as when used on a bot. + */ +native QueryCookie QueryClientConVar(int client, const char[] cvarName, ConVarQueryFinished callback, any value=0); + +/** + * Returns true if the supplied character is valid in a ConVar name. + * + * @param c Character to validate. + * @return True is valid for ConVars, false otherwise + */ +stock bool IsValidConVarChar(int c) +{ + return (c == '_' || IsCharAlpha(c) || IsCharNumeric(c)); +} diff --git a/env/include/core.inc b/env/include/core.inc index 262e186..7eeee7c 100644 --- a/env/include/core.inc +++ b/env/include/core.inc @@ -42,18 +42,10 @@ struct PlVers { - version, - String:filevers[], - String:date[], - String:time[] -}; - -/** - * Function helper values. - */ -enum Function -{ - INVALID_FUNCTION = -1, + public int version; + public const char[] filevers; + public const char[] date; + public const char[] time; }; /** @@ -103,7 +95,19 @@ enum PluginStatus }; /** - * Plugin information properties. + * Plugin information properties. Plugins can declare a global variable with + * their info. Example, + * + * public Plugin:myinfo = { + * name = "Admin Help", + * author = "AlliedModders LLC", + * description = "Display command information", + * version = "1.0", + * url = "http://www.sourcemod.net/" + * }; + * + * SourceMod will display this information when a user inspects plugins in the + * console. */ enum PluginInfo { @@ -119,10 +123,10 @@ enum PluginInfo */ struct Extension { - const String:name[], /**< Short name */ - const String:file[], /**< Default file name */ - bool:autoload, /**< Whether or not to auto-load */ - bool:required, /**< Whether or not to require */ + public const char[] name; /**< Short name */ + public const char[] file; /**< Default file name */ + public bool autoload; /**< Whether or not to auto-load */ + public bool required; /**< Whether or not to require */ }; /** @@ -130,9 +134,9 @@ struct Extension */ struct SharedPlugin { - const String:name[], /**< Short name */ - const String:file[], /**< File name */ - bool:required, /**< Whether or not to require */ + public const char[] name; /**< Short name */ + public const char[] file; /**< File name */ + public bool required; /**< Whether or not to require */ }; public Float:NULL_VECTOR[3]; /**< Pass this into certain functions to act as a C++ NULL */ @@ -197,6 +201,36 @@ public __ext_core_SetNTVOptional() MarkNativeAsOptional("BfReadVecNormal"); MarkNativeAsOptional("BfReadAngles"); MarkNativeAsOptional("BfGetNumBytesLeft"); + + MarkNativeAsOptional("BfWrite.WriteBool"); + MarkNativeAsOptional("BfWrite.WriteByte"); + MarkNativeAsOptional("BfWrite.WriteChar"); + MarkNativeAsOptional("BfWrite.WriteShort"); + MarkNativeAsOptional("BfWrite.WriteWord"); + MarkNativeAsOptional("BfWrite.WriteNum"); + MarkNativeAsOptional("BfWrite.WriteFloat"); + MarkNativeAsOptional("BfWrite.WriteString"); + MarkNativeAsOptional("BfWrite.WriteEntity"); + MarkNativeAsOptional("BfWrite.WriteAngle"); + MarkNativeAsOptional("BfWrite.WriteCoord"); + MarkNativeAsOptional("BfWrite.WriteVecCoord"); + MarkNativeAsOptional("BfWrite.WriteVecNormal"); + MarkNativeAsOptional("BfWrite.WriteAngles"); + MarkNativeAsOptional("BfRead.ReadBool"); + MarkNativeAsOptional("BfRead.ReadByte"); + MarkNativeAsOptional("BfRead.ReadChar"); + MarkNativeAsOptional("BfRead.ReadShort"); + MarkNativeAsOptional("BfRead.ReadWord"); + MarkNativeAsOptional("BfRead.ReadNum"); + MarkNativeAsOptional("BfRead.ReadFloat"); + MarkNativeAsOptional("BfRead.ReadString"); + MarkNativeAsOptional("BfRead.ReadEntity"); + MarkNativeAsOptional("BfRead.ReadAngle"); + MarkNativeAsOptional("BfRead.ReadCoord"); + MarkNativeAsOptional("BfRead.ReadVecCoord"); + MarkNativeAsOptional("BfRead.ReadVecNormal"); + MarkNativeAsOptional("BfRead.ReadAngles"); + MarkNativeAsOptional("BfRead.GetNumBytesLeft"); MarkNativeAsOptional("PbReadInt"); MarkNativeAsOptional("PbReadFloat"); @@ -227,6 +261,36 @@ public __ext_core_SetNTVOptional() MarkNativeAsOptional("PbReadMessage"); MarkNativeAsOptional("PbReadRepeatedMessage"); MarkNativeAsOptional("PbAddMessage"); + + MarkNativeAsOptional("Protobuf.ReadInt"); + MarkNativeAsOptional("Protobuf.ReadFloat"); + MarkNativeAsOptional("Protobuf.ReadBool"); + MarkNativeAsOptional("Protobuf.ReadString"); + MarkNativeAsOptional("Protobuf.ReadColor"); + MarkNativeAsOptional("Protobuf.ReadAngle"); + MarkNativeAsOptional("Protobuf.ReadVector"); + MarkNativeAsOptional("Protobuf.ReadVector2D"); + MarkNativeAsOptional("Protobuf.GetRepeatedFieldCount"); + MarkNativeAsOptional("Protobuf.SetInt"); + MarkNativeAsOptional("Protobuf.SetFloat"); + MarkNativeAsOptional("Protobuf.SetBool"); + MarkNativeAsOptional("Protobuf.SetString"); + MarkNativeAsOptional("Protobuf.SetColor"); + MarkNativeAsOptional("Protobuf.SetAngle"); + MarkNativeAsOptional("Protobuf.SetVector"); + MarkNativeAsOptional("Protobuf.SetVector2D"); + MarkNativeAsOptional("Protobuf.AddInt"); + MarkNativeAsOptional("Protobuf.AddFloat"); + MarkNativeAsOptional("Protobuf.AddBool"); + MarkNativeAsOptional("Protobuf.AddString"); + MarkNativeAsOptional("Protobuf.AddColor"); + MarkNativeAsOptional("Protobuf.AddAngle"); + MarkNativeAsOptional("Protobuf.AddVector"); + MarkNativeAsOptional("Protobuf.AddVector2D"); + MarkNativeAsOptional("Protobuf.RemoveRepeatedFieldValue"); + MarkNativeAsOptional("Protobuf.ReadMessage"); + MarkNativeAsOptional("Protobuf.ReadRepeatedMessage"); + MarkNativeAsOptional("Protobuf.AddMessage"); VerifyCoreVersion(); } diff --git a/env/include/datapack.inc b/env/include/datapack.inc index ce3d8b7..c8fc2cd 100644 --- a/env/include/datapack.inc +++ b/env/include/datapack.inc @@ -40,7 +40,7 @@ * * @return A Handle to the data pack. Must be closed with CloseHandle(). */ -native Handle:CreateDataPack(); +native DataPack CreateDataPack(); /** * Packs a normal cell into a data pack. @@ -50,7 +50,7 @@ native Handle:CreateDataPack(); * @noreturn * @error Invalid handle. */ -native WritePackCell(Handle:pack, any:cell); +native void WritePackCell(Handle pack, any cell); /** * Packs a float into a data pack. @@ -60,7 +60,7 @@ native WritePackCell(Handle:pack, any:cell); * @noreturn * @error Invalid handle. */ -native WritePackFloat(Handle:pack, Float:val); +native void WritePackFloat(Handle pack, float val); /** * Packs a string into a data pack. @@ -70,7 +70,17 @@ native WritePackFloat(Handle:pack, Float:val); * @noreturn * @error Invalid handle. */ -native WritePackString(Handle:pack, const String:str[]); +native void WritePackString(Handle pack, const char[] str); + +/** + * Packs a function pointer into a data pack. + * + * @param pack Handle to the data pack. + * @param fktptr Function pointer to add. + * @noreturn + * @error Invalid handle. + */ +native void WritePackFunction(Handle pack, Function fktptr); /** * Reads a cell from a data pack. @@ -79,7 +89,7 @@ native WritePackString(Handle:pack, const String:str[]); * @return Cell value. * @error Invalid handle, or bounds error. */ -native any:ReadPackCell(Handle:pack); +native any ReadPackCell(Handle pack); /** * Reads a float from a data pack. @@ -88,7 +98,7 @@ native any:ReadPackCell(Handle:pack); * @return Float value. * @error Invalid handle, or bounds error. */ -native Float:ReadPackFloat(Handle:pack); +native float ReadPackFloat(Handle pack); /** * Reads a string from a data pack. @@ -99,7 +109,16 @@ native Float:ReadPackFloat(Handle:pack); * @noreturn * @error Invalid handle, or bounds error. */ -native ReadPackString(Handle:pack, String:buffer[], maxlen); +native void ReadPackString(Handle pack, char[] buffer, maxlen); + +/** + * Reads a function pointer from a data pack. + * + * @param pack Handle to the data pack. + * @return Function pointer. + * @error Invalid handle, or bounds error. + */ +native Function ReadPackFunction(Handle pack); /** * Resets the position in a data pack. @@ -109,7 +128,7 @@ native ReadPackString(Handle:pack, String:buffer[], maxlen); * @noreturn * @error Invalid handle. */ -native ResetPack(Handle:pack, bool:clear=false); +native void ResetPack(Handle pack, bool clear=false); /** * Returns the read or write position in a data pack. @@ -118,7 +137,7 @@ native ResetPack(Handle:pack, bool:clear=false); * @return Numerical position in the data pack. * @error Invalid handle. */ -native GetPackPosition(Handle:pack); +native int GetPackPosition(Handle pack); /** * Sets the read/write position in a data pack. @@ -128,7 +147,7 @@ native GetPackPosition(Handle:pack); * @noreturn * @error Invalid handle, or position is beyond the pack bounds. */ -native SetPackPosition(Handle:pack, position); +native void SetPackPosition(Handle pack, int position); /** * Returns whether or not a specified number of bytes from the data pack @@ -139,4 +158,25 @@ native SetPackPosition(Handle:pack, position); * @return True if can be read, false otherwise. * @error Invalid handle. */ -native bool:IsPackReadable(Handle:pack, bytes); +native bool IsPackReadable(Handle pack, int bytes); + +methodmap DataPack < Handle +{ + public DataPack() = CreateDataPack; + public WriteCell() = WritePackCell; + public WriteFloat() = WritePackFloat; + public WriteString() = WritePackString; + public WriteFunction() = WritePackFunction; + public ReadCell() = ReadPackCell; + public ReadFloat() = ReadPackFloat; + public ReadString() = ReadPackString; + public ReadFunction() = ReadPackFunction; + public Reset() = ResetPack; + public IsReadable() = IsPackReadable; + + property int Position { + public get() = GetPackPosition; + public set() = SetPackPosition; + } +}; + diff --git a/env/include/dbi.inc b/env/include/dbi.inc index bbb1d6e..ee95533 100644 --- a/env/include/dbi.inc +++ b/env/include/dbi.inc @@ -1,7 +1,7 @@ /** - * vim: set ts=4 : + * vim: set ts=4 sw=4 tw=99 noet : * ============================================================================= - * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * SourceMod (C)2004-2014 AlliedModders LLC. All rights reserved. * ============================================================================= * * This file is part of the SourceMod/SourcePawn SDK. @@ -35,35 +35,6 @@ #endif #define _dbi_included -/** - * @handle Driver - * - * Contains information about an SQL driver. - */ - -/** - * @handle Database - * - * Contains information about a database connection. - */ - -/** - * @handle Query - * - * Contains information about an active query and its - * result sets. - */ - -/** - * @handle Statement : Query - * - * Extends a Query Handle and can be used as a Query Handle. - * Statement Handles are for prepared queries and contain - * their own function for binding parameters. Statement - * Handles can be used instead of database Handles in a few - * select functions. - */ - /** * Describes a database field fetch status. */ @@ -95,6 +66,345 @@ enum DBPriority DBPrio_Low = 2, /**< Low priority. */ }; +// A Driver represents a database backend, currently MySQL or SQLite. +// +// Driver handles cannot be closed. +methodmap DBDriver < Handle +{ + // Finds the driver associated with a name. + // + // Supported driver strings: + // mysql + // sqlite + // + // @param name Driver identification string, or an empty string + // to return the default driver. + // @return Driver handle, or null on failure. + public static native DBDriver Find(const char[] name = ""); + + // Retrieves a driver's identification string. + // + // Example: "mysql", "sqlite" + // + // @param ident Identification string buffer. + // @param maxlength Maximum length of the buffer. + public native void GetIdentifier(char[] ident, int maxlength); + + // Retrieves a driver's product string. + // + // Example: "MySQL", "SQLite" + // + // @param product Product string buffer. + // @param maxlength Maximum length of the buffer. + public native void GetProduct(char[] product, int maxlength); +}; + +// Represents a set of results returned from executing a query. +methodmap DBResultSet < Handle +{ + // Advances to the next set of results. + // + // In some SQL implementations, multiple result sets can exist on one query. + // This is possible in MySQL with simple queries when executing a CALL + // query. If this is the case, all result sets must be processed before + // another query is made. + // + // @return True if there was another result set, false otherwise. + public native bool FetchMoreResults(); + + // Returns whether or not a result set exists. This will + // return true even if 0 results were returned, but false + // on queries like UPDATE, INSERT, or DELETE. + property bool HasResults { + public native get(); + } + + // Retrieves the number of rows in the last result set. + // + // @param query A query (or statement) Handle. + // @return Number of rows in the current result set. + property int RowCount { + public native get(); + } + + // Retrieves the number of fields in the last result set. + property int FieldCount { + public native get(); + } + + // Returns the number of affected rows from the query that generated this + // result set. + property int AffectedRows { + public native get(); + } + + // Returns the insert id from the query that generated this result set. + property int InsertId { + public native get(); + } + + // Retrieves the name of a field by index. + // + // @param field Field number (starting from 0). + // @param name Name buffer. + // @param maxlength Maximum length of the name buffer. + // @error Invalid field index, or no current result set. + public native void FieldNumToName(int field, char[] name, int maxlength); + + // Retrieves a field index by name. + // + // @param name Name of the field (case sensitive). + // @param field Variable to store field index in. + // @return True if found, false if not found. + // @error No current result set. + public native bool FieldNameToNum(const char[] name, int &field); + + // Fetches a row from the current result set. This must be + // successfully called before any results are fetched. + // + // If this function fails, _MoreResults can be used to + // tell if there was an error or the result set is finished. + // + // @return True if a row was fetched, false otherwise. + public native bool FetchRow(); + + // Returns if there are more rows. + // + // @return True if there are more rows, false otherwise. + property bool MoreRows { + public native get(); + } + + // Rewinds a result set back to the first result. + // + // @return True on success, false otherwise. + // @error No current result set. + public native bool Rewind(); + + // Fetches a string from a field in the current row of a result set. + // If the result is NULL, an empty string will be returned. A NULL + // check can be done with the result parameter, or SQL_IsFieldNull(). + // + // @param field The field index (starting from 0). + // @param buffer String buffer. + // @param maxlength Maximum size of the string buffer. + // @param result Optional variable to store the status of the return value. + // @return Number of bytes written. + // @error Invalid field index, invalid type conversion requested + // from the database, or no current result set. + public native int FetchString(int field, char[] buffer, int maxlength, + DBResult &result=DBVal_Error); + + // Fetches a float from a field in the current row of a result set. + // If the result is NULL, a value of 0.0 will be returned. A NULL + // check can be done with the result parameter, or SQL_IsFieldNull(). + // + // @param field The field index (starting from 0). + // @param result Optional variable to store the status of the return value. + // @return A float value. + // @error Invalid field index, invalid type conversion requested + // from the database, or no current result set. + public native float FetchFloat(int field, DBResult &result=DBVal_Error); + + // Fetches an integer from a field in the current row of a result set. + // If the result is NULL, a value of 0 will be returned. A NULL + // check can be done with the result parameter, or SQL_IsFieldNull(). + // + // @param field The field index (starting from 0). + // @param result Optional variable to store the status of the return value. + // @return An integer value. + // @error Invalid field index, invalid type conversion requested + // from the database, or no current result set. + public native int FetchInt(int field, DBResult &result=DBVal_Error); + + // Returns whether a field's data in the current row of a result set is + // NULL or not. NULL is an SQL type which means "no data." + // + // @param field The field index (starting from 0). + // @return True if data is NULL, false otherwise. + // @error Invalid field index, or no current result set. + public native bool IsFieldNull(Handle query, int field); + + // Returns the length of a field's data in the current row of a result + // set. This only needs to be called for strings to determine how many + // bytes to use. Note that the return value does not include the null + // terminator. + // + // @param field The field index (starting from 0). + // @return Number of bytes for the field's data size. + // @error Invalid field index or no current result set. + public native int FetchSize(int field); +}; + +// Callback for a successful transaction. +// +// @param db Database handle. +// @param data Data value passed to SQL_ExecuteTransaction(). +// @param numQueries Number of queries executed in the transaction. +// @param results An array of Query handle results, one for each of numQueries. They are closed automatically. +// @param queryData An array of each data value passed to SQL_AddQuery(). +typedef SQLTxnSuccess = function void (Database db, any data, int numQueries, Handle[] results, any[] queryData); + +// Callback for a failed transaction. +// +// @param db Database handle. +// @param data Data value passed to SQL_ExecuteTransaction(). +// @param numQueries Number of queries executed in the transaction. +// @param error Error message. +// @param failIndex Index of the query that failed, or -1 if something else. +// @param queryData An array of each data value passed to SQL_AddQuery(). +typedef SQLTxnFailure = function void (Database db, any data, int numQueries, const char[] error, int failIndex, any[] queryData); + +// A Transaction is a collection of SQL statements that must all execute +// successfully or not at all. +methodmap Transaction < Handle +{ + // Create a new transaction. + public native Transaction(); + + // Adds a query to the transaction. + // + // @param query Query string. + // @param data Extra data value to pass to the final callback. + // @return The index of the query in the transaction's query list. + public native int AddQuery(const char[] query, any data=0); +}; + +// A DBStatement is a pre-compiled SQL query that may be executed multiple +// times with different parameters. A DBStatement holds a reference to the +// Database that prepared it. +methodmap DBStatement < Handle +{ + // Binds a parameter in a prepared statement to a given integer value. + // + // @param param The parameter index (starting from 0). + // @param number The number to bind. + // @param signed True to bind the number as signed, false to + // bind it as unsigned. + // @error Invalid parameter index, or SQL error. + public native void BindInt(int param, int number, bool signed=true); + + // Binds a parameter in a prepared statement to a given float value. + // + // @param param The parameter index (starting from 0). + // @param value The float number to bind. + // @error Invalid parameter index, or SQL error. + public native void BindFloat(int param, float value); + + // Binds a parameter in a prepared statement to a given string value. + // + // @param param The parameter index (starting from 0). + // @param value The string to bind. + // @param copy Whether or not SourceMod should copy the value + // locally if necessary. If the string contents + // won't change before calling SQL_Execute(), this + // can be set to false for optimization. + // @error Invalid parameter index, or SQL error. + public native void BindString(int param, const char[] value, bool copy); +}; + +// Callback for receiving asynchronous database connections. +// +// @param db Handle to the database connection. +// @param error Error string if there was an error. The error could be +// empty even if an error condition exists, so it is important +// to check the actual Handle value instead. +// @param data Data passed in via the original threaded invocation. +typedef SQLConnectCallback = function void (Database db, const char[] error, any data); + +// Callback for receiving asynchronous database query results. +// +// @param db Cloned handle to the database connection. +// @param results Result object, or null on failure. +// @param error Error string if there was an error. The error could be +// empty even if an error condition exists, so it is important +// to check the actual results value instead. +// @param data Data passed in via the original threaded invocation. +typedef SQLQueryCallback = function void (Database db, DBResultSet results, const char[] error, any data); + +// A Database represents a live connection to a database, either over the +// wire, through a unix domain socket, or over an open file. +methodmap Database < Handle +{ + // Connects to a database asynchronously, so the game thread is not blocked. + // + // @param callback Callback. If no driver was found, the owner is null. + // @param name Database configuration name. + // @param data Extra data value to pass to the callback. + public static native void Connect(SQLConnectCallback callback, const char[] name="default", any data=0); + + // Returns the driver for this database connection. + property DBDriver Driver { + public native get(); + } + + // Sets the character set of the connection. + // Like SET NAMES .. in mysql, but stays after connection problems. + // + // Example: "utf8", "latin1" + // + // @param characterset The character set string to change to. + // @return True, if character set was changed, false otherwise. + public native bool SetCharset(const char[] charset); + + // Escapes a database string for literal insertion. This is not needed + // for binding strings in prepared statements. + // + // Generally, database strings are inserted into queries enclosed in + // single quotes ('). If user input has a single quote in it, the + // quote needs to be escaped. This function ensures that any unsafe + // characters are safely escaped according to the database engine and + // the database's character set. + // + // NOTE: SourceMod only guarantees properly escaped strings when the query + // encloses the string in ''. While drivers tend to allow " instead, the string + // may be not be escaped (for example, on SQLite)! + // + // @param string String to quote. + // @param buffer Buffer to store quoted string in. + // @param maxlength Maximum length of the buffer. + // @param written Optionally returns the number of bytes written. + // @return True on success, false if buffer is not big enough. + // The buffer must be at least 2*strlen(string)+1. + public native bool Escape(const char[] string, char[] buffer, int maxlength, int &written=0); + + // Returns whether a database is the same connection as another database. + public native bool IsSameConnection(Database other); + + // Executes a query via a thread. The result handle is passed through the + // callback. + // + // The database handle returned through the callback is always a new Handle, + // and if necessary, IsSameConnection() should be used to test against other + // conenctions. + // + // The result handle returned through the callback is temporary and destroyed + // at the end of the callback. + // + // @param callback Callback. + // @param query Query string. + // @param data Extra data value to pass to the callback. + // @param prio Priority queue to use. + public native void Query(SQLQueryCallback callback, const char[] query, + any data = 0, + DBPriority prio = DBPrio_Normal); + + // Sends a transaction to the database thread. The transaction handle is + // automatically closed. When the transaction completes, the optional + // callback is invoked. + // + // @param txn A transaction handle. + // @param onSuccess An optional callback to receive a successful transaction. + // @param onError An optional callback to receive an error message. + // @param data An optional value to pass to callbacks. + // @param prio Priority queue to use. + public native void Execute(Transaction txn, + SQLTxnSuccess:onSuccess = INVALID_FUNCTION, + SQLTxnFailure:onError = INVALID_FUNCTION, + any data = 0, + DBPriority priority = DBPrio_Normal); +}; + /** * Creates an SQL connection from a named configuration. * @@ -105,7 +415,7 @@ enum DBPriority * @param maxlength Maximum length of the error buffer. * @return A database connection Handle, or INVALID_HANDLE on failure. */ -native Handle:SQL_Connect(const String:confname[], bool:persistent, String:error[], maxlength); +native Database SQL_Connect(const char[] confname, bool persistent, char[] error, int maxlength); /** * Creates a default SQL connection. @@ -117,7 +427,7 @@ native Handle:SQL_Connect(const String:confname[], bool:persistent, String:error * @return A database connection Handle, or INVALID_HANDLE on failure. * On failure the error buffer will be filled with a message. */ -stock Handle:SQL_DefConnect(String:error[], maxlength, bool:persistent=true) +stock Database SQL_DefConnect(char[] error, int maxlength, bool persistent=true) { return SQL_Connect("default", persistent, error, maxlength); } @@ -143,10 +453,10 @@ stock Handle:SQL_DefConnect(String:error[], maxlength, bool:persistent=true) * On failure the error buffer will be filled with a message. * @error Invalid KeyValues handle. */ -native Handle:SQL_ConnectCustom(Handle:keyvalues, - String:error[], - maxlength, - bool:persistent); +native Database SQL_ConnectCustom(Handle keyvalues, + char[] error, + maxlength, + bool persistent); /** * Grabs a handle to an SQLite database, creating one if it does not exist. @@ -163,11 +473,11 @@ native Handle:SQL_ConnectCustom(Handle:keyvalues, * @return A database connection Handle, or INVALID_HANDLE on failure. * On failure the error buffer will be filled with a message. */ -stock Handle:SQLite_UseDatabase(const String:database[], - String:error[], - maxlength) +stock Database SQLite_UseDatabase(const char[] database, + char[] error, + maxlength) { - new Handle:kv, Handle:db; + Handle kv, db; kv = CreateKeyValues(""); KvSetString(kv, "driver", "sqlite"); @@ -184,14 +494,14 @@ stock Handle:SQLite_UseDatabase(const String:database[], * This function is deprecated. Use SQL_ConnectCustom or SQLite_UseDatabase instead. */ #pragma deprecated Use SQL_ConnectCustom instead. -native Handle:SQL_ConnectEx(Handle:driver, +native Handle SQL_ConnectEx(Handle driver, const String:host[], const String:user[], const String:pass[], const String:database[], - String:error[], + char[] error, maxlength, - bool:persistent=true, + bool persistent=true, port=0, maxTimeout=0); @@ -201,7 +511,7 @@ native Handle:SQL_ConnectEx(Handle:driver, * @param name Configuration name. * @return True if it exists, false otherwise. */ -native bool:SQL_CheckConfig(const String:name[]); +native bool SQL_CheckConfig(const char[] name); /** * Returns a driver Handle from a name string. @@ -213,7 +523,7 @@ native bool:SQL_CheckConfig(const String:name[]); * string to return the default driver. * @return Driver Handle, or INVALID_HANDLE on failure. */ -native Handle:SQL_GetDriver(const String:name[]=""); +native Handle SQL_GetDriver(const char[] name=""); /** * Reads the driver of an opened database. @@ -223,7 +533,7 @@ native Handle:SQL_GetDriver(const String:name[]=""); * @param ident_length Maximum length of the buffer. * @return Driver Handle. */ -native Handle:SQL_ReadDriver(Handle:database, String:ident[]="", ident_length=0); +native Handle SQL_ReadDriver(Handle database, char[] ident="", ident_length=0); /** * Retrieves a driver's identification string. @@ -236,7 +546,7 @@ native Handle:SQL_ReadDriver(Handle:database, String:ident[]="", ident_length=0) * @noreturn * @error Invalid Handle other than INVALID_HANDLE. */ -native SQL_GetDriverIdent(Handle:driver, String:ident[], maxlength); +native void SQL_GetDriverIdent(Handle driver, char[] ident, int maxlength); /** * Retrieves a driver's product string. @@ -249,7 +559,7 @@ native SQL_GetDriverIdent(Handle:driver, String:ident[], maxlength); * @noreturn * @error Invalid Handle other than INVALID_HANDLE. */ -native SQL_GetDriverProduct(Handle:driver, String:product[], maxlength); +native void SQL_GetDriverProduct(Handle driver, char[] product, int maxlength); /** * Sets the character set of the current connection. @@ -261,7 +571,7 @@ native SQL_GetDriverProduct(Handle:driver, String:product[], maxlength); * @param characterset The character set string to change to. * @return True, if character set was changed, false otherwise. */ -native bool:SQL_SetCharset(Handle:database, const String:charset[]); +native bool SQL_SetCharset(Handle database, const char[] charset); /** * Returns the number of affected rows from the last query. @@ -270,7 +580,7 @@ native bool:SQL_SetCharset(Handle:database, const String:charset[]); * @return Number of rows affected by the last query. * @error Invalid database or statement Handle. */ -native SQL_GetAffectedRows(Handle:hndl); +native int SQL_GetAffectedRows(Handle hndl); /** * Returns the last query's insertion id. @@ -279,7 +589,7 @@ native SQL_GetAffectedRows(Handle:hndl); * @return Last query's insertion id. * @error Invalid database, query, or statement Handle. */ -native SQL_GetInsertId(Handle:hndl); +native int SQL_GetInsertId(Handle hndl); /** * Returns the error reported by the last query. @@ -290,7 +600,7 @@ native SQL_GetInsertId(Handle:hndl); * @return True if there was an error, false otherwise. * @error Invalid database, query, or statement Handle. */ -native bool:SQL_GetError(Handle:hndl, String:error[], maxlength); +native bool SQL_GetError(Handle hndl, char[] error, int maxlength); /** * Escapes a database string for literal insertion. This is not needed @@ -315,19 +625,19 @@ native bool:SQL_GetError(Handle:hndl, String:error[], maxlength); * The buffer must be at least 2*strlen(string)+1. * @error Invalid database or statement Handle. */ -native bool:SQL_EscapeString(Handle:database, - const String:string[], - String:buffer[], - maxlength, - &written=0); +native bool SQL_EscapeString(Handle database, + const char[] string, + char[] buffer, + int maxlength, + int &written=0); /** * This is a backwards compatibility stock. You should use SQL_EscapeString() * instead, as this function will probably be deprecated in SourceMod 1.1. */ -stock bool:SQL_QuoteString(Handle:database, - const String:string[], - String:buffer[], +stock bool SQL_QuoteString(Handle database, + const char[] string, + char[] buffer, maxlength, &written=0) { @@ -346,7 +656,7 @@ stock bool:SQL_QuoteString(Handle:database, * SQL_GetError to find the last error. * @error Invalid database Handle. */ -native bool:SQL_FastQuery(Handle:database, const String:query[], len=-1); +native bool SQL_FastQuery(Handle database, const char[] query, int len=-1); /** * Executes a simple query and returns a new query Handle for @@ -361,7 +671,7 @@ native bool:SQL_FastQuery(Handle:database, const String:query[], len=-1); * otherwise. The Handle must be freed with CloseHandle(). * @error Invalid database Handle. */ -native Handle:SQL_Query(Handle:database, const String:query[], len=-1); +native DBResultSet SQL_Query(Handle database, const char[] query, int len=-1); /** * Creates a new prepared statement query. Prepared statements can @@ -379,7 +689,7 @@ native Handle:SQL_Query(Handle:database, const String:query[], len=-1); * otherwise. The Handle must be freed with CloseHandle(). * @error Invalid database Handle. */ -native Handle:SQL_PrepareQuery(Handle:database, const String:query[], String:error[], maxlength); +native DBStatement SQL_PrepareQuery(Handle database, const char[] query, char[] error, int maxlength); /** * Advances to the next set of results. @@ -393,7 +703,7 @@ native Handle:SQL_PrepareQuery(Handle:database, const String:query[], String:err * @return True if there was another result set, false otherwise. * @error Invalid query Handle. */ -native bool:SQL_FetchMoreResults(Handle:query); +native bool SQL_FetchMoreResults(Handle query); /** * Returns whether or not a result set exists. This will @@ -404,7 +714,7 @@ native bool:SQL_FetchMoreResults(Handle:query); * @return True if there is a result set, false otherwise. * @error Invalid query Handle. */ -native bool:SQL_HasResultSet(Handle:query); +native bool SQL_HasResultSet(Handle query); /** * Retrieves the number of rows in the last result set. @@ -413,7 +723,7 @@ native bool:SQL_HasResultSet(Handle:query); * @return Number of rows in the current result set. * @error Invalid query Handle. */ -native SQL_GetRowCount(Handle:query); +native int SQL_GetRowCount(Handle query); /** * Retrieves the number of fields in the last result set. @@ -422,7 +732,7 @@ native SQL_GetRowCount(Handle:query); * @return Number of fields in the current result set. * @error Invalid query Handle. */ -native SQL_GetFieldCount(Handle:query); +native int SQL_GetFieldCount(Handle query); /** * Retrieves the name of a field by index. @@ -431,11 +741,10 @@ native SQL_GetFieldCount(Handle:query); * @param field Field number (starting from 0). * @param name Name buffer. * @param maxlength Maximum length of the name buffer. - * @noreturn * @error Invalid query Handle, invalid field index, or * no current result set. */ -native SQL_FieldNumToName(Handle:query, field, String:name[], maxlength); +native void SQL_FieldNumToName(Handle query, int field, String:name[], int maxlength); /** * Retrieves a field index by name. @@ -446,7 +755,7 @@ native SQL_FieldNumToName(Handle:query, field, String:name[], maxlength); * @return True if found, false if not found. * @error Invalid query Handle or no current result set. */ -native bool:SQL_FieldNameToNum(Handle:query, const String:name[], &field); +native bool SQL_FieldNameToNum(Handle query, const char[] name, &field); /** * Fetches a row from the current result set. This must be @@ -459,7 +768,7 @@ native bool:SQL_FieldNameToNum(Handle:query, const String:name[], &field); * @return True if a row was fetched, false otherwise. * @error Invalid query Handle. */ -native bool:SQL_FetchRow(Handle:query); +native bool SQL_FetchRow(Handle query); /** * Returns if there are more rows. @@ -468,7 +777,7 @@ native bool:SQL_FetchRow(Handle:query); * @return True if there are more rows, false otherwise. * @error Invalid query Handle. */ -native bool:SQL_MoreRows(Handle:query); +native bool SQL_MoreRows(Handle query); /** * Rewinds a result set back to the first result. @@ -477,7 +786,7 @@ native bool:SQL_MoreRows(Handle:query); * @return True on success, false otherwise. * @error Invalid query Handle or no current result set. */ -native bool:SQL_Rewind(Handle:query); +native bool SQL_Rewind(Handle query); /** * Fetches a string from a field in the current row of a result set. @@ -494,7 +803,7 @@ native bool:SQL_Rewind(Handle:query); * type conversion requested from the database, * or no current result set. */ -native SQL_FetchString(Handle:query, field, String:buffer[], maxlength, &DBResult:result=DBVal_Error); +native int SQL_FetchString(Handle query, int field, char[] buffer, int maxlength, DBResult &result=DBVal_Error); /** * Fetches a float from a field in the current row of a result set. @@ -509,7 +818,7 @@ native SQL_FetchString(Handle:query, field, String:buffer[], maxlength, &DBResul * type conversion requested from the database, * or no current result set. */ -native Float:SQL_FetchFloat(Handle:query, field, &DBResult:result=DBVal_Error); +native float SQL_FetchFloat(Handle query, int field, DBResult &result=DBVal_Error); /** * Fetches an integer from a field in the current row of a result set. @@ -524,7 +833,7 @@ native Float:SQL_FetchFloat(Handle:query, field, &DBResult:result=DBVal_Error); * type conversion requested from the database, * or no current result set. */ -native SQL_FetchInt(Handle:query, field, &DBResult:result=DBVal_Error); +native int SQL_FetchInt(Handle query, int field, DBResult &result=DBVal_Error); /** * Returns whether a field's data in the current row of a result set is @@ -536,7 +845,7 @@ native SQL_FetchInt(Handle:query, field, &DBResult:result=DBVal_Error); * @error Invalid query Handle or field index, or no * current result set. */ -native bool:SQL_IsFieldNull(Handle:query, field); +native bool SQL_IsFieldNull(Handle query, int field); /** * Returns the length of a field's data in the current row of a result @@ -550,7 +859,7 @@ native bool:SQL_IsFieldNull(Handle:query, field); * @error Invalid query Handle or field index or no * current result set. */ -native SQL_FetchSize(Handle:query, field); +native int SQL_FetchSize(Handle query, int field); /** * Binds a parameter in a prepared statement to a given integer value. @@ -560,11 +869,10 @@ native SQL_FetchSize(Handle:query, field); * @param number The number to bind. * @param signed True to bind the number as signed, false to * bind it as unsigned. - * @noreturn * @error Invalid statement Handle or parameter index, or * SQL error. */ -native SQL_BindParamInt(Handle:statement, param, number, bool:signed=true); +native void SQL_BindParamInt(Handle statement, int param, int number, bool signed=true); /** * Binds a parameter in a prepared statement to a given float value. @@ -572,11 +880,10 @@ native SQL_BindParamInt(Handle:statement, param, number, bool:signed=true); * @param statement A statement (prepared query) Handle. * @param param The parameter index (starting from 0). * @param value The float number to bind. - * @noreturn * @error Invalid statement Handle or parameter index, or * SQL error. */ -native SQL_BindParamFloat(Handle:statement, param, Float:value); +native void SQL_BindParamFloat(Handle statement, int param, float value); /** * Binds a parameter in a prepared statement to a given string value. @@ -588,11 +895,10 @@ native SQL_BindParamFloat(Handle:statement, param, Float:value); * locally if necessary. If the string contents * won't change before calling SQL_Execute(), this * can be set to false for optimization. - * @noreturn * @error Invalid statement Handle or parameter index, or * SQL error. */ -native SQL_BindParamString(Handle:statement, param, const String:value[], bool:copy); +native void SQL_BindParamString(Handle statement, int param, const char[] value, bool copy); /** * Executes a prepared statement. All parameters must be bound beforehand. @@ -601,7 +907,7 @@ native SQL_BindParamString(Handle:statement, param, const String:value[], bool:c * @return True on success, false on failure. * @error Invalid statement Handle. */ -native bool:SQL_Execute(Handle:statement); +native bool SQL_Execute(Handle statement); /** * Locks a database so threading operations will not interrupt. @@ -618,32 +924,27 @@ native bool:SQL_Execute(Handle:statement); * threaded operation has concluded. * * @param database A database Handle. - * @noreturn * @error Invalid database Handle. */ -native SQL_LockDatabase(Handle:database); +native void SQL_LockDatabase(Handle database); /** * Unlocks a database so threading operations may continue. * * @param database A database Handle. - * @noreturn * @error Invalid database Handle. */ -native SQL_UnlockDatabase(Handle:database); +native void SQL_UnlockDatabase(Handle database); -/** - * General callback for threaded SQL stuff. - * - * @param owner Parent object of the Handle (or INVALID_HANDLE if none). - * @param hndl Handle to the child object (or INVALID_HANDLE if none). - * @param error Error string if there was an error. The error could be - * empty even if an error condition exists, so it is important - * to check the actual Handle value instead. - * @param data Data passed in via the original threaded invocation. - * @param - */ -functag public SQLTCallback(Handle:owner, Handle:hndl, const String:error[], any:data); +// General callback for threaded SQL stuff. +// +// @param owner Parent object of the Handle (or INVALID_HANDLE if none). +// @param hndl Handle to the child object (or INVALID_HANDLE if none). +// @param error Error string if there was an error. The error could be +// empty even if an error condition exists, so it is important +// to check the actual Handle value instead. +// @param data Data passed in via the original threaded invocation. +typedef SQLTCallback = function void (Handle owner, Handle hndl, const char[] error, any data); /** * Tells whether two database handles both point to the same database @@ -655,7 +956,7 @@ functag public SQLTCallback(Handle:owner, Handle:hndl, const String:error[], any * connection, false otherwise. * @error Invalid Handle. */ -native bool:SQL_IsSameConnection(Handle:hndl1, Handle:hndl2); +native bool SQL_IsSameConnection(Handle hndl1, Handle hndl2); /** * Connects to a database via a thread. This can be used instead of @@ -669,9 +970,8 @@ native bool:SQL_IsSameConnection(Handle:hndl1, Handle:hndl2); * If no driver was found, the owner is INVALID_HANDLE. * @param name Database name. * @param data Extra data value to pass to the callback. - * @noreturn */ -native SQL_TConnect(SQLTCallback:callback, const String:name[]="default", any:data=0); +native void SQL_TConnect(SQLTCallback callback, const char[] name="default", any data=0); /** * Executes a simple query via a thread. The query Handle is passed through @@ -690,10 +990,9 @@ native SQL_TConnect(SQLTCallback:callback, const String:name[]="default", any:da * @param query Query string. * @param data Extra data value to pass to the callback. * @param prio Priority queue to use. - * @noreturn * @error Invalid database Handle. */ -native SQL_TQuery(Handle:database, SQLTCallback:callback, const String:query[], any:data=0, DBPriority:prio=DBPrio_Normal); +native void SQL_TQuery(Handle database, SQLTCallback callback, const char[] query, any data=0, DBPriority prio=DBPrio_Normal); /** * Creates a new transaction object. A transaction object is a list of queries @@ -701,7 +1000,7 @@ native SQL_TQuery(Handle:database, SQLTCallback:callback, const String:query[], * * @return A transaction handle. */ -native Handle:SQL_CreateTransaction(); +native Transaction SQL_CreateTransaction(); /** * Adds a query to a transaction object. @@ -712,32 +1011,7 @@ native Handle:SQL_CreateTransaction(); * @return The index of the query in the transaction's query list. * @error Invalid transaction handle. */ -native SQL_AddQuery(Handle:txn, const String:query[], any:data=0); - -/** - * Callback for a successful transaction. - * - * @param db Database handle. - * @param data Data value passed to SQL_ExecuteTransaction(). - * @param numQueries Number of queries executed in the transaction. - * @param results An array of Query handle results, one for each of numQueries. They are closed automatically. - * @param queryData An array of each data value passed to SQL_AddQuery(). - * @noreturn - */ -functag public SQLTxnSuccess(Handle:db, any:data, numQueries, Handle:results[], any:queryData[]); - -/** - * Callback for a failed transaction. - * - * @param db Database handle. - * @param data Data value passed to SQL_ExecuteTransaction(). - * @param numQueries Number of queries executed in the transaction. - * @param error Error message. - * @param failIndex Index of the query that failed, or -1 if something else. - * @param queryData An array of each data value passed to SQL_AddQuery(). - * @noreturn - */ -functag public SQLTxnFailure(Handle:db, any:data, numQueries, const String:error[], failIndex, any:queryData[]); +native int SQL_AddQuery(Transaction txn, const char[] query, any data=0); /** * Sends a transaction to the database thread. The transaction handle is @@ -754,9 +1028,9 @@ functag public SQLTxnFailure(Handle:db, any:data, numQueries, const String:error * @error An invalid handle. */ native SQL_ExecuteTransaction( - Handle:db, - Handle:txn, - SQLTxnSuccess:onSuccess=SQLTxnSuccess:-1, - SQLTxnFailure:onError=SQLTxnFailure:-1, - any:data=0, + Handle db, + Transaction:txn, + SQLTxnSuccess:onSuccess = INVALID_FUNCTION, + SQLTxnFailure:onError = INVALID_FUNCTION, + any data=0, DBPriority:priority=DBPrio_Normal); diff --git a/env/include/entity.inc b/env/include/entity.inc index d33a3b8..765bb85 100644 --- a/env/include/entity.inc +++ b/env/include/entity.inc @@ -682,15 +682,12 @@ native GetEntPropArraySize(entity, PropType:type, const String:prop[]); * @param array Array to read into. * @param arraySize Number of values to read. * @param dataSize Size of each value in bytes (1, 2, or 4). - * @noreturn * @error Invalid entity or offset out of reasonable bounds. */ -stock GetEntDataArray(entity, offset, array[], arraySize, dataSize=4) +stock void GetEntDataArray(int entity, int offset, int[] array, int arraySize, int dataSize=4) { - for (new i=0; i max_size. + public native int ReadString(char[] buffer, int max_size, int read_count=-1); + + // Writes binary data to a file. + // + // @param items Array of items to write. The data is read directly. + // That is, in 1 or 2-byte mode, the lower byte(s) in + // each cell are used directly, rather than performing + // any casts from a 4-byte number to a smaller number. + // @param num_items Number of items in the array. + // @param size Size of each item in the array in bytes. + // Valid sizes are 1, 2, or 4. + // @return True on success, false on error. + public native bool Write(const int[] items, int num_items, int size); + + // Writes a binary string to a file. + // + // @param buffer String to write. + // @param term True to append NUL terminator, false otherwise. + // @return True on success, false on error. + public native bool WriteString(const char[] buffer, bool term); + + // Writes a line of text to a text file. A newline is automatically appended. + // + // @param hndl Handle to the file. + // @param format Formatting rules. + // @param ... Variable number of format parameters. + // @return True on success, false otherwise. + public native bool WriteLine(const char[] format, any:...); + + // Reads a single int8 (byte) from a file. The returned value is sign- + // extended to an int32. + // + // @param data Variable to store the data read. + // @return True on success, false on failure. + public native bool ReadInt8(int &data); + + // Reads a single uint8 (unsigned byte) from a file. The returned value is + // zero-extended to an int32. + // + // @param data Variable to store the data read. + // @return True on success, false on failure. + public native bool ReadUint8(int &data); + + // Reads a single int16 (short) from a file. The value is sign-extended to + // an int32. + // + // @param data Variable to store the data read. + // @return True on success, false on failure. + public native bool ReadInt16(int &data); + + // Reads a single unt16 (unsigned short) from a file. The value is zero- + // extended to an int32. + // + // @param data Variable to store the data read. + // @return True on success, false on failure. + public native bool ReadUint16(int &data); + + // Reads a single int32 (int/cell) from a file. + // + // @param data Variable to store the data read. + // @return True on success, false on failure. + public native bool ReadInt32(int &data); + + // Writes a single int8 (byte) to a file. + // + // @param data Data to write (truncated to an int8). + // @return True on success, false on failure. + public native bool WriteInt8(int data); + + // Writes a single int16 (short) to a file. + // + // @param data Data to write (truncated to an int16). + // @return True on success, false on failure. + public native bool WriteInt16(int data); + + // Writes a single int32 (int/cell) to a file. + // + // @param data Data to write. + // @return True on success, false on failure. + public native bool WriteInt32(int data); + + // Tests if the end of file has been reached. + // + // @return True if end of file has been reached, false otherwise. + public native bool EndOfFile(); + + // Sets the file position indicator. + // + // @param position Position relative to what is specified in whence. + // @param where SEEK_ constant value of where to see from. + // @return True on success, false otherwise. + public native bool Seek(int position, int where); + + // Get the current position in the file; returns -1 on failure. + property int Position { + public native get(); + } +} + /** * Builds a path relative to the SourceMod folder. This should be used instead of * directly referencing addons/sourcemod, in case users change the name of their @@ -98,19 +251,24 @@ enum PathType * @param ... Format arguments. * @return Number of bytes written to buffer (not including null terminator). */ -native BuildPath(PathType:type, String:buffer[], maxlength, const String:fmt[], any:...); +native int BuildPath(PathType type, char[] buffer, int maxlength, const char[] fmt, any:...); /** * Opens a directory/folder for contents enumeration. * - * @note Directories are closed with CloseHandle(). + * @note Directories are closed with CloseHandle() or delete. * @note Directories Handles can be cloned. * @note OpenDirectory() supports the "file://" notation. * * @param path Path to open. - * @return A Handle to the directory, INVALID_HANDLE on open error. + * @param use_valve_fs If true, the Valve file system will be used instead. + * This can be used to find files existing in any of + * the Valve search paths, rather than solely files + * existing directly in the gamedir. + * @param valve_path_id If use_valve_fs, a search path from gameinfo or NULL_STRING for all search paths. + * @return A Handle to the directory, null on error. */ -native Handle:OpenDirectory(const String:path[]); +native DirectoryListing OpenDirectory(const char[] path, bool use_valve_fs=false, const char[] valve_path_id="GAME"); /** * Reads the current directory entry as a local filename, then moves to the next file. @@ -125,28 +283,56 @@ native Handle:OpenDirectory(const String:path[]); * @return True on success, false if there are no more files to read. * @error Invalid or corrupt Handle. */ -native bool:ReadDirEntry(Handle:dir, String:buffer[], maxlength, &FileType:type=FileType_Unknown); +native bool ReadDirEntry(Handle dir, char[] buffer, int maxlength, FileType &type=FileType_Unknown); /** - * Opens a file. + * Opens or creates a file, returning a File handle on success. File handles + * should be closed with delete or CloseHandle(). * - * @note Files are closed with CloseHandle(). - * @note File Handles can be cloned. - * @note OpenFile() supports the "file://" notation. + * The open mode may be one of the following strings: + * "r": Open an existing file for reading. + * "w": Create a file for writing, or truncate (delete the contents of) an + * existing file and then open it for writing. + * "a": Create a file for writing, or open an existing file such that writes + * will be appended to the end. + * "r+": Open an existing file for both reading and writing. + * "w+": Create a file for reading and writing, or truncate an existing file + * and then open it for reading and writing. + * "a+": Create a file for both reading and writing, or open an existing file + * such that writes will be appended to the end. + * + * The open mode may also contain an additional character after "r", "w", or "a", + * but before any "+" sign. This character may be "b" (indicating binary mode) or + * "t" (indicating text mode). By default, "text" mode is implied. On Linux and + * Mac, this has no distinction from binary mode. On Windows, it causes the '\n' + * character (0xA) to be written as "\r\n" (0xD, 0xA). + * + * Example: "rb" opens a binary file for writing; "at" opens a text file for + * appending. * * @param file File to open. * @param mode Open mode. - * @return A Handle to the file, INVALID_HANDLE on open error. + * @param use_valve_fs If true, the Valve file system will be used instead. + * This can be used to find files existing in valve + * search paths, rather than solely files existing directly + * in the gamedir. + * @param valve_path_id If use_valve_fs, a search path from gameinfo or NULL_STRING for all search paths. + * @return A File handle, or null if the file could not be opened. */ -native Handle:OpenFile(const String:file[], const String:mode[]); +native File OpenFile(const char[] file, const char[] mode, bool use_valve_fs=false, const char[] valve_path_id="GAME"); /** * Deletes a file. * * @param path Path of the file to delete. - * @return True on success, false otherwise. + * @param use_valve_fs If true, the Valve file system will be used instead. + * This can be used to delete files existing in the Valve + * search path, rather than solely files existing directly + * in the gamedir. + * @param valve_path_id If use_valve_fs, a search path from gameinfo or NULL_STRING for all search paths. + * @return True on success, false on failure or if file not immediately removed. */ -native bool:DeleteFile(const String:path[]); +native bool DeleteFile(const char[] path, bool use_valve_fs=false, const char[] valve_path_id="DEFAULT_WRITE_PATH"); /** * Reads a line from a text file. @@ -156,7 +342,7 @@ native bool:DeleteFile(const String:path[]); * @param maxlength Maximum size of string buffer. * @return True on success, false otherwise. */ -native bool:ReadFileLine(Handle:hndl, String:buffer[], maxlength); +native bool ReadFileLine(Handle hndl, char[] buffer, int maxlength); /** * Reads binary data from a file. @@ -168,7 +354,7 @@ native bool:ReadFileLine(Handle:hndl, String:buffer[], maxlength); * Valid sizes are 1, 2, or 4. * @return Number of elements read, or -1 on error. */ -native ReadFile(Handle:hndl, items[], num_items, size); +native int ReadFile(Handle hndl, int[] items, int num_items, int size); /** * Reads a UTF8 or ANSI string from a file. @@ -185,7 +371,7 @@ native ReadFile(Handle:hndl, items[], num_items, size); * if an error was encountered. * @error Invalid Handle, or read_count > max_size. */ -native ReadFileString(Handle:hndl, String:buffer[], max_size, read_count=-1); +native int ReadFileString(Handle hndl, char[] buffer, int max_size, int read_count=-1); /** * Writes binary data to a file. @@ -201,7 +387,7 @@ native ReadFileString(Handle:hndl, String:buffer[], max_size, read_count=-1); * @return True on success, false on error. * @error Invalid Handle. */ -native bool:WriteFile(Handle:hndl, const items[], num_items, size); +native bool WriteFile(Handle hndl, const int[] items, int num_items, int size); /** * Writes a binary string to a file. @@ -212,7 +398,7 @@ native bool:WriteFile(Handle:hndl, const items[], num_items, size); * @return True on success, false on error. * @error Invalid Handle. */ -native bool:WriteFileString(Handle:hndl, const String:buffer[], bool:term); +native bool WriteFileString(Handle hndl, const char[] buffer, bool term); /** * Writes a line of text to a text file. A newline is automatically appended. @@ -223,7 +409,7 @@ native bool:WriteFileString(Handle:hndl, const String:buffer[], bool:term); * @return True on success, false otherwise. * @error Invalid Handle. */ -native bool:WriteFileLine(Handle:hndl, const String:format[], any:...); +native bool WriteFileLine(Handle hndl, const char[] format, any:...); /** * Reads a single binary cell from a file. @@ -235,14 +421,13 @@ native bool:WriteFileLine(Handle:hndl, const String:format[], any:...); * @return Number of elements read (max 1), or -1 on error. * @error Invalid Handle. */ -stock ReadFileCell(Handle:hndl, &data, size) +stock int ReadFileCell(Handle hndl, int &data, int size) { - new array[1], ret; + int ret; + int array[1]; if ((ret = ReadFile(hndl, array, 1, size)) == 1) - { data = array[0]; - } return ret; } @@ -260,12 +445,11 @@ stock ReadFileCell(Handle:hndl, &data, size) * @return True on success, false on error. * @error Invalid Handle. */ -stock bool:WriteFileCell(Handle:hndl, data, size) +stock bool WriteFileCell(Handle hndl, int data, int size) { - new array[1]; + int array[1]; array[0] = data; - return WriteFile(hndl, array, 1, size); } @@ -276,7 +460,7 @@ stock bool:WriteFileCell(Handle:hndl, data, size) * @return True if end of file has been reached, false otherwise. * @error Invalid Handle. */ -native bool:IsEndOfFile(Handle:file); +native bool IsEndOfFile(Handle file); /** * Sets the file position indicator. @@ -287,7 +471,7 @@ native bool:IsEndOfFile(Handle:file); * @return True on success, false otherwise. * @error Invalid Handle. */ -native bool:FileSeek(Handle:file, position, where); +native bool FileSeek(Handle file, int position, int where); /** * Get current position in the file. @@ -296,7 +480,7 @@ native bool:FileSeek(Handle:file, position, where); * @return Value for the file position indicator. * @error Invalid Handle. */ -native FilePosition(Handle:file); +native int FilePosition(Handle file); /** * Checks if a file exists. @@ -304,28 +488,38 @@ native FilePosition(Handle:file); * @param path Path to the file. * @param use_valve_fs If true, the Valve file system will be used instead. * This can be used to find files existing in any of - * the GAME search paths, rather than solely files + * the Valve search paths, rather than solely files * existing directly in the gamedir. + * @param valve_path_id If use_valve_fs, a search path from gameinfo or NULL_STRING for all search paths. * @return True if the file exists, false otherwise. */ -native bool:FileExists(const String:path[], bool:use_valve_fs=false); +native bool FileExists(const char[] path, bool use_valve_fs=false, const char[] valve_path_id="GAME"); /** * Renames a file. * * @param newpath New path to the file. * @param oldpath Path to the existing file. - * @return True on success, false otherwise. + * @param use_valve_fs If true, the Valve file system will be used instead. + * This can be used to rename files in the game's + * Valve search paths, rather than directly in the gamedir. + * @param valve_path_id If use_valve_fs, a search path from gameinfo or NULL_STRING for all search paths. + * @return True on success or use_valve_fs specified, false otherwise. */ -native bool:RenameFile(const String:newpath[], const String:oldpath[]); +native bool RenameFile(const char[] newpath, const char[] oldpath, bool use_valve_fs=false, const char[] valve_path_id="DEFAULT_WRITE_PATH"); /** * Checks if a directory exists. * * @param path Path to the directory. + * @param use_valve_fs If true, the Valve file system will be used instead. + * This can be used to find files existing in any of + * the Valve search paths, rather than solely files + * existing directly in the gamedir. + * @param valve_path_id If use_valve_fs, a search path from gameinfo or NULL_STRING for all search paths. * @return True if the directory exists, false otherwise. */ -native bool:DirExists(const String:path[]); +native bool DirExists(const char[] path, bool use_valve_fs=false, const char[] valve_path_id="GAME"); /** * Get the file size in bytes. @@ -333,20 +527,22 @@ native bool:DirExists(const String:path[]); * @param path Path to the file. * @param use_valve_fs If true, the Valve file system will be used instead. * This can be used to find files existing in any of - * the GAME search paths, rather than solely files + * the Valve search paths, rather than solely files * existing directly in the gamedir. + * @param valve_path_id If use_valve_fs, a search path from gameinfo or NULL_STRING for all search paths. * @return File size in bytes, -1 if file not found. */ -native FileSize(const String:path[], bool:use_valve_fs=false); +native int FileSize(const char[] path, bool use_valve_fs=false, const char[] valve_path_id="GAME"); /** * Flushes a file's buffered output; any buffered output * is immediately written to the file. * * @param file Handle to the file. - * @return True on success, false on failure. + * @return True on success or use_valve_fs specified with OpenFile, + * otherwise false on failure. */ -native FlushFile(Handle:file); +native bool FlushFile(Handle file); /** * Removes a directory. @@ -355,7 +551,7 @@ native FlushFile(Handle:file); * @param path Path to the directory. * @return True on success, false otherwise. */ -native bool:RemoveDir(const String:path[]); +native bool RemoveDir(const char[] path); #define FPERM_U_READ 0x0100 /* User can read. */ #define FPERM_U_WRITE 0x0080 /* User can write. */ @@ -373,8 +569,22 @@ native bool:RemoveDir(const String:path[]); * @param path Path to create. * @param mode Permissions (default is o=rx,g=rx,u=rwx). Note that folders must have * the execute bit set on Linux. On Windows, the mode is ignored. + * @param use_valve_fs If true, the Valve file system will be used instead. + * This can be used to create folders in the game's + * Valve search paths, rather than directly in the gamedir. + * @param valve_path_id If use_valve_fs, a search path from gameinfo or NULL_STRING for default. + * In this case, mode is ignored. */ -native bool:CreateDirectory(const String:path[], mode); +native bool CreateDirectory(const char[] path, int mode, bool use_valve_fs=false, const char[] valve_path_id="DEFAULT_WRITE_PATH"); + +/** + * Changes a file or directories permissions. + * + * @param path Path to the file. + * @param mode Permissions to set. + * @return True on success, false otherwise. + */ +native bool SetFilePermissions(const String:path[], int mode); /** * Returns a file timestamp as a unix timestamp. @@ -383,7 +593,7 @@ native bool:CreateDirectory(const String:path[], mode); * @param tmode Time mode. * @return Time value, or -1 on failure. */ -native GetFileTime(const String:file[], FileTimeMode:tmode); +native GetFileTime(const char[] file, FileTimeMode tmode); /** * Same as LogToFile(), except uses an open file Handle. The file must @@ -392,10 +602,9 @@ native GetFileTime(const String:file[], FileTimeMode:tmode); * @param hndl Handle to the file. * @param message Message format. * @param ... Message format parameters. - * @noreturn * @error Invalid Handle. */ -native LogToOpenFile(Handle:hndl, const String:message[], any:...); +native void LogToOpenFile(Handle hndl, const char[] message, any:...); /** * Same as LogToFileEx(), except uses an open file Handle. The file must @@ -404,8 +613,7 @@ native LogToOpenFile(Handle:hndl, const String:message[], any:...); * @param hndl Handle to the file. * @param message Message format. * @param ... Message format parameters. - * @noreturn * @error Invalid Handle. */ -native LogToOpenFileEx(Handle:hndl, const String:message[], any:...); +native void LogToOpenFileEx(Handle hndl, const char[] message, any:...); diff --git a/env/include/float.inc b/env/include/float.inc index 1282158..4c46c3d 100644 --- a/env/include/float.inc +++ b/env/include/float.inc @@ -35,6 +35,7 @@ #endif #define _float_included +#if !defined __sourcepawn2__ /** * Converts an integer into a floating point value. * @@ -42,6 +43,7 @@ * @return Floating point value. */ native Float:float(value); +#endif /** * Multiplies two floats together. @@ -244,6 +246,7 @@ stock RoundFloat(Float:value) * User defined operators. * */ +#if !defined __sourcepawn2__ #pragma rational Float native bool:__FLOAT_GT__(Float:a, Float:b); @@ -368,6 +371,7 @@ stock bool:operator<=(oper1, Float:oper2) forward operator%(Float:oper1, Float:oper2); forward operator%(Float:oper1, oper2); forward operator%(oper1, Float:oper2); +#endif // __sourcepawn2__ #define FLOAT_PI 3.1415926535897932384626433832795 diff --git a/env/include/functions.inc b/env/include/functions.inc index 105f1d2..9308b94 100644 --- a/env/include/functions.inc +++ b/env/include/functions.inc @@ -357,7 +357,7 @@ native Call_Cancel(); * @param numParams Number of parameters passed to the native. * @return Value for the native call to return. */ -functag public NativeCall(Handle:plugin, numParams); +typedef NativeCall = function int (Handle plugin, int numParams); /** * Creates a dynamic native. This should only be called in AskPluginLoad(), or @@ -428,6 +428,15 @@ native SetNativeString(param, const String:source[], maxlength, bool:utf8=true, */ native any:GetNativeCell(param); +/** + * Gets a function pointer from a native parameter. + * + * @param param Parameter number, starting from 1. + * @return Function pointer at the given parameter number. + * @error Invalid parameter number, or calling from a non-native function. + */ +native Function GetNativeFunction(param); + /** * Gets a cell from a native parameter, by reference. * @@ -499,7 +508,7 @@ native FormatNativeString(out_param, * @param data Data passed to the RequestFrame native. * @noreturn */ -functag public RequestFrameCallback(any:data); +typedef RequestFrameCallback = function void (any data); /** * Creates a single use Next Frame hook. diff --git a/env/include/halflife.inc b/env/include/halflife.inc index c734e90..f0dcbc9 100644 --- a/env/include/halflife.inc +++ b/env/include/halflife.inc @@ -568,15 +568,15 @@ native ShowHudText(client, channel, const String:message[], any:...); */ stock ShowMOTDPanel(client, const String:title[], const String:msg[], type=MOTDPANEL_TYPE_INDEX) { - decl String:num[3]; - new Handle:Kv = CreateKeyValues("data"); + char num[3]; IntToString(type, num, sizeof(num)); - KvSetString(Kv, "title", title); - KvSetString(Kv, "type", num); - KvSetString(Kv, "msg", msg); - ShowVGUIPanel(client, "info", Kv); - CloseHandle(Kv); + KeyValues kv = new KeyValues("data"); + kv.SetString("title", title); + kv.SetString("type", num); + kv.SetString("msg", msg); + ShowVGUIPanel(client, "info", kv); + delete kv; } /** @@ -590,13 +590,14 @@ stock ShowMOTDPanel(client, const String:title[], const String:msg[], type=MOTDP */ stock DisplayAskConnectBox(client, Float:time, const String:ip[], const String:password[] = "") { - decl String:destination[288]; + char destination[288]; FormatEx(destination, sizeof(destination), "%s/%s", ip, password); - new Handle:Kv = CreateKeyValues("data"); - KvSetFloat(Kv, "time", time); - KvSetString(Kv, "title", destination); - CreateDialog(client, Kv, DialogType_AskConnect); - CloseHandle(Kv); + + KeyValues kv = new KeyValues("data"); + kv.SetFloat("time", time); + kv.SetString("title", destination); + CreateDialog(client, kv, DialogType_AskConnect); + delete kv; } /** @@ -623,3 +624,21 @@ native EntRefToEntIndex(ref); */ native MakeCompatEntRef(ref); + +enum ClientRangeType +{ + RangeType_Visibility = 0, + RangeType_Audibility, +} + +/** + * Find clients that are potentially in range of a position. + * + * @param origin Coordinates from which to test range. + * @param rangeType Range type to use for filtering clients. + * @param clients Array to which found client indexes will be written. + * @param size Maximum size of clients array. + * @return Number of client indexes written to clients array. + */ +native int GetClientsInRange(float origin[3], ClientRangeType rangeType, int[] clients, int size); + diff --git a/env/include/handles.inc b/env/include/handles.inc index 053ad6f..3294e73 100644 --- a/env/include/handles.inc +++ b/env/include/handles.inc @@ -36,9 +36,9 @@ #define _handles_included /** - * Handle helper macros. + * Preset Handle values. */ -enum Handle +enum Handle: // Tag disables introducing "Handle" as a symbol. { INVALID_HANDLE = 0, }; @@ -52,10 +52,9 @@ enum Handle * sure you read the documentation on whatever provided the Handle. * * @param hndl Handle to close. - * @return True if successful, false if not closeable. * @error Invalid handles will cause a run time error. */ -native bool:CloseHandle(Handle:hndl); +native CloseHandle(Handle:hndl); /** * Clones a Handle. When passing handles in between plugins, caching handles @@ -76,6 +75,15 @@ native bool:CloseHandle(Handle:hndl); */ native Handle:CloneHandle(Handle:hndl, Handle:plugin=INVALID_HANDLE); +/** + * Helper for object-oriented syntax. + */ +methodmap Handle __nullable__ +{ + public Close() = CloseHandle; + public ~Handle() = CloseHandle; +} + /** * Do not use this function. Returns if a Handle and its contents * are readable, whereas INVALID_HANDLE only checks for the absence diff --git a/env/include/helpers.inc b/env/include/helpers.inc index 3b70165..e5e848a 100644 --- a/env/include/helpers.inc +++ b/env/include/helpers.inc @@ -97,59 +97,45 @@ stock Handle:FindPluginByFile(const String:filename[]) * @deprecated Use FindTarget() or ProcessTargetString(). */ #pragma deprecated Use FindTarget() or ProcessTargetString() -stock SearchForClients(const String:pattern[], clients[], maxClients) +stock int SearchForClients(const char[] pattern, int[] clients, int maxClients) { - new total = 0; + int total = 0; if (maxClients == 0) - { return 0; - } - if (pattern[0] == '#') - { - new input = StringToInt(pattern[1]); - if (!input) - { - decl String:name[65] - for (new i=1; i<=MaxClients; i++) - { + if (pattern[0] == '#') { + int input = StringToInt(pattern[1]); + if (!input) { + char name[65]; + for (int i=1; i<=MaxClients; i++) { if (!IsClientInGame(i)) - { continue; - } GetClientName(i, name, sizeof(name)); - if (strcmp(name, pattern, false) == 0) - { + if (strcmp(name, pattern, false) == 0) { clients[0] = i; return 1; } } } else { - new client = GetClientOfUserId(input); - if (client) - { + int client = GetClientOfUserId(input); + if (client) { clients[0] = client; return 1; } } } - decl String:name[65] - for (new i=1; i<=MaxClients; i++) + char name[65]; + for (int i=1; i<=MaxClients; i++) { if (!IsClientInGame(i)) - { continue; - } GetClientName(i, name, sizeof(name)); - if (StrContains(name, pattern, false) != -1) - { + if (StrContains(name, pattern, false) != -1) { clients[total++] = i; if (total >= maxClients) - { break; - } } } @@ -255,18 +241,17 @@ stock FindTarget(client, const String:target[], bool:nobots = false, bool:immuni ClearArray(array); - new Handle:file = OpenFile(mapPath, "rt"); - if (file == INVALID_HANDLE) - { + File file = OpenFile(mapPath, "rt"); + if (!file) { LogError("Could not open file: %s", mapPath); - return 0; } LogMessage("Loading maps from file: %s", mapPath); - decl String:buffer[64], len; - while (!IsEndOfFile(file) && ReadFileLine(file, buffer, sizeof(buffer))) + int len; + char buffer[64]; + while (!file.EndOfFile() && file.ReadLine(buffer, sizeof(buffer))) { TrimString(buffer); @@ -288,6 +273,6 @@ stock FindTarget(client, const String:target[], bool:nobots = false, bool:immuni PushArrayString(array, buffer); } - CloseHandle(file); + file.Close(); return GetArraySize(array); } diff --git a/env/include/keyvalues.inc b/env/include/keyvalues.inc index 51f6580..9b49f8d 100644 --- a/env/include/keyvalues.inc +++ b/env/include/keyvalues.inc @@ -1,7 +1,7 @@ /** - * vim: set ts=4 : + * vim: set ts=4 sw=4 tw=99 noet : * ============================================================================= - * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * SourceMod (C)2004-2014 AlliedModders LLC. All rights reserved. * ============================================================================= * * This file is part of the SourceMod/SourcePawn SDK. @@ -52,6 +52,275 @@ enum KvDataTypes KvData_NUMTYPES, }; +methodmap KeyValues < Handle +{ + // Creates a new KeyValues structure. The Handle must be closed with + // CloseHandle() or delete. + // + // @param name Name of the root section. + // @param firstKey If non-empty, specifies the first key value. + // @param firstValue If firstKey is non-empty, specifies the first key's value. + public native KeyValues(const char[] name, const char[] firstKey="", const char[] firstValue=""); + + // Exports a KeyValues tree to a file. The tree is dumped from the current position. + // + // @param file File to dump write to. + // @return True on success, false otherwise. + public native bool ExportToFile(const char[] file); + + // Imports a file in KeyValues format. The file is read into the current + // position of the tree. + // + // @param file File to read from. + // @return True on success, false otherwise. + public native bool ImportFromFile(const char[] file); + + // Converts a given string to a KeyValues tree. The string is read into + // the current postion of the tree. + // + // @param buffer String buffer to load into the KeyValues. + // @param resourceName The resource name of the KeyValues, used for error tracking purposes. + // @return True on success, false otherwise. + public native bool ImportFromString(const char[] buffer, const char[] resourceName="StringToKeyValues"); + + // Imports subkeys in the given KeyValues, at the current position in that + // KeyValues, into the current position in this KeyValues. Note that this + // copies keys; it does not embed a reference to them. + // + // @param other Origin KeyValues Handle. + public native void Import(KeyValues other); + + // Sets a string value of a KeyValues key. + // + // @param kv KeyValues Handle. + // @param key Name of the key, or NULL_STRING. + // @param value String value. + public native void SetString(const char[] key, const char[] value); + + // Sets an integer value of a KeyValues key. + // + // @param key Name of the key, or NULL_STRING. + // @param value Value number. + public native void SetNum(const char[] key, int value); + + // Sets a large integer value of a KeyValues key. + // + // @param key Name of the key, or NULL_STRING. + // @param value Large integer value (0=High bits, 1=Low bits) + public native void SetUInt64(const char[] key, const value[2]); + + // Sets a floating point value of a KeyValues key. + // + // @param key Name of the key, or NULL_STRING. + // @param value Floating point value. + public native void SetFloat(const char[] key, float value); + + // Sets a set of color values of a KeyValues key. + // + // @param key Name of the key, or NULL_STRING. + // @param r Red value. + // @param g Green value. + // @param b Blue value. + // @param a Alpha value. + public native void SetColor(const char[] key, int r, int g, int b, int a=0); + + // Sets a set of color values of a KeyValues key. + // + // @param key Name of the key, or NULL_STRING. + // @param color Red, green, blue and alpha channels. + public void SetColor4(const char[] key, const int color[4]) { + this.SetColor(key, color[0], color[1], color[2], color[3]); + } + + // Sets a vector value of a KeyValues key. + // + // @param key Name of the key, or NULL_STRING. + // @param vec Vector value. + public native void SetVector(const char[] key, const float vec[3]); + + // Retrieves a string value from a KeyValues key. + // + // @param key Name of the key, or NULL_STRING. + // @param value Buffer to store key value in. + // @param maxlength Maximum length of the value buffer. + // @param defvalue Optional default value to use if the key is not found. + public native void GetString(const char[] key, char[] value, int maxlength, const char[] defvalue=""); + + // Retrieves an integer value from a KeyValues key. + // + // @param key Name of the key, or NULL_STRING. + // @param defvalue Optional default value to use if the key is not found. + // @return Integer value of the key. + public native int GetNum(const char[] key, int defvalue=0); + + // Retrieves a floating point value from a KeyValues key. + // + // @param key Name of the key, or NULL_STRING. + // @param defvalue Optional default value to use if the key is not found. + // @return Floating point value of the key. + public native float GetFloat(const char[] key, float defvalue=0.0); + + // Retrieves a set of color values from a KeyValues key. + // + // @param key Name of the key, or NULL_STRING. + // @param r Red value, set by reference. + // @param g Green value, set by reference. + // @param b Blue value, set by reference. + // @param a Alpha value, set by reference. + public native void GetColor(const char[] key, &r, &g, &b, &a); + + // Retrives a set of color values from a KeyValues key. + // + // @param key Name of the key, or NULL_STRING. + // @param color Red, green, blue, and alpha channels. + public void GetColor4(const char[] key, int color[4]) { + int r, g, b, a; + this.GetColor(key, r, g, b, a); + color[0] = r; + color[1] = g; + color[2] = b; + color[3] = a; + } + + // Retrieves a large integer value from a KeyValues key. + // + // @param key Name of the key, or NULL_STRING. + // @param value Array to represent the large integer. + // @param defvalue Optional default value to use if the key is not found. + public native void GetUInt64(const char[] key, int value[2], int defvalue[2]={0,0}); + + // Retrieves a vector value from a KeyValues key. + // + // @param key Name of the key, or NULL_STRING. + // @param vec Destination vector to store the value in. + // @param defvalue Optional default value to use if the key is not found. + public native void GetVector(const char[] key, float vec[3], const float defvalue[3]={0.0, 0.0, 0.0}); + + // Sets the current position in the KeyValues tree to the given key. + // + // @param key Name of the key. + // @param create If true, and the key does not exist, it will be created. + // @return True if the key exists, false if it does not and was not created. + public native bool JumpToKey(const char[] key, bool create=false); + + // Sets the current position in the KeyValues tree to the given key. + // + // @param id KeyValues id. + // @return True if the key exists, false if it does not. + public native bool JumpToKeySymbol(int id); + + // Sets the current position in the KeyValues tree to the first sub key. + // This native adds to the internal traversal stack. + // + // @param keyOnly If false, non-keys will be traversed (values). + // @return True on success, false if there was no first sub key. + public native bool GotoFirstSubKey(bool keyOnly=true); + + // Sets the current position in the KeyValues tree to the next sub key. + // This native does NOT add to the internal traversal stack, and thus + // GoBack() is not needed for each successive call to this function. + // + // @param keyOnly If false, non-keys will be traversed (values). + // @return True on success, false if there was no next sub key. + public native bool GotoNextKey(bool keyOnly=true); + + // Saves the current position in the traversal stack onto the traversal + // stack. This can be useful if you wish to use KvGotoNextKey() and + // have the previous key saved for backwards traversal. + // + // @param kv KeyValues Handle. + public native void SavePosition(); + + // Jumps back to the previous position. Returns false if there are no + // previous positions (i.e., at the root node). This should be called + // once for each successful Jump call, in order to return to the top node. + // This function pops one node off the internal traversal stack. + // + // @return True on success, false if there is no higher node. + public native bool GoBack(); + + // Removes the given key from the current position. + // + // @param key Name of the key. + // @return True on success, false if key did not exist. + public native bool DeleteKey(const char[] key); + + // Removes the current sub-key and attempts to set the position + // to the sub-key after the removed one. If no such sub-key exists, + // the position will be the parent key in the traversal stack. + // Given the sub-key having position "N" in the traversal stack, the + // removal will always take place from position "N-1." + // + // @param kv KeyValues Handle. + // @return 1 if removal succeeded and there was another key. + // 0 if the current node was not contained in the + // previous node, or no previous node exists. + // -1 if removal succeeded and there were no more keys, + // thus the state is as if KvGoBack() was called. + public native int DeleteThis(); + + // Sets the position back to the top node, emptying the entire node + // traversal history. This can be used instead of looping KvGoBack() + // if recursive iteration is not important. + // + // @param kv KeyValues Handle. + public native void Rewind(); + + // Retrieves the current section name. + // + // @param section Buffer to store the section name. + // @param maxlength Maximum length of the name buffer. + // @return True on success, false on failure. + public native bool GetSectionName(char[] section, int maxlength); + + // Sets the current section name. + // + // @param section Section name. + public native void SetSectionName(const char[] section); + + // Returns the data type at a key. + // + // @param key Key name. + // @return KvDataType value of the key. + public native KvDataTypes GetDataType(const char[] key); + + // Sets whether or not the KeyValues parser will read escape sequences. + // For example, \n would be read as a literal newline. This defaults + // to false for new KeyValues structures. + // + // @param useEscapes Whether or not to read escape sequences. + public native void SetEscapeSequences(bool useEscapes); + + // Returns the position in the jump stack; I.e. the number of calls + // required for KvGoBack to return to the root node. If at the root node, + // 0 is returned. + // + // @return Number of non-root nodes in the jump stack. + public native int NodesInStack(); + + // Finds a KeyValues name by id. + // + // @param id KeyValues id. + // @param name Buffer to store the name. + // @param maxlength Maximum length of the value buffer. + // @return True on success, false if id not found. + public native bool FindKeyById(int id, char[] name, int maxlength); + + // Finds a KeyValues id inside a KeyValues tree. + // + // @param key Key name. + // @param id Id of the found KeyValue. + // @return True on success, false if key not found. + public native bool GetNameSymbol(const char[] key, int &id); + + // Retrieves the current section id. + // + // @param kv KeyValues Handle. + // @param id Id of the current section. + // @return True on success, false on failure. + public native bool GetSectionSymbol(int &id); +}; + /** * Creates a new KeyValues structure. The Handle must always be closed. * @@ -60,7 +329,7 @@ enum KvDataTypes * @param firstValue If firstKey is non-empty, specifies the first key's value. * @return A Handle to a new KeyValues structure. */ -native Handle:CreateKeyValues(const String:name[], const String:firstKey[]="", const String:firstValue[]=""); +native KeyValues CreateKeyValues(const char[] name, const char[] firstKey="", const char[] firstValue=""); /** * Sets a string value of a KeyValues key. @@ -68,10 +337,9 @@ native Handle:CreateKeyValues(const String:name[], const String:firstKey[]="", c * @param kv KeyValues Handle. * @param key Name of the key, or NULL_STRING. * @param value String value. - * @noreturn * @error Invalid Handle. */ -native KvSetString(Handle:kv, const String:key[], const String:value[]); +native void KvSetString(Handle kv, const char[] key, const char[] value); /** * Sets an integer value of a KeyValues key. @@ -79,10 +347,9 @@ native KvSetString(Handle:kv, const String:key[], const String:value[]); * @param kv KeyValues Handle. * @param key Name of the key, or NULL_STRING. * @param value Value number. - * @noreturn * @error Invalid Handle. */ -native KvSetNum(Handle:kv, const String:key[], value); +native void KvSetNum(Handle kv, const char[] key, int value); /** * Sets a large integer value of a KeyValues key. @@ -90,10 +357,9 @@ native KvSetNum(Handle:kv, const String:key[], value); * @param kv KeyValues Handle. * @param key Name of the key, or NULL_STRING. * @param value Large integer value (0=High bits, 1=Low bits) - * @noreturn * @error Invalid Handle. */ -native KvSetUInt64(Handle:kv, const String:key[], const value[2]); +native void KvSetUInt64(Handle kv, const char[] key, const value[2]); /** * Sets a floating point value of a KeyValues key. @@ -101,10 +367,9 @@ native KvSetUInt64(Handle:kv, const String:key[], const value[2]); * @param kv KeyValues Handle. * @param key Name of the key, or NULL_STRING. * @param value Floating point value. - * @noreturn * @error Invalid Handle. */ -native KvSetFloat(Handle:kv, const String:key[], Float:value); +native void KvSetFloat(Handle kv, const char[] key, float value); /** * Sets a set of color values of a KeyValues key. @@ -115,10 +380,9 @@ native KvSetFloat(Handle:kv, const String:key[], Float:value); * @param g Green value. * @param b Blue value. * @param a Alpha value. - * @noreturn * @error Invalid Handle. */ -native KvSetColor(Handle:kv, const String:key[], r, g, b, a=0); +native void KvSetColor(Handle kv, const char[] key, int r, int g, int b, int a=0); /** * Sets a vector value of a KeyValues key. @@ -126,10 +390,9 @@ native KvSetColor(Handle:kv, const String:key[], r, g, b, a=0); * @param kv KeyValues Handle. * @param key Name of the key, or NULL_STRING. * @param vec Vector value. - * @noreturn * @error Invalid Handle. */ -native KvSetVector(Handle:kv, const String:key[], const Float:vec[3]); +native void KvSetVector(Handle kv, const char[] key, const float vec[3]); /** * Retrieves a string value from a KeyValues key. @@ -139,10 +402,9 @@ native KvSetVector(Handle:kv, const String:key[], const Float:vec[3]); * @param value Buffer to store key value in. * @param maxlength Maximum length of the value buffer. * @param defvalue Optional default value to use if the key is not found. - * @noreturn * @error Invalid Handle. */ -native KvGetString(Handle:kv, const String:key[], String:value[], maxlength, const String:defvalue[]=""); +native void KvGetString(Handle kv, const char[] key, char[] value, int maxlength, const char[] defvalue=""); /** * Retrieves an integer value from a KeyValues key. @@ -153,7 +415,7 @@ native KvGetString(Handle:kv, const String:key[], String:value[], maxlength, con * @return Integer value of the key. * @error Invalid Handle. */ -native KvGetNum(Handle:kv, const String:key[], defvalue=0); +native int KvGetNum(Handle kv, const char[] key, int defvalue=0); /** * Retrieves a floating point value from a KeyValues key. @@ -164,7 +426,7 @@ native KvGetNum(Handle:kv, const String:key[], defvalue=0); * @return Floating point value of the key. * @error Invalid Handle. */ -native Float:KvGetFloat(Handle:kv, const String:key[], Float:defvalue=0.0); +native float KvGetFloat(Handle kv, const char[] key, float defvalue=0.0); /** * Retrieves a set of color values from a KeyValues key. @@ -175,10 +437,9 @@ native Float:KvGetFloat(Handle:kv, const String:key[], Float:defvalue=0.0); * @param g Green value, set by reference. * @param b Blue value, set by reference. * @param a Alpha value, set by reference. - * @noreturn * @error Invalid Handle. */ -native KvGetColor(Handle:kv, const String:key[], &r, &g, &b, &a); +native void KvGetColor(Handle kv, const char[] key, int &r, int &g, int &b, int &a); /** * Retrieves a large integer value from a KeyValues key. @@ -187,10 +448,9 @@ native KvGetColor(Handle:kv, const String:key[], &r, &g, &b, &a); * @param key Name of the key, or NULL_STRING. * @param value Array to represent the large integer. * @param defvalue Optional default value to use if the key is not found. - * @noreturn * @error Invalid Handle. */ -native KvGetUInt64(Handle:kv, const String:key[], value[2], defvalue[2]={0,0}); +native void KvGetUInt64(Handle kv, const char[] key, int value[2], int defvalue[2]={0,0}); /** * Retrieves a vector value from a KeyValues key. @@ -199,10 +459,9 @@ native KvGetUInt64(Handle:kv, const String:key[], value[2], defvalue[2]={0,0}); * @param key Name of the key, or NULL_STRING. * @param vec Destination vector to store the value in. * @param defvalue Optional default value to use if the key is not found. - * @noreturn * @error Invalid Handle. */ -native KvGetVector(Handle:kv, const String:key[], Float:vec[3], const Float:defvalue[3]={0.0, 0.0, 0.0}); +native void KvGetVector(Handle kv, const char[] key, float vec[3], const float defvalue[3]={0.0, 0.0, 0.0}); /** * Sets the current position in the KeyValues tree to the given key. @@ -212,7 +471,7 @@ native KvGetVector(Handle:kv, const String:key[], Float:vec[3], const Float:defv * @param create If true, and the key does not exist, it will be created. * @return True if the key exists, false if it does not and was not created. */ -native bool:KvJumpToKey(Handle:kv, const String:key[], bool:create=false); +native bool KvJumpToKey(Handle kv, const char[] key, bool create=false); /** * Sets the current position in the KeyValues tree to the given key. @@ -221,7 +480,7 @@ native bool:KvJumpToKey(Handle:kv, const String:key[], bool:create=false); * @param id KeyValues id. * @return True if the key exists, false if it does not. */ -native bool:KvJumpToKeySymbol(Handle:kv, id); +native bool KvJumpToKeySymbol(Handle kv, int id); /** * Sets the current position in the KeyValues tree to the first sub key. @@ -232,7 +491,7 @@ native bool:KvJumpToKeySymbol(Handle:kv, id); * @return True on success, false if there was no first sub key. * @error Invalid Handle. */ -native bool:KvGotoFirstSubKey(Handle:kv, bool:keyOnly=true); +native bool KvGotoFirstSubKey(Handle kv, bool keyOnly=true); /** * Sets the current position in the KeyValues tree to the next sub key. @@ -244,7 +503,7 @@ native bool:KvGotoFirstSubKey(Handle:kv, bool:keyOnly=true); * @return True on success, false if there was no next sub key. * @error Invalid Handle. */ -native bool:KvGotoNextKey(Handle:kv, bool:keyOnly=true); +native bool KvGotoNextKey(Handle kv, bool keyOnly=true); /** * Saves the current position in the traversal stack onto the traversal @@ -252,10 +511,9 @@ native bool:KvGotoNextKey(Handle:kv, bool:keyOnly=true); * have the previous key saved for backwards traversal. * * @param kv KeyValues Handle. - * @noreturn * @error Invalid Handle. */ -native KvSavePosition(Handle:kv); +native void KvSavePosition(Handle kv); /** * Removes the given key from the current position. @@ -265,7 +523,7 @@ native KvSavePosition(Handle:kv); * @return True on success, false if key did not exist. * @error Invalid Handle. */ -native bool:KvDeleteKey(Handle:kv, const String:key[]); +native bool KvDeleteKey(Handle kv, const char[] key); /** * Removes the current sub-key and attempts to set the position @@ -282,7 +540,7 @@ native bool:KvDeleteKey(Handle:kv, const String:key[]); * thus the state is as if KvGoBack() was called. * @error Invalid Handle. */ -native KvDeleteThis(Handle:kv); +native int KvDeleteThis(Handle kv); /** * Jumps back to the previous position. Returns false if there are no @@ -294,7 +552,7 @@ native KvDeleteThis(Handle:kv); * @return True on success, false if there is no higher node. * @error Invalid Handle. */ -native bool:KvGoBack(Handle:kv); +native bool KvGoBack(Handle kv); /** * Sets the position back to the top node, emptying the entire node @@ -302,10 +560,9 @@ native bool:KvGoBack(Handle:kv); * if recursive iteration is not important. * * @param kv KeyValues Handle. - * @noreturn * @error Invalid Handle. */ -native KvRewind(Handle:kv); +native void KvRewind(Handle kv); /** * Retrieves the current section name. @@ -316,17 +573,16 @@ native KvRewind(Handle:kv); * @return True on success, false on failure. * @error Invalid Handle. */ -native bool:KvGetSectionName(Handle:kv, String:section[], maxlength); +native bool KvGetSectionName(Handle kv, char[] section, int maxlength); /** * Sets the current section name. * * @param kv KeyValues Handle. * @param section Section name. - * @noreturn * @error Invalid Handle. */ -native KvSetSectionName(Handle:kv, const String:section[]); +native void KvSetSectionName(Handle kv, const char[] section); /** * Returns the data type at a key. @@ -336,7 +592,7 @@ native KvSetSectionName(Handle:kv, const String:section[]); * @return KvDataType value of the key. * @error Invalid Handle. */ -native KvDataTypes:KvGetDataType(Handle:kv, const String:key[]); +native KvDataTypes KvGetDataType(Handle kv, const char[] key); /** * Converts a KeyValues tree to a file. The tree is dumped @@ -347,7 +603,7 @@ native KvDataTypes:KvGetDataType(Handle:kv, const String:key[]); * @return True on success, false otherwise. * @error Invalid Handle. */ -native bool:KeyValuesToFile(Handle:kv, const String:file[]); +native bool KeyValuesToFile(Handle kv, const char[] file); /** * Converts a file to a KeyValues tree. The file is read into @@ -358,7 +614,19 @@ native bool:KeyValuesToFile(Handle:kv, const String:file[]); * @return True on success, false otherwise. * @error Invalid Handle. */ -native bool:FileToKeyValues(Handle:kv, const String:file[]); +native bool FileToKeyValues(Handle kv, const char[] file); + +/** + * Converts a given string to a KeyValues tree. The string is read into + * the current postion of the tree. + * + * @param kv KeyValues Handle. + * @param buffer String buffer to load into the KeyValues. + * @param resourceName The resource name of the KeyValues, used for error tracking purposes. + * @return True on success, false otherwise. + * @error Invalid Handle. + */ +native bool StringToKeyValues(Handle kv, const char[] buffer, const char[] resourceName="StringToKeyValues"); /** * Sets whether or not the KeyValues parser will read escape sequences. @@ -367,10 +635,9 @@ native bool:FileToKeyValues(Handle:kv, const String:file[]); * * @param kv KeyValues Handle. * @param useEscapes Whether or not to read escape sequences. - * @noreturn * @error Invalid Handle. */ -native KvSetEscapeSequences(Handle:kv, bool:useEscapes); +native void KvSetEscapeSequences(Handle kv, bool useEscapes); /** * Returns the position in the jump stack; I.e. the number of calls @@ -381,7 +648,7 @@ native KvSetEscapeSequences(Handle:kv, bool:useEscapes); * @return Number of non-root nodes in the jump stack. * @error Invalid Handle. */ -native KvNodesInStack(Handle:kv); +native int KvNodesInStack(Handle kv); /** * Makes a new copy of all subkeys in the origin KeyValues to @@ -390,10 +657,9 @@ native KvNodesInStack(Handle:kv); * * @param origin Origin KeyValues Handle. * @param dest Destination KeyValues Handle. - * @noreturn * @error Invalid Handle. */ -native KvCopySubkeys(Handle:origin, Handle:dest); +native void KvCopySubkeys(Handle origin, Handle dest); /** * Finds a KeyValues name by id. @@ -405,7 +671,7 @@ native KvCopySubkeys(Handle:origin, Handle:dest); * @return True on success, false if id not found. * @error Invalid Handle. */ -native bool:KvFindKeyById(Handle:kv, id, String:name[], maxlength); +native bool KvFindKeyById(Handle kv, int id, char[] name, int maxlength); /** * Finds a KeyValues id inside a KeyValues tree. @@ -416,7 +682,7 @@ native bool:KvFindKeyById(Handle:kv, id, String:name[], maxlength); * @return True on success, false if key not found. * @error Invalid Handle. */ -native bool:KvGetNameSymbol(Handle:kv, const String:key[], &id); +native bool KvGetNameSymbol(Handle kv, const char[] key, int &id); /** * Retrieves the current section id. @@ -426,4 +692,4 @@ native bool:KvGetNameSymbol(Handle:kv, const String:key[], &id); * @return True on success, false on failure. * @error Invalid Handle. */ -native bool:KvGetSectionSymbol(Handle:kv, &id); +native bool KvGetSectionSymbol(Handle kv, int &id); diff --git a/env/include/lang.inc b/env/include/lang.inc index 6ff4464..6e05a2b 100644 --- a/env/include/lang.inc +++ b/env/include/lang.inc @@ -59,7 +59,6 @@ native SetGlobalTransTarget(client); /** * Retrieves the language number of a client. - * Currently this simply returns the server language index. * * @param client Client index. * @return Language number client is using. diff --git a/env/include/logging.inc b/env/include/logging.inc index 4269b22..b5c42a3 100644 --- a/env/include/logging.inc +++ b/env/include/logging.inc @@ -123,7 +123,7 @@ forward Action:OnLogAction(Handle:source, * @return Plugin_Handled or Plugin_Stop will prevent the message * from being written to the log file. */ -functag public Action:GameLogHook(const String:message[]); +typedef GameLogHook = function Action (const char[] message); /** * Adds a game log hook. diff --git a/env/include/mapchooser.inc b/env/include/mapchooser.inc index 0e9e73c..fd218e6 100644 --- a/env/include/mapchooser.inc +++ b/env/include/mapchooser.inc @@ -98,12 +98,12 @@ native bool:EndOfMapVoteEnabled(); * Called when mapchooser removes a nomination from its list. * Nominations cleared on map start will not trigger this forward */ -forward OnNominationRemoved(const String:map[], owner); +forward void OnNominationRemoved(const char[] map, int owner); /** * Called when mapchooser starts a Map Vote. */ -forward OnMapVoteStarted(); +forward void OnMapVoteStarted(); public SharedPlugin:__pl_mapchooser = diff --git a/env/include/menus.inc b/env/include/menus.inc index fa6cbac..a4acd40 100644 --- a/env/include/menus.inc +++ b/env/include/menus.inc @@ -1,7 +1,7 @@ /** - * vim: set ts=4 : + * vim: set ts=4 sw=4 tw=99 noet : * ============================================================================= - * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * SourceMod (C)2004-2014 AlliedModders LLC. All rights reserved. * ============================================================================= * * This file is part of the SourceMod/SourcePawn SDK. @@ -150,9 +150,296 @@ enum MenuSource * @param action The action of the menu. * @param param1 First action parameter (usually the client). * @param param2 Second action parameter (usually the item). - * @noreturn */ -functag public MenuHandler(Handle:menu, MenuAction:action, param1, param2); +typedef MenuHandler = function int (Menu menu, MenuAction action, int param1, int param2); + +// Panels are used for drawing raw menus without any extra helper functions. +// Handles must be closed via delete or CloseHandle(). +methodmap Panel < Handle +{ + // Constructor for a new Panel. + // + // @param hStyle MenuStyle Handle, or null to use the default style. + public native Panel(Handle hStyle = null); + + // Sets the panel's title. + // + // @param text Text to set as the title. + // @param onlyIfEmpty If true, the title will only be set if no title is set. + public native void SetTitle(const char[] text, bool onlyIfEmpty=false); + + // Draws an item on a panel. If the item takes up a slot, the position + // is returned. + // + // @param text Display text to use. If not a raw line, + // the style may automatically add color markup. + // No numbering or newlines are needed. + // @param style ITEMDRAW style flags. + // @return A slot position, or 0 if item was a rawline or could not be drawn. + public native void DrawItem(const char[] text, style=ITEMDRAW_DEFAULT); + + // Draws a raw line of text on a panel, without any markup other than a + // newline. + // + // @param text Display text to use. + // @return True on success, false if raw lines are not supported. + public native bool DrawText(const char[] text); + + // Returns whether or not the given drawing flags are supported by + // the menu style. + // + // @param style ITEMDRAW style flags. + // @return True if item is drawable, false otherwise. + public native bool CanDrawFlags(int style); + + // Sets the selectable key map of a panel. This is not supported by + // all styles (only by Radio, as of this writing). + // + // @param keys An integer where each bit N allows key + // N+1 to be selected. If no keys are selectable, + // then key 0 (bit 9) is automatically set. + // @return True if supported, false otherwise. + public native bool SetKeys(int keys); + + // Sends a panel to a client. Unlike full menus, the handler + // function will only receive the following actions, both of + // which will have null for a menu, and the client as param1. + // + // MenuAction_Select (param2 will be the key pressed) + // MenuAction_Cancel (param2 will be the reason) + // + // Also, if the menu fails to display, no callbacks will be called. + // + // @param client A client to draw to. + // @param handler The MenuHandler function to catch actions with. + // @param time Time to hold the menu for. + // @return True on success, false on failure. + public native bool Send(int client, MenuHandler handler, int time); + + // Returns the amount of text the menu can still hold. If this is + // limit is reached or overflowed, the text is silently truncated. + // + // Radio menus: Currently 511 characters (512 bytes). + // Valve menus: Currently -1 (no meaning). + property int TextRemaining { + public native get(); + } + + // Returns or sets the current key position, starting at 1. This cannot be + // used to traverse backwards. + property int CurrentKey { + public native get(); + public native set(int key); + } + + // Returns the panel's style. Style handles are global and cannot be closed. + property Handle Style { + public native get(); + } +}; + +// A menu is a helper object for managing in-game menus. +methodmap Menu < Handle +{ + // Creates a new, empty menu using the default style. + // + // @param handler Function which will receive menu actions. + // @param actions Optionally set which actions to receive. Select, + // Cancel, and End will always be received regardless + // of whether they are set or not. They are also + // the only default actions. + public native Menu(MenuHandler handler, MenuAction actions=MENU_ACTIONS_DEFAULT); + + // Displays a menu to a client. + // + // @param client Client index. + // @param time Maximum time to leave menu on the screen. + // @return True on success, false on failure. + // @error Client not in game. + public native bool Display(int client, int time); + + // Displays a menu to a client, starting from the given item. + // + // @param client Client index. + // @param first_item First item to begin drawing from. + // @param time Maximum time to leave menu on the screen. + // @return True on success, false on failure. + // @error Client not in game. + /// + public native bool DisplayAt(int client, int first_item, int time); + + // Appends a new item to the end of a menu. + // + // @param info Item information string. + // @param display Default item display string. + // @param style Drawing style flags. Anything other than DEFAULT or + // DISABLED will be completely ignored when paginating. + // @return True on success, false on failure. + // @error Item limit reached. + public native bool AddItem(const char[] info, const char[] display, int style=ITEMDRAW_DEFAULT); + + // Inserts an item into the menu before a certain position; the new item will + // be at the given position and all next items pushed forward. + // + // @param position Position, starting from 0. + // @param info Item information string. + // @param display Default item display string. + // @param style Drawing style flags. Anything other than DEFAULT or + // DISABLED will be completely ignored when paginating. + // @return True on success, false on failure. + // @error Invalid menu position. + public native bool InsertItem(int position, const char[] info, + const char[] display, int style=ITEMDRAW_DEFAULT); + + // Removes an item from the menu. + // + // @param position Position, starting from 0. + // @return True on success, false on failure. + // @error Invalid menu position. + public native bool RemoveItem(int position); + + // Removes all items from a menu. + public native void RemoveAllItems(); + + // Retrieves information about a menu item. + // + // @param position Position, starting from 0. + // @param infoBuf Info buffer. + // @param infoBufLen Maximum length of the info buffer. + // @param style By-reference variable to store drawing flags. + // @param dispBuf Display buffer. + // @param dispBufLen Maximum length of the display buffer. + // @return True on success, false if position is invalid. + public native bool GetItem(int position, char[] infoBuf, int infoBufLen, + int &style=0, char[] dispBuf="", int dispBufLen=0); + + // Sets the menu's default title/instruction message. + // + // @param fmt Message string format + // @param ... Message string arguments. + public native void SetTitle(const char[] fmt, any ...); + + // Returns the text of a menu's title. + // + // @param menu Menu Handle. + // @param buffer Buffer to store title. + // @param maxlength Maximum length of the buffer. + // @return Number of bytes written. + public native void GetTitle(char[] buffer, int maxlength); + + // Creates a raw MenuPanel based off the menu's style. + // The Handle must be freed with CloseHandle(). + // + // @param menu Menu Handle. + // @return A new MenuPanel Handle. + public native Panel ToPanel(); + + // Cancels a menu from displaying on all clients. While the + // cancellation is in progress, this menu cannot be re-displayed + // to any clients. + // + // The menu may still exist on the client's screen after this command. + // This simply verifies that the menu is not being used anywhere. + // + // If any vote is in progress on a menu, it will be cancelled. + public native void Cancel(); + + // Broadcasts a menu to a list of clients. The most selected item will be + // returned through MenuAction_End. On a tie, a random item will be returned + // from a list of the tied items. + // + // Note that MenuAction_VoteEnd and MenuAction_VoteStart are both + // default callbacks and do not need to be enabled. + // + // @param clients Array of clients to broadcast to. + // @param numClients Number of clients in the array. + // @param time Maximum time to leave menu on the screen. + // @param flags Optional voting flags. + // @return True on success, false if this menu already has a + // vote session in progress. + // @error A vote is already in progress. + public native bool DisplayVote(int[] clients, int numClients, int time, int flags=0); + + // Sends a vote menu to all clients. See VoteMenu() for more information. + // + // @param time Maximum time to leave menu on the screen. + // @param flags Optional voting flags. + // @return True on success, false if this menu already has a + // vote session in progress. + public bool DisplayVoteToAll(int time, int flags=0) { + int total = 0; + int[] players = new int[MaxClients]; + for (int i = 1; i <= MaxClients; i++) { + if (!IsClientInGame(i) || IsFakeClient(i)) + continue; + players[total++] = i; + } + return this.DisplayVote(players, total, time, flags); + } + + // Get or set the menu's pagination. + // + // If pgination is MENU_NO_PAGINATION, and the exit button flag is set, + // then the exit button flag is removed. It can be re-applied if desired. + property int Pagination { + public native get(); + public native set(int value); + } + + // Get or set the menu's option flags. + // + // If a certain bit is not supported, it will be stripped before being set. + property int OptionFlags { + public native get(); + public native set(int value); + } + + // Returns whether or not the menu has an exit button. By default, menus + // have an exit button. + property bool ExitButton { + public native get(); + public native set(bool value); + } + + // Controls whether or not the menu has an "exit back" button. By default, + // menus do not have an exit back button. + // + // Exit Back buttons appear as "Back" on page 1 of paginated menus and have + // functionality defined by the user in MenuEnd_ExitBack. + property bool ExitBackButton { + public native get(); + public native set(bool value); + } + + // Sets whether or not the menu has a "no vote" button in slot 1. + // By default, menus do not have a no vote button. + property bool NoVoteButton { + public native set(bool value); + } + + // Sets an advanced vote handling callback. If this callback is set, + // MenuAction_VoteEnd will not be called. + property VoteHandler VoteResultCallback { + public native set(VoteHandler handler); + } + + // Returns the number of items in a menu. + property int ItemCount { + public native get(); + } + + // Returns the menu style. The Handle is global and cannot be closed. + property Handle Style { + public native get(); + } + + // Returns the first item on the page of a currently selected menu. + // + // This is only valid inside a MenuAction_Select callback. + property int Selection { + public native get(); + } +} /** * Creates a new, empty menu using the default style. @@ -164,7 +451,7 @@ functag public MenuHandler(Handle:menu, MenuAction:action, param1, param2); * the only default actions. * @return A new menu Handle. */ -native Handle:CreateMenu(MenuHandler:handler, MenuAction:actions=MENU_ACTIONS_DEFAULT); +native Menu CreateMenu(MenuHandler handler, MenuAction actions=MENU_ACTIONS_DEFAULT); /** * Displays a menu to a client. @@ -175,7 +462,7 @@ native Handle:CreateMenu(MenuHandler:handler, MenuAction:actions=MENU_ACTIONS_DE * @return True on success, false on failure. * @error Invalid Handle or client not in game. */ -native bool:DisplayMenu(Handle:menu, client, time); +native bool DisplayMenu(Handle menu, int client, int time); /** * Displays a menu to a client, starting from the given item. @@ -187,7 +474,7 @@ native bool:DisplayMenu(Handle:menu, client, time); * @return True on success, false on failure. * @error Invalid Handle or client not in game. */ -native bool:DisplayMenuAtItem(Handle:menu, client, first_item, time); +native bool DisplayMenuAtItem(Handle menu, int client, int first_item, int time); /** * Appends a new item to the end of a menu. @@ -200,10 +487,10 @@ native bool:DisplayMenuAtItem(Handle:menu, client, first_item, time); * @return True on success, false on failure. * @error Invalid Handle or item limit reached. */ -native AddMenuItem(Handle:menu, - const String:info[], - const String:display[], - style=ITEMDRAW_DEFAULT); +native bool AddMenuItem(Handle menu, + const char[] info, + const char[] display, + int style=ITEMDRAW_DEFAULT); /** * Inserts an item into the menu before a certain position; the new item will @@ -218,11 +505,11 @@ native AddMenuItem(Handle:menu, * @return True on success, false on failure. * @error Invalid Handle or menu position. */ -native bool:InsertMenuItem(Handle:menu, +native bool InsertMenuItem(Handle menu, position, - const String:info[], - const String:display[], - style=ITEMDRAW_DEFAULT); + const char[] info, + const char[] display, + int style=ITEMDRAW_DEFAULT); /** * Removes an item from the menu. @@ -232,16 +519,15 @@ native bool:InsertMenuItem(Handle:menu, * @return True on success, false on failure. * @error Invalid Handle or menu position. */ -native bool:RemoveMenuItem(Handle:menu, position); +native bool RemoveMenuItem(Handle menu, int position); /** * Removes all items from a menu. * * @param menu Menu Handle. - * @noreturn * @error Invalid Handle or menu position. */ -native RemoveAllMenuItems(Handle:menu); +native void RemoveAllMenuItems(Handle menu); /** * Retrieves information about a menu item. @@ -256,13 +542,13 @@ native RemoveAllMenuItems(Handle:menu); * @return True on success, false if position is invalid. * @error Invalid Handle. */ -native bool:GetMenuItem(Handle:menu, - position, - String:infoBuf[], - infoBufLen, - &style=0, - String:dispBuf[]="", - dispBufLen=0); +native bool GetMenuItem(Handle menu, + int position, + char[] infoBuf, + int infoBufLen, + int &style=0, + char[] dispBuf="", + int dispBufLen=0); /** * Returns the first item on the page of a currently selected menu. @@ -275,7 +561,7 @@ native bool:GetMenuItem(Handle:menu, * position. * @error Not called from inside a MenuAction_Select callback. */ -native GetMenuSelectionPosition(); +native int GetMenuSelectionPosition(); /** * Returns the number of items in a menu. @@ -284,7 +570,7 @@ native GetMenuSelectionPosition(); * @return Number of items in the menu. * @error Invalid Handle. */ -native GetMenuItemCount(Handle:menu); +native int GetMenuItemCount(Handle menu); /** * Sets whether the menu should be paginated or not. @@ -298,7 +584,7 @@ native GetMenuItemCount(Handle:menu); * low. * @error Invalid Handle. */ -native bool:SetMenuPagination(Handle:menu, itemsPerPage); +native bool SetMenuPagination(Handle menu, int itemsPerPage); /** * Returns a menu's pagination setting. @@ -307,7 +593,7 @@ native bool:SetMenuPagination(Handle:menu, itemsPerPage); * @return Pagination setting. * @error Invalid Handle. */ -native GetMenuPagination(Handle:menu); +native int GetMenuPagination(Handle menu); /** * Returns a menu's MenuStyle Handle. The Handle @@ -317,7 +603,7 @@ native GetMenuPagination(Handle:menu); * @return Handle to the menu's draw style. * @error Invalid Handle. */ -native Handle:GetMenuStyle(Handle:menu); +native Handle GetMenuStyle(Handle menu); /** * Sets the menu's default title/instruction message. @@ -325,10 +611,9 @@ native Handle:GetMenuStyle(Handle:menu); * @param menu Menu Handle. * @param fmt Message string format * @param ... Message string arguments. - * @noreturn * @error Invalid Handle. */ -native SetMenuTitle(Handle:menu, const String:fmt[], any:...); +native void SetMenuTitle(Handle menu, const char[] fmt, any ...); /** * Returns the text of a menu's title. @@ -339,7 +624,7 @@ native SetMenuTitle(Handle:menu, const String:fmt[], any:...); * @return Number of bytes written. * @error Invalid Handle/ */ -native GetMenuTitle(Handle:menu, String:buffer[], maxlength); +native int GetMenuTitle(Handle menu, char[] buffer, int maxlength); /** * Creates a raw MenuPanel based off the menu's style. @@ -349,7 +634,7 @@ native GetMenuTitle(Handle:menu, String:buffer[], maxlength); * @return A new MenuPanel Handle. * @error Invalid Handle. */ -native Handle:CreatePanelFromMenu(Handle:menu); +native Panel CreatePanelFromMenu(Handle menu); /** * Returns whether or not the menu has an exit button. @@ -359,7 +644,7 @@ native Handle:CreatePanelFromMenu(Handle:menu); * @return True if the menu has an exit button; false otherwise. * @error Invalid Handle. */ -native bool:GetMenuExitButton(Handle:menu); +native bool GetMenuExitButton(Handle menu); /** * Sets whether or not the menu has an exit button. By default, paginated menus @@ -377,7 +662,7 @@ native bool:GetMenuExitButton(Handle:menu); * @return True if allowed; false on failure. * @error Invalid Handle. */ -native bool:SetMenuExitButton(Handle:menu, bool:button); +native bool SetMenuExitButton(Handle menu, bool button); /** * Returns whether or not the menu has an "exit back" button. By default, @@ -390,7 +675,7 @@ native bool:SetMenuExitButton(Handle:menu, bool:button); * @return True if the menu has an exit back button; false otherwise. * @error Invalid Handle. */ -native bool:GetMenuExitBackButton(Handle:menu); +native bool GetMenuExitBackButton(Handle menu); /** * Sets whether or not the menu has an "exit back" button. By default, menus @@ -403,7 +688,7 @@ native bool:GetMenuExitBackButton(Handle:menu); * @param button True to enable the button, false to remove it. * @error Invalid Handle. */ -native SetMenuExitBackButton(Handle:menu, bool:button); +native void SetMenuExitBackButton(Handle menu, bool button); /** * Sets whether or not the menu has a "no vote" button in slot 1. @@ -414,7 +699,7 @@ native SetMenuExitBackButton(Handle:menu, bool:button); * @return True if allowed; false on failure. * @error Invalid Handle. */ -native bool:SetMenuNoVoteButton(Handle:menu, bool:button); +native bool SetMenuNoVoteButton(Handle menu, bool button); /** * Cancels a menu from displaying on all clients. While the @@ -427,10 +712,9 @@ native bool:SetMenuNoVoteButton(Handle:menu, bool:button); * If any vote is in progress on a menu, it will be cancelled. * * @param menu Menu Handle. - * @noreturn * @error Invalid Handle. */ -native CancelMenu(Handle:menu); +native void CancelMenu(Handle menu); /** * Retrieves a menu's option flags. @@ -439,7 +723,7 @@ native CancelMenu(Handle:menu); * @return A bitstring of MENUFLAG bits. * @error Invalid Handle. */ -native GetMenuOptionFlags(Handle:menu); +native int GetMenuOptionFlags(Handle menu); /** * Sets a menu's option flags. @@ -450,10 +734,9 @@ native GetMenuOptionFlags(Handle:menu); * * @param menu Menu Handle. * @param flags A new bitstring of MENUFLAG bits. - * @noreturn * @error Invalid Handle. */ -native SetMenuOptionFlags(Handle:menu, flags); +native void SetMenuOptionFlags(Handle menu, int flags); /** * Returns whether a vote is in progress. @@ -461,15 +744,14 @@ native SetMenuOptionFlags(Handle:menu, flags); * @param menu Deprecated; no longer used. * @return True if a vote is in progress, false otherwise. */ -native bool:IsVoteInProgress(Handle:menu=INVALID_HANDLE); +native bool IsVoteInProgress(Handle menu=INVALID_HANDLE); /** * Cancels the vote in progress. * - * @noreturn * @error If no vote is in progress. */ -native CancelVote(); +native void CancelVote(); /** * Broadcasts a menu to a list of clients. The most selected item will be @@ -488,7 +770,7 @@ native CancelVote(); * in progress. * @error Invalid Handle, or a vote is already in progress. */ -native bool:VoteMenu(Handle:menu, clients[], numClients, time, flags=0); +native bool VoteMenu(Handle menu, int[] clients, int numClients, int time, int flags=0); /** * Sends a vote menu to all clients. See VoteMenu() for more information. @@ -500,7 +782,7 @@ native bool:VoteMenu(Handle:menu, clients[], numClients, time, flags=0); * in progress. * @error Invalid Handle. */ -stock bool:VoteMenuToAll(Handle:menu, time, flags=0) +stock bool VoteMenuToAll(Handle menu, int time, int flags=0) { new total; decl players[MaxClients]; @@ -516,6 +798,7 @@ stock bool:VoteMenuToAll(Handle:menu, time, flags=0) return VoteMenu(menu, players, total, time, flags); } + /** * Callback for when a vote has ended and results are available. * @@ -526,14 +809,29 @@ stock bool:VoteMenuToAll(Handle:menu, time, flags=0) * @param num_items Number of unique items that were selected. * @param item_info Array of items, sorted by count. Use VOTEINFO_ITEM * defines. - * @noreturn */ -functag public VoteHandler(Handle:menu, - num_votes, - num_clients, - const client_info[][2], - num_items, - const item_info[][2]); +typeset VoteHandler +{ + // old style + function void( + Menu menu, + int num_votes, + int num_clients, + const int client_info[][2], + int num_items, + const int item_info[][2] + ); + + // new style + function void( + Menu menu, + int num_votes, + int num_clients, + const int[][] client_info, + int num_items, + const int[][] item_info + ); +}; /** * Sets an advanced vote handling callback. If this callback is set, @@ -541,10 +839,9 @@ functag public VoteHandler(Handle:menu, * * @param menu Menu Handle. * @param callback Callback function. - * @noreturn * @error Invalid Handle or callback. */ -native SetVoteResultCallback(Handle:menu, VoteHandler:callback); +native void SetVoteResultCallback(Handle menu, VoteHandler callback); /** * Returns the number of seconds you should "wait" before displaying @@ -553,7 +850,7 @@ native SetVoteResultCallback(Handle:menu, VoteHandler:callback); * * @return Number of seconds to wait, or 0 for none. */ -native CheckVoteDelay(); +native int CheckVoteDelay(); /** * Returns whether a client is in the pool of clients allowed @@ -564,7 +861,7 @@ native CheckVoteDelay(); * @return True if client is allowed to vote, false otherwise. * @error If no vote is in progress or client index is invalid. */ -native bool:IsClientInVotePool(client); +native bool IsClientInVotePool(int client); /** * Redraws the current vote menu to a client in the voting pool. @@ -573,10 +870,10 @@ native bool:IsClientInVotePool(client); * @param revotes True to allow revotes, false otherwise. * @return True on success, false if the client is in the vote pool * but cannot vote again. - * @error No vote in progress, client is not in the voting pool, + * @error No vote in progress, int client is not in the voting pool, * or client index is invalid. */ -native bool:RedrawClientVoteMenu(client, bool:revotes=true); +native bool RedrawClientVoteMenu(int client, bool revotes=true); /** * Returns a style's global Handle. @@ -584,7 +881,7 @@ native bool:RedrawClientVoteMenu(client, bool:revotes=true); * @param style Menu Style. * @return A Handle, or INVALID_HANDLE if not found or unusable. */ -native Handle:GetMenuStyleHandle(MenuStyle:style); +native Handle GetMenuStyleHandle(MenuStyle style); /** * Creates a MenuPanel from a MenuStyle. Panels are used for drawing raw @@ -595,7 +892,7 @@ native Handle:GetMenuStyleHandle(MenuStyle:style); * @return A new MenuPanel Handle. * @error Invalid Handle other than INVALID_HANDLE. */ -native Handle:CreatePanel(Handle:hStyle=INVALID_HANDLE); +native Panel CreatePanel(Handle hStyle=INVALID_HANDLE); /** * Creates a Menu from a MenuStyle. The Handle must be closed with @@ -610,7 +907,7 @@ native Handle:CreatePanel(Handle:hStyle=INVALID_HANDLE); * @return A new menu Handle. * @error Invalid Handle other than INVALID_HANDLE. */ -native Handle:CreateMenuEx(Handle:hStyle=INVALID_HANDLE, MenuHandler:handler, MenuAction:actions=MENU_ACTIONS_DEFAULT); +native Menu CreateMenuEx(Handle hStyle=INVALID_HANDLE, MenuHandler handler, MenuAction actions=MENU_ACTIONS_DEFAULT); /** * Returns whether a client is viewing a menu. @@ -618,9 +915,9 @@ native Handle:CreateMenuEx(Handle:hStyle=INVALID_HANDLE, MenuHandler:handler, Me * @param client Client index. * @param hStyle MenuStyle Handle, or INVALID_HANDLE to use the default style. * @return A MenuSource value. - * @error Invalid Handle other than INVALID_HANDLE. + * @error Invalid Handle other than null. */ -native MenuSource:GetClientMenu(client, Handle:hStyle=INVALID_HANDLE); +native MenuSource GetClientMenu(int client, Handle hStyle=null); /** * Cancels a menu on a client. This will only affect non-external menus. @@ -631,7 +928,7 @@ native MenuSource:GetClientMenu(client, Handle:hStyle=INVALID_HANDLE); * the cancellation process. * @return True if a menu was cancelled, false otherwise. */ -native bool:CancelClientMenu(client, bool:autoIgnore=false, Handle:hStyle=INVALID_HANDLE); +native bool CancelClientMenu(int client, bool autoIgnore=false, Handle hStyle=INVALID_HANDLE); /** * Returns a style's maximum items per page. @@ -640,7 +937,7 @@ native bool:CancelClientMenu(client, bool:autoIgnore=false, Handle:hStyle=INVALI * @return Maximum items per page. * @error Invalid Handle other than INVALID_HANDLE. */ -native GetMaxPageItems(Handle:hStyle=INVALID_HANDLE); +native int GetMaxPageItems(Handle hStyle=INVALID_HANDLE); /** * Returns a MenuPanel's parent style. @@ -649,7 +946,7 @@ native GetMaxPageItems(Handle:hStyle=INVALID_HANDLE); * @return The MenuStyle Handle that created the panel. * @error Invalid Handle. */ -native Handle:GetPanelStyle(Handle:panel); +native Handle GetPanelStyle(Handle panel); /** * Sets the panel's title. @@ -657,10 +954,9 @@ native Handle:GetPanelStyle(Handle:panel); * @param panel A MenuPanel Handle. * @param text Text to set as the title. * @param onlyIfEmpty If true, the title will only be set if no title is set. - * @noreturn * @error Invalid Handle. */ -native Handle:SetPanelTitle(Handle:panel, const String:text[], bool:onlyIfEmpty=false); +native void SetPanelTitle(Handle panel, const char[] text, bool onlyIfEmpty=false); /** * Draws an item on a panel. If the item takes up a slot, the position @@ -674,7 +970,7 @@ native Handle:SetPanelTitle(Handle:panel, const String:text[], bool:onlyIfEmpty= * @return A slot position, or 0 if item was a rawline or could not be drawn. * @error Invalid Handle. */ -native DrawPanelItem(Handle:panel, const String:text[], style=ITEMDRAW_DEFAULT); +native int DrawPanelItem(Handle panel, const char[] text, style=ITEMDRAW_DEFAULT); /** * Draws a raw line of text on a panel, without any markup other than a newline. @@ -685,7 +981,7 @@ native DrawPanelItem(Handle:panel, const String:text[], style=ITEMDRAW_DEFAULT); * @return True on success, false if raw lines are not supported. * @error Invalid Handle. */ -native DrawPanelText(Handle:panel, const String:text[]); +native bool DrawPanelText(Handle panel, const char[] text); /** * Returns whether or not the given drawing flags are supported by @@ -696,7 +992,7 @@ native DrawPanelText(Handle:panel, const String:text[]); * @return True if item is drawable, false otherwise. * @error Invalid Handle. */ -native CanPanelDrawFlags(Handle:panel, style); +native bool CanPanelDrawFlags(Handle panel, style); /** * Sets the selectable key map of a panel. This is not supported by @@ -708,7 +1004,7 @@ native CanPanelDrawFlags(Handle:panel, style); * then key 0 (bit 9) is automatically set. * @return True if supported, false otherwise. */ -native bool:SetPanelKeys(Handle:panel, keys); +native bool SetPanelKeys(Handle panel, int keys); /** * Sends a panel to a client. Unlike full menus, the handler @@ -728,7 +1024,7 @@ native bool:SetPanelKeys(Handle:panel, keys); * @return True on success, false on failure. * @error Invalid Handle. */ -native bool:SendPanelToClient(Handle:panel, client, MenuHandler:handler, time); +native bool SendPanelToClient(Handle panel, int client, MenuHandler handler, int time); /** * @brief Returns the amount of text the menu can still hold. If this is @@ -742,7 +1038,7 @@ native bool:SendPanelToClient(Handle:panel, client, MenuHandler:handler, time); * or -1 if there is no known limit. * @error Invalid Handle. */ -native GetPanelTextRemaining(Handle:panel); +native int GetPanelTextRemaining(Handle panel); /** * @brief Returns the current key position. @@ -751,7 +1047,7 @@ native GetPanelTextRemaining(Handle:panel); * @return Current key position starting at 1. * @error Invalid Handle. */ -native GetPanelCurrentKey(Handle:panel); +native int GetPanelCurrentKey(Handle panel); /** * @brief Sets the next key position. This cannot be used @@ -763,7 +1059,7 @@ native GetPanelCurrentKey(Handle:panel); * @return True on success, false otherwise. * @error Invalid Handle. */ -native bool:SetPanelCurrentKey(Handle:panel, key); +native bool SetPanelCurrentKey(Handle panel, int key); /** * @brief Redraws menu text from inside a MenuAction_DisplayItem callback. @@ -771,7 +1067,7 @@ native bool:SetPanelCurrentKey(Handle:panel, key); * @param text Menu text to draw. * @return Item position; must be returned via the callback. */ -native RedrawMenuItem(const String:text[]); +native int RedrawMenuItem(const char[] text); /** * This function is provided for legacy code only. Some older plugins may use @@ -791,7 +1087,7 @@ native RedrawMenuItem(const String:text[]); * @return True on success, false on failure. * @error Invalid client index, or radio menus not supported. */ -native bool:InternalShowMenu(client, const String:str[], time, keys=-1, MenuHandler:handler=MenuHandler:-1); +native bool InternalShowMenu(int client, const char[] str, int time, int keys=-1, MenuHandler handler=INVALID_FUNCTION); /** * Retrieves voting information from MenuAction_VoteEnd. @@ -799,9 +1095,8 @@ native bool:InternalShowMenu(client, const String:str[], time, keys=-1, MenuHand * @param param2 Second parameter of MenuAction_VoteEnd. * @param winningVotes Number of votes received by the winning option. * @param totalVotes Number of total votes received. - * @noreturn */ -stock GetMenuVoteInfo(param2, &winningVotes, &totalVotes) +stock void GetMenuVoteInfo(param2, &winningVotes, &totalVotes) { winningVotes = param2 & 0xFFFF; totalVotes = param2 >> 16; @@ -815,7 +1110,7 @@ stock GetMenuVoteInfo(param2, &winningVotes, &totalVotes) * @return True if voting is allowed, false if voting is in progress * or the cooldown is active. */ -stock bool:IsNewVoteAllowed() +stock bool IsNewVoteAllowed() { if (IsVoteInProgress() || CheckVoteDelay() != 0) { diff --git a/env/include/profiler.inc b/env/include/profiler.inc index 68f1ca7..e1f5ea5 100644 --- a/env/include/profiler.inc +++ b/env/include/profiler.inc @@ -75,3 +75,26 @@ native StopProfiling(Handle:prof); * @error Invalid Handle. */ native Float:GetProfilerTime(Handle:prof); + +/** + * Mark the start of a profiling event. + * + * @param group Budget group. This can be "all" for a default, or a short + * description like "Timers" or "Events". + * @param name A name to attribute to this profiling event. + * @noreturn + */ +native EnterProfilingEvent(const String:group[], const String:name[]); + +/** + * Mark the end of the last profiling event. This must be called in the same + * stack frame as StartProfilingEvent(). Not doing so, or throwing errors, + * will make the resulting profile very wrong. + */ +native LeaveProfilingEvent(); + +/** + * Returns true if the global profiler is enabled; false otherwise. It is + * not necessary to call this before Enter/LeaveProfilingEvent. + */ +native bool:IsProfilingActive(); diff --git a/env/include/protobuf.inc b/env/include/protobuf.inc index 56f0bd9..0cd5dd0 100644 --- a/env/include/protobuf.inc +++ b/env/include/protobuf.inc @@ -1,5 +1,5 @@ /** - * vim: set ts=4 : + * vim: set ts=4 sw=4 tw=99 noet : * ============================================================================= * SourceMod (C)2013 AlliedModders LLC. All rights reserved. * ============================================================================= @@ -37,6 +37,232 @@ #define PB_FIELD_NOT_REPEATED -1 +methodmap Protobuf < Handle +{ + // Reads an int32, uint32, sint32, fixed32, sfixed32, or enum value from a protobuf message. + // + // @param field Field name. + // @param index Index into repeated field. + // @return Integer value read. + // @error Non-existent field, or incorrect field type. + public native int ReadInt(const char[] field, int index = PB_FIELD_NOT_REPEATED); + + // Reads a float or downcasted double from a protobuf message. + // + // @param field Field name. + // @param index Index into repeated field. + // @return Float value read. + // @error Non-existent field, or incorrect field type. + public native float ReadFloat(const char[] field, int index = PB_FIELD_NOT_REPEATED); + + // Reads a bool from a protobuf message. + // + // @param field Field name. + // @param index Index into repeated field. + // @return Boolean value read. + // @error Non-existent field, or incorrect field type. + public native bool ReadBool(const char[] field, int index = PB_FIELD_NOT_REPEATED); + + // Reads a string from a protobuf message. + // + // @param field Field name. + // @param buffer Destination string buffer. + // @param maxlength Maximum length of output string buffer. + // @param index Index into repeated field. + // @error Non-existent field, or incorrect field type. + public native void ReadString(const char[] field, char[] buffer, int maxlength, int index = PB_FIELD_NOT_REPEATED); + + // Reads an RGBA color value from a protobuf message. + // + // @param field Field name. + // @param buffer Destination color buffer. + // @param index Index into repeated field. + // @error Non-existent field, or incorrect field type. + public native void ReadColor(const char[] field, int buffer[4], int index = PB_FIELD_NOT_REPEATED); + + // Reads an XYZ angle value from a protobuf message. + // + // @param field Field name. + // @param buffer Destination angle buffer. + // @param index Index into repeated field. + // @error Non-existent field, or incorrect field type. + public native void ReadAngle(const char[] field, float buffer[3], int index = PB_FIELD_NOT_REPEATED); + + // Reads an XYZ vector value from a protobuf message. + // + // @param pb protobuf handle. + // @param field Field name. + // @param buffer Destination vector buffer. + // @param index Index into repeated field. + // @error Non-existent field, or incorrect field type. + public native void ReadVector(const char[] field, float buffer[3], int index = PB_FIELD_NOT_REPEATED); + + // Reads an XY vector value from a protobuf message. + // + // @param field Field name. + // @param buffer Destination vector buffer. + // @param index Index into repeated field. + // @error Non-existent field, or incorrect field type. + public native void ReadVector2D(const char[] field, float buffer[2], int index = PB_FIELD_NOT_REPEATED); + + // Gets the number of elements in a repeated field of a protobuf message. + // + // @param field Field name. + // @return Number of elements in the field. + // @error Non-existent field, or incorrect field type. + public native int GetRepeatedFieldCount(const char[] field); + + // Sets an int32, uint32, sint32, fixed32, sfixed32, or enum value on a protobuf message. + // + // @param field Field name. + // @param value Integer value to set. + // @param index Index into repeated field. + // @error Non-existent field, or incorrect field type. + public native int SetInt(const char[] field, int value, int index = PB_FIELD_NOT_REPEATED); + + // Sets a float or double on a protobuf message. + // + // @param field Field name. + // @param value Float value to set. + // @param index Index into repeated field. + // @error Non-existent field, or incorrect field type. + public native void SetFloat(const char[] field, float value, int index = PB_FIELD_NOT_REPEATED); + + // Sets a bool on a protobuf message. + // + // @param field Field name. + // @param value Boolean value to set. + // @param index Index into repeated field. + // @error Non-existent field, or incorrect field type. + public native void SetBool(const char[] field, bool value, int index = PB_FIELD_NOT_REPEATED); + + // Sets a string on a protobuf message. + // + // @param field Field name. + // @param value String value to set. + // @param index Index into repeated field. + // @error Non-existent field, or incorrect field type. + public native void SetString(const char[] field, const char[] value, int index = PB_FIELD_NOT_REPEATED); + + // Sets an RGBA color on a protobuf message. + // + // @param field Field name. + // @param color Color value to set. + // @param index Index into repeated field. + // @error Non-existent field, or incorrect field type. + public native void SetColor(const char[] field, const int color[4], int index = PB_FIELD_NOT_REPEATED); + + // Sets an XYZ angle on a protobuf message. + // + // @param field Field name. + // @param angle Angle value to set. + // @param index Index into repeated field. + // @error Non-existent field, or incorrect field type. + public native void SetAngle(const char[] field, const float angle[3], int index = PB_FIELD_NOT_REPEATED); + + // Sets an XYZ vector on a protobuf message. + // + // @param field Field name. + // @param vec Vector value to set. + // @param index Index into repeated field. + // @error Non-existent field, or incorrect field type. + public native void SetVector(const char[] field, const float vec[3], int index = PB_FIELD_NOT_REPEATED); + + // Sets an XY vector on a protobuf message. + // + // @param field Field name. + // @param vec Vector value to set. + // @param index Index into repeated field. + // @error Non-existent field, or incorrect field type. + public native void SetVector2D(const char[] field, const float vec[2], int index = PB_FIELD_NOT_REPEATED); + + // Add an int32, uint32, sint32, fixed32, sfixed32, or enum value to a protobuf message repeated field. + // + // @param field Field name. + // @param value Integer value to add. + // @error Non-existent field, or incorrect field type. + public native void AddInt(const char[] field, int value); + + // Add a float or double to a protobuf message repeated field. + // + // @param field Field name. + // @param value Float value to add. + // @error Non-existent field, or incorrect field type. + public native void AddFloat(const char[] field, float value); + + // Add a bool to a protobuf message repeated field. + // + // @param field Field name. + // @param value Boolean value to add. + // @error Non-existent field, or incorrect field type. + public native void AddBool(const char[] field, bool value); + + // Add a string to a protobuf message repeated field. + // + // @param field Field name. + // @param value String value to add. + // @error Non-existent field, or incorrect field type. + public native void AddString(const char[] field, const char[] value); + + // Add an RGBA color to a protobuf message repeated field. + // + // @param field Field name. + // @param color Color value to add. + // @error Non-existent field, or incorrect field type. + public native void AddColor(const char[] field, const int color[4]); + + // Add an XYZ angle to a protobuf message repeated field. + // + // @param field Field name. + // @param angle Angle value to add. + // @error Non-existent field, or incorrect field type. + public native void AddAngle(const char[] field, const float angle[3]); + + // Add an XYZ vector to a protobuf message repeated field. + // + // @param field Field name. + // @param vec Vector value to add. + // @error Non-existent field, or incorrect field type. + public native void AddVector(const char[] field, const float vec[3]); + + // Add an XY vector to a protobuf message repeated field. + // + // @param field Field name. + // @param vec Vector value to add. + // @error Non-existent field, or incorrect field type. + public native void AddVector2D(const char[] field, const float vec[2]); + + // Removes a value by index from a protobuf message repeated field. + // + // @param field Field name. + // @param index Index into repeated field. + // @error Non-existent field, or incorrect field type. + public native void RemoveRepeatedFieldValue(const char[] field, int index); + + // Retrieve a handle to an embedded protobuf message in a protobuf message. + // + // @param field Field name. + // @return Protobuf handle to embedded message. + // @error Non-existent field, or incorrect field type. + public native Protobuf ReadMessage(const char[] field); + + // Retrieve a handle to an embedded protobuf message in a protobuf message + // repeated field. + // + // @param field Field name. + // @param index Index in the repeated field. + // @return Protobuf handle to embedded message. + // @error Non-existent field, or incorrect field type. + public native Protobuf ReadRepeatedMessage(const char[] field, int index); + + // Adds an embedded protobuf message to a protobuf message repeated field. + // + // @param field Field name. + // @return Protobuf handle to added, embedded message. + // @error Non-existent field, or incorrect field type. + public native Protobuf AddMessage(const char[] field); +}; + /** * Reads an int32, uint32, sint32, fixed32, sfixed32, or enum value from a protobuf message. * @@ -46,7 +272,7 @@ * @return Integer value read. * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. */ -native PbReadInt(Handle:pb, const String:field[], index=PB_FIELD_NOT_REPEATED); +native int PbReadInt(Handle pb, const char[] field, int index = PB_FIELD_NOT_REPEATED); /** * Reads a float or downcasted double from a protobuf message. @@ -57,7 +283,7 @@ native PbReadInt(Handle:pb, const String:field[], index=PB_FIELD_NOT_REPEATED); * @return Float value read. * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. */ -native Float:PbReadFloat(Handle:pb, const String:field[], index=PB_FIELD_NOT_REPEATED); +native float PbReadFloat(Handle pb, const char[] field, int index = PB_FIELD_NOT_REPEATED); /** * Reads a bool from a protobuf message. @@ -68,7 +294,7 @@ native Float:PbReadFloat(Handle:pb, const String:field[], index=PB_FIELD_NOT_REP * @return Boolean value read. * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. */ -native bool:PbReadBool(Handle:pb, const String:field[], index=PB_FIELD_NOT_REPEATED); +native bool PbReadBool(Handle pb, const char[] field, int index = PB_FIELD_NOT_REPEATED); /** * Reads a string from a protobuf message. @@ -78,10 +304,9 @@ native bool:PbReadBool(Handle:pb, const String:field[], index=PB_FIELD_NOT_REPEA * @param buffer Destination string buffer. * @param maxlength Maximum length of output string buffer. * @param index Index into repeated field. - * @noreturn * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. */ -native PbReadString(Handle:pb, const String:field[], String:buffer[], maxlength, index=PB_FIELD_NOT_REPEATED); +native void PbReadString(Handle pb, const char[] field, String:buffer[], maxlength, int index = PB_FIELD_NOT_REPEATED); /** * Reads an RGBA color value from a protobuf message. @@ -90,10 +315,9 @@ native PbReadString(Handle:pb, const String:field[], String:buffer[], maxlength, * @param field Field name. * @param buffer Destination color buffer. * @param index Index into repeated field. - * @noreturn * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. */ -native PbReadColor(Handle:pb, const String:field[], buffer[4], index=PB_FIELD_NOT_REPEATED); +native void PbReadColor(Handle pb, const char[] field, buffer[4], int index = PB_FIELD_NOT_REPEATED); /** * Reads an XYZ angle value from a protobuf message. @@ -102,10 +326,9 @@ native PbReadColor(Handle:pb, const String:field[], buffer[4], index=PB_FIELD_NO * @param field Field name. * @param buffer Destination angle buffer. * @param index Index into repeated field. - * @noreturn * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. */ -native PbReadAngle(Handle:pb, const String:field[], Float:buffer[3], index=PB_FIELD_NOT_REPEATED); +native void PbReadAngle(Handle pb, const char[] field, float buffer[3], int index = PB_FIELD_NOT_REPEATED); /** * Reads an XYZ vector value from a protobuf message. @@ -114,10 +337,9 @@ native PbReadAngle(Handle:pb, const String:field[], Float:buffer[3], index=PB_FI * @param field Field name. * @param buffer Destination vector buffer. * @param index Index into repeated field. - * @noreturn * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. */ -native PbReadVector(Handle:pb, const String:field[], Float:buffer[3], index=PB_FIELD_NOT_REPEATED); +native void PbReadVector(Handle pb, const char[] field, float buffer[3], int index = PB_FIELD_NOT_REPEATED); /** * Reads an XY vector value from a protobuf message. @@ -126,10 +348,9 @@ native PbReadVector(Handle:pb, const String:field[], Float:buffer[3], index=PB_F * @param field Field name. * @param buffer Destination vector buffer. * @param index Index into repeated field. - * @noreturn * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. */ -native PbReadVector2D(Handle:pb, const String:field[], Float:buffer[2], index=PB_FIELD_NOT_REPEATED); +native void PbReadVector2D(Handle pb, const char[] field, float buffer[2], int index = PB_FIELD_NOT_REPEATED); /** * Gets the number of elements in a repeated field of a protobuf message. @@ -139,7 +360,7 @@ native PbReadVector2D(Handle:pb, const String:field[], Float:buffer[2], index=PB * @return Number of elements in the field. * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. */ -native PbGetRepeatedFieldCount(Handle:pb, const String:field[]); +native int PbGetRepeatedFieldCount(Handle pb, const char[] field); /** * Sets an int32, uint32, sint32, fixed32, sfixed32, or enum value on a protobuf message. @@ -148,10 +369,9 @@ native PbGetRepeatedFieldCount(Handle:pb, const String:field[]); * @param field Field name. * @param value Integer value to set. * @param index Index into repeated field. - * @noreturn * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. */ -native PbSetInt(Handle:pb, const String:field[], value, index=PB_FIELD_NOT_REPEATED); +native void PbSetInt(Handle pb, const char[] field, int value, int index = PB_FIELD_NOT_REPEATED); /** * Sets a float or double on a protobuf message. @@ -160,10 +380,9 @@ native PbSetInt(Handle:pb, const String:field[], value, index=PB_FIELD_NOT_REPEA * @param field Field name. * @param value Float value to set. * @param index Index into repeated field. - * @noreturn * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. */ -native PbSetFloat(Handle:pb, const String:field[], Float:value, index=PB_FIELD_NOT_REPEATED); +native void PbSetFloat(Handle pb, const char[] field, float value, int index = PB_FIELD_NOT_REPEATED); /** * Sets a bool on a protobuf message. @@ -172,10 +391,9 @@ native PbSetFloat(Handle:pb, const String:field[], Float:value, index=PB_FIELD_N * @param field Field name. * @param value Boolean value to set. * @param index Index into repeated field. - * @noreturn * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. */ -native PbSetBool(Handle:pb, const String:field[], bool:value, index=PB_FIELD_NOT_REPEATED); +native void PbSetBool(Handle pb, const char[] field, bool value, int index = PB_FIELD_NOT_REPEATED); /** * Sets a string on a protobuf message. @@ -184,10 +402,9 @@ native PbSetBool(Handle:pb, const String:field[], bool:value, index=PB_FIELD_NOT * @param field Field name. * @param value String value to set. * @param index Index into repeated field. - * @noreturn * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. */ -native PbSetString(Handle:pb, const String:field[], const String:value[], index=PB_FIELD_NOT_REPEATED); +native void PbSetString(Handle pb, const char[] field, const char[] value, int index = PB_FIELD_NOT_REPEATED); /** * Sets an RGBA color on a protobuf message. @@ -196,10 +413,9 @@ native PbSetString(Handle:pb, const String:field[], const String:value[], index= * @param field Field name. * @param color Color value to set. * @param index Index into repeated field. - * @noreturn * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. */ -native PbSetColor(Handle:pb, const String:field[], const color[4], index=PB_FIELD_NOT_REPEATED); +native void PbSetColor(Handle pb, const char[] field, const int color[4], int index = PB_FIELD_NOT_REPEATED); /** * Sets an XYZ angle on a protobuf message. @@ -208,10 +424,9 @@ native PbSetColor(Handle:pb, const String:field[], const color[4], index=PB_FIEL * @param field Field name. * @param angle Angle value to set. * @param index Index into repeated field. - * @noreturn * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. */ -native PbSetAngle(Handle:pb, const String:field[], const Float:angle[3], index=PB_FIELD_NOT_REPEATED); +native void PbSetAngle(Handle pb, const char[] field, const float angle[3], int index = PB_FIELD_NOT_REPEATED); /** * Sets an XYZ vector on a protobuf message. @@ -220,10 +435,9 @@ native PbSetAngle(Handle:pb, const String:field[], const Float:angle[3], index=P * @param field Field name. * @param vec Vector value to set. * @param index Index into repeated field. - * @noreturn * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. */ -native PbSetVector(Handle:pb, const String:field[], const Float:vec[3], index=PB_FIELD_NOT_REPEATED); +native void PbSetVector(Handle pb, const char[] field, const float vec[3], int index = PB_FIELD_NOT_REPEATED); /** * Sets an XY vector on a protobuf message. @@ -232,10 +446,9 @@ native PbSetVector(Handle:pb, const String:field[], const Float:vec[3], index=PB * @param field Field name. * @param vec Vector value to set. * @param index Index into repeated field. - * @noreturn * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. */ -native PbSetVector2D(Handle:pb, const String:field[], const Float:vec[2], index=PB_FIELD_NOT_REPEATED); +native void PbSetVector2D(Handle pb, const char[] field, const float vec[2], int index = PB_FIELD_NOT_REPEATED); /** * Add an int32, uint32, sint32, fixed32, sfixed32, or enum value to a protobuf message repeated field. @@ -243,10 +456,9 @@ native PbSetVector2D(Handle:pb, const String:field[], const Float:vec[2], index= * @param pb protobuf handle. * @param field Field name. * @param value Integer value to add. - * @noreturn * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. */ -native PbAddInt(Handle:pb, const String:field[], value); +native void PbAddInt(Handle pb, const char[] field, int value); /** * Add a float or double to a protobuf message repeated field. @@ -254,10 +466,9 @@ native PbAddInt(Handle:pb, const String:field[], value); * @param pb protobuf handle. * @param field Field name. * @param value Float value to add. - * @noreturn * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. */ -native PbAddFloat(Handle:pb, const String:field[], Float:value); +native void PbAddFloat(Handle pb, const char[] field, float value); /** * Add a bool to a protobuf message repeated field. @@ -265,10 +476,9 @@ native PbAddFloat(Handle:pb, const String:field[], Float:value); * @param pb protobuf handle. * @param field Field name. * @param value Boolean value to add. - * @noreturn * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. */ -native PbAddBool(Handle:pb, const String:field[], bool:value); +native void PbAddBool(Handle pb, const char[] field, bool value); /** * Add a string to a protobuf message repeated field. @@ -276,10 +486,9 @@ native PbAddBool(Handle:pb, const String:field[], bool:value); * @param pb protobuf handle. * @param field Field name. * @param value String value to add. - * @noreturn * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. */ -native PbAddString(Handle:pb, const String:field[], const String:value[]); +native void PbAddString(Handle pb, const char[] field, const char[] value); /** * Add an RGBA color to a protobuf message repeated field. @@ -287,10 +496,9 @@ native PbAddString(Handle:pb, const String:field[], const String:value[]); * @param pb protobuf handle. * @param field Field name. * @param color Color value to add. - * @noreturn * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. */ -native PbAddColor(Handle:pb, const String:field[], const color[4]); +native void PbAddColor(Handle pb, const char[] field, const int color[4]); /** * Add an XYZ angle to a protobuf message repeated field. @@ -298,10 +506,9 @@ native PbAddColor(Handle:pb, const String:field[], const color[4]); * @param pb protobuf handle. * @param field Field name. * @param angle Angle value to add. - * @noreturn * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. */ -native PbAddAngle(Handle:pb, const String:field[], const Float:angle[3]); +native void PbAddAngle(Handle pb, const char[] field, const float angle[3]); /** * Add an XYZ vector to a protobuf message repeated field. @@ -309,10 +516,9 @@ native PbAddAngle(Handle:pb, const String:field[], const Float:angle[3]); * @param pb protobuf handle. * @param field Field name. * @param vec Vector value to add. - * @noreturn * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. */ -native PbAddVector(Handle:pb, const String:field[], const Float:vec[3]); +native void PbAddVector(Handle pb, const char[] field, const float vec[3]); /** * Add an XY vector to a protobuf message repeated field. @@ -320,10 +526,9 @@ native PbAddVector(Handle:pb, const String:field[], const Float:vec[3]); * @param pb protobuf handle. * @param field Field name. * @param vec Vector value to add. - * @noreturn * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. */ -native PbAddVector2D(Handle:pb, const String:field[], const Float:vec[2]); +native void PbAddVector2D(Handle pb, const char[] field, const float vec[2]); /** * Removes a value by index from a protobuf message repeated field. @@ -331,10 +536,9 @@ native PbAddVector2D(Handle:pb, const String:field[], const Float:vec[2]); * @param pb protobuf handle. * @param field Field name. * @param index Index into repeated field. - * @noreturn * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. */ -native PbRemoveRepeatedFieldValue(Handle:pb, const String:field[], index); +native void PbRemoveRepeatedFieldValue(Handle pb, const char[] field, int index); /** * Retrieve a handle to an embedded protobuf message in a protobuf message. @@ -344,7 +548,7 @@ native PbRemoveRepeatedFieldValue(Handle:pb, const String:field[], index); * @return protobuf handle to embedded message. * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. */ -native Handle:PbReadMessage(Handle:pb, const String:field[]); +native Handle PbReadMessage(Handle pb, const char[] field); /** * Retrieve a handle to an embedded protobuf message in a protobuf message repeated field. @@ -355,7 +559,7 @@ native Handle:PbReadMessage(Handle:pb, const String:field[]); * @return protobuf handle to embedded message. * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. */ -native Handle:PbReadRepeatedMessage(Handle:pb, const String:field[], index); +native Handle PbReadRepeatedMessage(Handle pb, const char[] field, int index); /** * Adds an embedded protobuf message to a protobuf message repeated field. @@ -365,4 +569,4 @@ native Handle:PbReadRepeatedMessage(Handle:pb, const String:field[], index); * @return protobuf handle to added, embedded message. * @error Invalid or incorrect Handle, non-existent field, or incorrect field type. */ -native Handle:PbAddMessage(Handle:pb, const String:field[]); +native Handle PbAddMessage(Handle pb, const char[] field); diff --git a/env/include/regex.inc b/env/include/regex.inc index 555c4a3..9992c80 100644 --- a/env/include/regex.inc +++ b/env/include/regex.inc @@ -104,7 +104,7 @@ enum RegexError * @param errcode Regex type error code encountered, if applicable. * @return Valid regex handle on success, INVALID_HANDLE on failure. */ -native Handle:CompileRegex(const String:pattern[], flags = 0, String:error[]="", maxLen = 0, &RegexError:errcode = REGEX_ERROR_NONE); +native Regex CompileRegex(const char[] pattern, int flags = 0, char[] error="", int maxLen = 0, RegexError &errcode = REGEX_ERROR_NONE); /** * Matches a string against a pre-compiled regular expression pattern. @@ -117,7 +117,7 @@ native Handle:CompileRegex(const String:pattern[], flags = 0, String:error[]="", * @note Use the regex handle passed to this function to extract * matches with GetRegexSubString(). */ -native MatchRegex(Handle:regex, const String:str[], &RegexError:ret = REGEX_ERROR_NONE); +native int MatchRegex(Handle regex, const char[] str, RegexError &ret = REGEX_ERROR_NONE); /** * Returns a matched substring from a regex handle. @@ -130,7 +130,14 @@ native MatchRegex(Handle:regex, const String:str[], &RegexError:ret = REGEX_ERRO * @param maxlen The maximum string length of the buffer. * @return True if a substring was found, False on fail/error */ -native bool:GetRegexSubString(Handle:regex, str_id, String:buffer[], maxlen); +native bool GetRegexSubString(Handle regex, int str_id, char[] buffer, int maxlen); + +methodmap Regex < Handle +{ + public Regex() = CompileRegex; + public Match() = MatchRegex; + public GetSubString() = GetRegexSubString; +}; /** * Matches a string against a regular expression pattern. @@ -146,19 +153,15 @@ native bool:GetRegexSubString(Handle:regex, str_id, String:buffer[], maxlen); * @param maxLen Maximum length of the error buffer. * @return Number of substrings found or -1 on failure. */ -stock SimpleRegexMatch(const String:str[], const String:pattern[], flags = 0, String:error[]="", maxLen = 0) +stock int SimpleRegexMatch(const char[] str, const char[] pattern, int flags = 0, char[] error="", int maxLen = 0) { - new Handle:regex = CompileRegex(pattern, flags, error, maxLen); - - if (regex == INVALID_HANDLE) - { + Regex regex = new Regex(pattern, flags, error, maxLen); + if (!regex) return -1; - } - - new substrings = MatchRegex(regex, str); - - CloseHandle(regex); + int substrings = regex.Match(str); + delete regex; + return substrings; } diff --git a/env/include/sdkhooks-2.2.inc b/env/include/sdkhooks-2.2.inc deleted file mode 100644 index d09c17f..0000000 --- a/env/include/sdkhooks-2.2.inc +++ /dev/null @@ -1,345 +0,0 @@ -#if defined _sdkhooks_included - #endinput -#endif -#define _sdkhooks_included - -// this is obviously _not_ a robust check, but it will solve most conflict and is clean -#if !defined DMG_GENERIC -#define DMG_GENERIC 0 // generic damage was done -#define DMG_CRUSH (1 << 0) // crushed by falling or moving object. - // NOTE: It's assumed crush damage is occurring as a result of physics collision, so no extra physics force is generated by crush damage. - // DON'T use DMG_CRUSH when damaging entities unless it's the result of a physics collision. You probably want DMG_CLUB instead. -#define DMG_BULLET (1 << 1) // shot -#define DMG_SLASH (1 << 2) // cut, clawed, stabbed -#define DMG_BURN (1 << 3) // heat burned -#define DMG_VEHICLE (1 << 4) // hit by a vehicle -#define DMG_FALL (1 << 5) // fell too far -#define DMG_BLAST (1 << 6) // explosive blast damage -#define DMG_CLUB (1 << 7) // crowbar, punch, headbutt -#define DMG_SHOCK (1 << 8) // electric shock -#define DMG_SONIC (1 << 9) // sound pulse shockwave -#define DMG_ENERGYBEAM (1 << 10) // laser or other high energy beam -#define DMG_PREVENT_PHYSICS_FORCE (1 << 11) // Prevent a physics force -#define DMG_NEVERGIB (1 << 12) // with this bit OR'd in, no damage type will be able to gib victims upon death -#define DMG_ALWAYSGIB (1 << 13) // with this bit OR'd in, any damage type can be made to gib victims upon death. -#define DMG_DROWN (1 << 14) // Drowning -#define DMG_PARALYZE (1 << 15) // slows affected creature down -#define DMG_NERVEGAS (1 << 16) // nerve toxins, very bad -#define DMG_POISON (1 << 17) // blood poisoning - heals over time like drowning damage -#define DMG_RADIATION (1 << 18) // radiation exposure -#define DMG_DROWNRECOVER (1 << 19) // drowning recovery -#define DMG_ACID (1 << 20) // toxic chemicals or acid burns -#define DMG_SLOWBURN (1 << 21) // in an oven -#define DMG_REMOVENORAGDOLL (1 << 22) // with this bit OR'd in, no ragdoll will be created, and the target will be quietly removed. - // use this to kill an entity that you've already got a server-side ragdoll for -#define DMG_PHYSGUN (1 << 23) // Hit by manipulator. Usually doesn't do any damage. -#define DMG_PLASMA (1 << 24) // Shot by Cremator -#define DMG_AIRBOAT (1 << 25) // Hit by the airboat's gun -#define DMG_DISSOLVE (1 << 26) // Dissolving! -#define DMG_BLAST_SURFACE (1 << 27) // A blast on the surface of water that cannot harm things underwater -#define DMG_DIRECT (1 << 28) -#define DMG_BUCKSHOT (1 << 29) // not quite a bullet. Little, rounder, different. -#endif - -#if !defined DMG_CRIT - // TF2 crits and minicrits - #define DMG_CRIT DMG_ACID -#endif - -enum SDKHookType -{ - SDKHook_EndTouch, - SDKHook_FireBulletsPost, - SDKHook_OnTakeDamage, - SDKHook_OnTakeDamagePost, - SDKHook_PreThink, - SDKHook_PostThink, - SDKHook_SetTransmit, - SDKHook_Spawn, - SDKHook_StartTouch, - SDKHook_Think, - SDKHook_Touch, - SDKHook_TraceAttack, - SDKHook_TraceAttackPost, - SDKHook_WeaponCanSwitchTo, - SDKHook_WeaponCanUse, - SDKHook_WeaponDrop, - SDKHook_WeaponEquip, - SDKHook_WeaponSwitch, - SDKHook_ShouldCollide, - SDKHook_PreThinkPost, - SDKHook_PostThinkPost, - SDKHook_ThinkPost, - SDKHook_EndTouchPost, - SDKHook_GroundEntChangedPost, - SDKHook_SpawnPost, - SDKHook_StartTouchPost, - SDKHook_TouchPost, - SDKHook_VPhysicsUpdate, - SDKHook_VPhysicsUpdatePost, - SDKHook_WeaponCanSwitchToPost, - SDKHook_WeaponCanUsePost, - SDKHook_WeaponDropPost, - SDKHook_WeaponEquipPost, - SDKHook_WeaponSwitchPost, - SDKHook_Use, - SDKHook_UsePost -}; - -/* - Alphabetized for easy readability - - SDKHook_EndTouch, - SDKHook_EndTouchPost, - - SDKHook_FireBulletsPost, - - SDKHook_GroundEntChangedPost, - - SDKHook_OnTakeDamage, - SDKHook_OnTakeDamagePost, - - SDKHook_PreThink, - SDKHook_PreThinkPost, - - SDKHook_PostThink, - SDKHook_PostThinkPost, - - SDKHook_SetTransmit, - - SDKHook_ShouldCollide, - - SDKHook_Spawn, - SDKHook_SpawnPost, - - SDKHook_StartTouch, - SDKHook_StartTouchPost, - - SDKHook_Think, - SDKHook_ThinkPost, - - SDKHook_Touch, - SDKHook_TouchPost, - - SDKHook_TraceAttack, - SDKHook_TraceAttackPost, - - SDKHook_Use, - SDKHook_UsePost, - - SDKHook_VPhysicsUpdate, - SDKHook_VPhysicsUpdatePost, - - SDKHook_WeaponCanSwitchTo, - SDKHook_WeaponCanSwitchToPost, - - SDKHook_WeaponCanUse, - SDKHook_WeaponCanUsePost, - - SDKHook_WeaponDrop, - SDKHook_WeaponDropPost, - - SDKHook_WeaponEquip, - SDKHook_WeaponEquipPost, - - SDKHook_WeaponSwitch, - SDKHook_WeaponSwitchPost -*/ - -enum UseType -{ - Use_Off, - Use_On, - Use_Set, - Use_Toggle -}; - -funcenum SDKHookCB -{ - // PreThink/Post - // PostThink/Post - public(client), - - // GroundEntChanged - // Spawn/Post - // Think/Post - // VPhysicsUpdate/Post - public(entity), - - // EndTouch - // StartTouch - // Touch - Action:public(entity, other), - - // EndTouchPost - // StartTouchPost - // TouchPost - public(entity, other), - - // SetTransmit - Action:public(entity, client), - - // WeaponCanSwitchTo - // WeaponCanUse - // WeaponDrop - // WeaponEquip - // WeaponSwitch - Action:public(client, weapon), - - // WeaponCanSwitchToPost - // WeaponCanUsePost - // WeaponDropPost - // WeaponEquipPost - // WeaponSwitchPost - public(client, weapon), - - // OnTakeDamage - // Note: Force application is dependent on game and damage type(s) - Action:public(victim, &attacker, &inflictor, &Float:damage, &damagetype), - Action:public(victim, &attacker, &inflictor, &Float:damage, &damagetype, &weapon, Float:damageForce[3], Float:damagePosition[3]), - - // OnTakeDamagePost - public(victim, attacker, inflictor, Float:damage, damagetype), - public(victim, attacker, inflictor, Float:damage, damagetype, weapon, const Float:damageForce[3], const Float:damagePosition[3]), - - // FireBulletsPost - public(client, shots, const String:weaponname[]), - - // TraceAttack - Action:public(victim, &attacker, &inflictor, &Float:damage, &damagetype, &ammotype, hitbox, hitgroup), - - // TraceAttackPost - public(victim, attacker, inflictor, Float:damage, damagetype, ammotype, hitbox, hitgroup), - - // ShouldCollide - bool:public(entity, collisiongroup, contentsmask, bool:originalResult), - - // Use - Action:public(entity, activator, caller, UseType:type, Float:value), - - // UsePost - public(entity, activator, caller, UseType:type, Float:value) -}; - - -/** - * @brief When an entity is created - * - * @param entity Entity index - * @param classname Class name - * @noreturn - */ -forward OnEntityCreated(entity, const String:classname[]); - -/** - * @brief When an entity is destroyed - * - * @param entity Entity index - * @noreturn - */ -forward OnEntityDestroyed(entity); - -/** - * @brief When the game description is retrieved - * - * @param gameDesc Game description - * @noreturn - */ -forward Action:OnGetGameDescription(String:gameDesc[64]); - -/** - * @brief When the level is initialized - * - * @param mapName Name of the map - * @param mapEntities Entities of the map - * @noreturn - */ -forward Action:OnLevelInit(const String:mapName[], String:mapEntities[2097152]); - -/** - * @brief Hooks an entity - * - * @param entity Entity index - * @param type Type of function to hook - * @param callback Function to call when hook is called - * @noreturn - */ -native SDKHook(entity, SDKHookType:type, SDKHookCB:callback); - -/** - * @brief Hooks an entity - * - * @param entity Entity index - * @param type Type of function to hook - * @param callback Function to call when hook is called - * @return bool Hook Successful - */ -native bool:SDKHookEx(entity, SDKHookType:type, SDKHookCB:callback); - -/** - * @brief Unhooks an entity - * - * @param entity Entity index - * @param type Type of function to unhook - * @param callback Callback function to unhook - * @noreturn - */ -native SDKUnhook(entity, SDKHookType:type, SDKHookCB:callback); - -/** - * @brief Applies damage to an entity - * - * @note Force application is dependent on game and damage type(s) - * - * @param entity Entity index taking damage - * @param inflictor Inflictor entity index - * @param attacker Attacker entity index - * @param damage Amount of damage - * @param damageType Bitfield of damage types - * @param weapon Weapon index (orangebox and later) or -1 for unspecified - * @param damageForce Velocity of damage force - * @param damagePosition Origin of damage - * @noreturn - */ -native SDKHooks_TakeDamage(entity, inflictor, attacker, Float:damage, damageType=DMG_GENERIC, weapon=-1, const Float:damageForce[3]=NULL_VECTOR, const Float:damagePosition[3]=NULL_VECTOR); - -/** - * @brief Forces a client to drop the specified weapon - * - * @param client Client index. - * @param weapon Weapon entity index. - * @param vecTarget Location to toss weapon to, or NULL_VECTOR for default. - * @param vecVelocity Velocity at which to toss weapon, or NULL_VECTOR for default. - * @noreturn - * @error Invalid client or weapon entity, weapon not owned by client. - */ -native SDKHooks_DropWeapon(client, weapon, const Float:vecTarget[3]=NULL_VECTOR, const Float:vecVelocity[3]=NULL_VECTOR); - -/** Do Not Edit Below This Line **/ - -public Extension:__ext_sdkhooks = -{ - name = "sdkhooks", - file = "sdkhooks.ext", -#if defined AUTOLOAD_EXTENSIONS - autoload = 1, -#else - autoload = 0, -#endif -#if defined REQUIRE_EXTENSIONS - required = 1, -#else - required = 0, -#endif -}; - -#if !defined REQUIRE_EXTENSIONS -public __ext_sdkhooks_SetNTVOptional() -{ - MarkNativeAsOptional("SDKHook"); - MarkNativeAsOptional("SDKHookEx"); - MarkNativeAsOptional("SDKUnhook"); - MarkNativeAsOptional("SDKHooks_TakeDamage"); - MarkNativeAsOptional("SDKHooks_DropWeapon"); -} -#endif diff --git a/env/include/sdkhooks.inc b/env/include/sdkhooks.inc index 2b25504..44a448a 100644 --- a/env/include/sdkhooks.inc +++ b/env/include/sdkhooks.inc @@ -117,10 +117,17 @@ enum SDKHookType SDKHook_Reload, SDKHook_ReloadPost, SDKHook_GetMaxHealth, /**< ep2v and later */ + SDKHook_Blocked, + SDKHook_BlockedPost, + SDKHook_OnTakeDamageAlive, + SDKHook_OnTakeDamageAlivePost, }; /* Alphabetized for easy readability + + SDKHook_Blocked, + SDKHook_BlockedPost, SDKHook_EndTouch, SDKHook_EndTouchPost, @@ -134,6 +141,9 @@ enum SDKHookType SDKHook_OnTakeDamage, SDKHook_OnTakeDamagePost, + SDKHook_OnTakeDamageAlive, + SDKHook_OnTakeDamageAlivePost, + SDKHook_PreThink, SDKHook_PreThinkPost, @@ -192,90 +202,95 @@ enum UseType Use_Toggle }; -funcenum SDKHookCB +typeset SDKHookCB { // PreThink/Post // PostThink/Post - public(client), + function void (int client); // Spawn - Action:public(entity), + function Action (int entity); // GroundEntChanged // SpawnPost // Think/Post // VPhysicsUpdate/Post - public(entity), + function void (int entity); // EndTouch // StartTouch // Touch - Action:public(entity, other), + // Blocked + function Action (int entity, int other); // EndTouchPost // StartTouchPost // TouchPost - public(entity, other), + function void (int entity, int other); // SetTransmit - Action:public(entity, client), + function Action (int entity, int client); // WeaponCanSwitchTo // WeaponCanUse // WeaponDrop // WeaponEquip // WeaponSwitch - Action:public(client, weapon), + function Action (int client, int weapon); // WeaponCanSwitchToPost // WeaponCanUsePost // WeaponDropPost // WeaponEquipPost // WeaponSwitchPost - public(client, weapon), + function void (int client, int weapon); // GetMaxHealth (ep2v and later) - Action:public(entity, &maxhealth), + function Action (int entity, int &maxhealth); // OnTakeDamage + // OnTakeDamageAlive // Note: The weapon parameter is not used by all games and damage sources. // Note: Force application is dependent on game and damage type(s) // SDKHooks 1.0+ - Action:public(victim, &attacker, &inflictor, &Float:damage, &damagetype), + function Action (int victim, int &attacker, int &inflictor, float &damage, int &damagetype); // SDKHooks 2.0+ - Action:public(victim, &attacker, &inflictor, &Float:damage, &damagetype, &weapon, Float:damageForce[3], Float:damagePosition[3]), + function Action (int victim, int &attacker, int &inflictor, float &damage, int &damagetype, int &weapon, float damageForce[3], float damagePosition[3]); // SDKHooks 2.1+ (can check for support at runtime using GetFeatureStatus on SDKHook_DmgCustomInOTD capability. // DON'T attempt to access 'damagecustom' var if feature status != available - Action:public(victim, &attacker, &inflictor, &Float:damage, &damagetype, &weapon, - Float:damageForce[3], Float:damagePosition[3], damagecustom), + function Action (int victim, int &attacker, int &inflictor, float &damage, int &damagetype, int &weapon, + float damageForce[3], float damagePosition[3], int damagecustom); // OnTakeDamagePost - public(victim, attacker, inflictor, Float:damage, damagetype), - public(victim, attacker, inflictor, Float:damage, damagetype, weapon, const Float:damageForce[3], const Float:damagePosition[3]), + // OnTakeDamageAlivePost + function void (int victim, int attacker, int inflictor, float damage, int damagetype); + function void (int victim, int attacker, int inflictor, float damage, int damagetype, int weapon, const float damageForce[3], const float damagePosition[3]); + function void (int victim, int attacker, int inflictor, float damage, int damagetype, int weapon, + const float damageForce[3], const float damagePosition[3], int damagecustom); // FireBulletsPost - public(client, shots, const String:weaponname[]), + function void (int client, int shots, const char[] weaponname); // TraceAttack - Action:public(victim, &attacker, &inflictor, &Float:damage, &damagetype, &ammotype, hitbox, hitgroup), + function Action (int victim, int &attacker, int &inflictor, float &damage, int &damagetype, int &ammotype, int hitbox, int hitgroup); // TraceAttackPost - public(victim, attacker, inflictor, Float:damage, damagetype, ammotype, hitbox, hitgroup), + function void (int victim, int attacker, int inflictor, float damage, int damagetype, int ammotype, int hitbox, int hitgroup); // ShouldCollide - bool:public(entity, collisiongroup, contentsmask, bool:originalResult), + function bool (int entity, int collisiongroup, int contentsmask, bool originalResult); // Use - Action:public(entity, activator, caller, UseType:type, Float:value), + function Action (int entity, int activator, int caller, UseType type, float value); // UsePost - public(entity, activator, caller, UseType:type, Float:value), + function void (int entity, int activator, int caller, UseType type, float value); // Reload - Action:public(weapon), + function Action (int weapon); // Reload post - public(weapon, bool:bSuccessful) + function void (int weapon, bool bSuccessful); }; diff --git a/env/include/sdktools_entoutput.inc b/env/include/sdktools_entoutput.inc index b7aeaaa..4f404fa 100644 --- a/env/include/sdktools_entoutput.inc +++ b/env/include/sdktools_entoutput.inc @@ -42,8 +42,9 @@ * @param caller Entity index of the caller. * @param activator Entity index of the activator. * @param delay Delay in seconds? before the event gets fired. + * @noreturn */ -functag public EntityOutput(const String:output[], caller, activator, Float:delay); +typedef EntityOutput = function void (const char[] output, int caller, int activator, float delay); /** * Add an entity output hook on a entity classname diff --git a/env/include/sdktools_functions.inc b/env/include/sdktools_functions.inc index 16b3e47..c156192 100644 --- a/env/include/sdktools_functions.inc +++ b/env/include/sdktools_functions.inc @@ -298,7 +298,7 @@ native bool:GetPlayerJingleFile(client, String:hex[], maxlength); * @param out Buffer to store the output traffic velocity. * @noreturn */ -native GetServerNetStats(&Float:in, &Float:out); +native GetServerNetStats(&Float:inAmount, &Float:outAmout); /** * Equip's a player's weapon. @@ -343,4 +343,4 @@ native SetClientInfo(client, const String:key[], const String:value[]); * * @return Amount of ammo actually given. */ -native GivePlayerAmmo(client, amount, ammotype, bool:suppressSound=false); \ No newline at end of file +native GivePlayerAmmo(client, amount, ammotype, bool:suppressSound=false); diff --git a/env/include/sdktools_sound.inc b/env/include/sdktools_sound.inc index bfb4e3f..d888d2e 100644 --- a/env/include/sdktools_sound.inc +++ b/env/include/sdktools_sound.inc @@ -283,7 +283,16 @@ native Float:GetDistGainFromSoundLevel(soundlevel, Float:distance); * @return Plugin_Continue to allow the sound to be played, Plugin_Stop to block it, * Plugin_Changed when any parameter has been modified. */ -functag public Action:AmbientSHook(String:sample[PLATFORM_MAX_PATH], &entity, &Float:volume, &level, &pitch, Float:pos[3], &flags, &Float:delay); +typedef AmbientSHook = function Action ( + char sample[PLATFORM_MAX_PATH], + int &entity, + float &volume, + int &level, + int &pitch, + float pos[3], + int &flags, + float &delay +); /** * Called when a sound is going to be emitted to one or more clients. @@ -301,7 +310,17 @@ functag public Action:AmbientSHook(String:sample[PLATFORM_MAX_PATH], &entity, &F * @return Plugin_Continue to allow the sound to be played, Plugin_Stop to block it, * Plugin_Changed when any parameter has been modified. */ -functag public Action:NormalSHook(clients[64], &numClients, String:sample[PLATFORM_MAX_PATH], &entity, &channel, &Float:volume, &level, &pitch, &flags); +typedef NormalSHook = function Action ( + int clients[64], + int &numClients, + char sample[PLATFORM_MAX_PATH], + int &entity, + int &channel, + float &volume, + int &level, + int &pitch, + int &flags +); /** * Hooks all played ambient sounds. @@ -448,3 +467,229 @@ stock ATTN_TO_SNDLEVEL(Float:attn) } return 0; } + +/** + * Retrieves the parameters for a game sound. + * + * Game sounds are found in a game's scripts/game_sound.txt or other files + * referenced from it + * + * Note that if a game sound has a rndwave section, one of them will be returned + * at random. + * + * @param gameSound Name of game sound. + * @param channel Channel to emit with. + * @param level Sound level. + * @param volume Sound volume. + * @param pitch Sound pitch. + * @param sample Sound file name relative to the "sounds" folder. + * @param maxlength Maximum length of sample string buffer. + * @param entity Entity the sound is being emitted from. + * @return True if the sound was successfully retrieved, false if it + * was not found + */ +native bool:GetGameSoundParams(const String:gameSound[], + &channel, + &soundLevel, + &Float:volume, + &pitch, + String:sample[], + maxlength, + entity=SOUND_FROM_PLAYER); + +/** + * Emits a game sound to a list of clients. + * + * Game sounds are found in a game's scripts/game_sound.txt or other files + * referenced from it + * + * Note that if a game sound has a rndwave section, one of them will be returned + * at random. + * + * @param clients Array of client indexes. + * @param numClients Number of clients in the array. + * @param gameSound Name of game sound. + * @param entity Entity to emit from. + * @param flags Sound flags. + * @param speakerentity Unknown. + * @param origin Sound origin. + * @param dir Sound direction. + * @param updatePos Unknown (updates positions?) + * @param soundtime Alternate time to play sound for. + * @return True if the sound was played successfully, false if it failed + * @error Invalid client index. + */ +stock bool:EmitGameSound(const clients[], + numClients, + const String:gameSound[], + entity = SOUND_FROM_PLAYER, + flags = SND_NOFLAGS, + speakerentity = -1, + const Float:origin[3] = NULL_VECTOR, + const Float:dir[3] = NULL_VECTOR, + bool:updatePos = true, + Float:soundtime = 0.0) +{ + new channel; + new level; + new Float:volume; + new pitch; + new String:sample[PLATFORM_MAX_PATH]; + + if (GetGameSoundParams(gameSound, channel, level, volume, pitch, sample, sizeof(sample), entity)) + { + EmitSound(clients, numClients, sample, entity, channel, level, flags, volume, pitch, speakerentity, origin, dir, updatePos, soundtime); + return true; + } + else + { + return false; + } +} + +/** + * Emits an ambient game sound. + * + * Game sounds are found in a game's scripts/game_sound.txt or other files + * referenced from it + * + * Note that if a game sound has a rndwave section, one of them will be returned + * at random. + * + * @param gameSound Name of game sound. + * @param pos Origin of sound. + * @param entity Entity index to associate sound with. + * @param flags Sound flags. + * @param delay Play delay. + * @noreturn + */ +stock bool:EmitAmbientGameSound(const String:gameSound[], + const Float:pos[3], + entity = SOUND_FROM_WORLD, + flags = SND_NOFLAGS, + Float:delay = 0.0) +{ + new channel; // This is never actually used for Ambients, but it's a mandatory field to GetGameSoundParams + new level; + new Float:volume; + new pitch; + new String:sample[PLATFORM_MAX_PATH]; + + if (GetGameSoundParams(gameSound, channel, level, volume, pitch, sample, sizeof(sample), entity)) + { + EmitAmbientSound(sample, pos, entity, level, flags, volume, pitch, delay); + return true; + } + else + { + return false; + } +} + +/** + * Wrapper to emit a game sound to one client. + * + * Game sounds are found in a game's scripts/game_sound.txt or other files + * referenced from it + * + * Note that if a game sound has a rndwave section, one of them will be returned + * at random. + * + * @param client Client index. + * @param gameSound Name of game sound. + * @param entity Entity to emit from. + * @param flags Sound flags. + * @param speakerentity Unknown. + * @param origin Sound origin. + * @param dir Sound direction. + * @param updatePos Unknown (updates positions?) + * @param soundtime Alternate time to play sound for. + * @noreturn + * @error Invalid client index. + */ +stock bool:EmitGameSoundToClient(client, + const String:gameSound[], + entity = SOUND_FROM_PLAYER, + flags = SND_NOFLAGS, + speakerentity = -1, + const Float:origin[3] = NULL_VECTOR, + const Float:dir[3] = NULL_VECTOR, + bool:updatePos = true, + Float:soundtime = 0.0) +{ + new clients[1]; + clients[0] = client; + /* Save some work for SDKTools and remove SOUND_FROM_PLAYER references */ + entity = (entity == SOUND_FROM_PLAYER) ? client : entity; + return EmitGameSound(clients, 1, gameSound, entity, flags, + speakerentity, origin, dir, updatePos, soundtime); +} + +/** + * Wrapper to emit game sound to all clients. + * + * Game sounds are found in a game's scripts/game_sound.txt or other files + * referenced from it + * + * Note that if a game sound has a rndwave section, one of them will be returned + * at random. + * + * @param gameSound Name of game sound. + * @param entity Entity to emit from. + * @param flags Sound flags. + * @param speakerentity Unknown. + * @param origin Sound origin. + * @param dir Sound direction. + * @param updatePos Unknown (updates positions?) + * @param soundtime Alternate time to play sound for. + * @noreturn + * @error Invalid client index. + */ +stock bool:EmitGameSoundToAll(const String:gameSound[], + entity = SOUND_FROM_PLAYER, + flags = SND_NOFLAGS, + speakerentity = -1, + const Float:origin[3] = NULL_VECTOR, + const Float:dir[3] = NULL_VECTOR, + bool:updatePos = true, + Float:soundtime = 0.0) +{ + new clients[MaxClients]; + new total = 0; + + for (new i=1; i<=MaxClients; i++) + { + if (IsClientInGame(i)) + { + clients[total++] = i; + } + } + + if (!total) + { + return false; + } + + return EmitGameSound(clients, total, gameSound, entity, flags, + speakerentity, origin, dir, updatePos, soundtime); +} + +/** + * Precache a game sound. + * + * Most games will precache all game sounds on map start, but this is not guaranteed... + * Team Fortress 2 is known to not pre-cache MvM game mode sounds on non-MvM maps. + * + * Due to the above, this native should be called before any calls to GetGameSoundParams, + * EmitGameSound*, or EmitAmbientGameSound. + * + * It should be safe to pass already precached game sounds to this function. + * + * Note: It precaches all files for a game sound. + * + * @param soundname Game sound to precache + * + * @return True if the game sound was found, false if sound did not exist + * or had no files + */ +native bool:PrecacheScriptSound(const String:soundname[]); diff --git a/env/include/sdktools_tempents.inc b/env/include/sdktools_tempents.inc index 9b980c2..1aaf3b0 100644 --- a/env/include/sdktools_tempents.inc +++ b/env/include/sdktools_tempents.inc @@ -44,7 +44,7 @@ * @param delay Delay in seconds to send the TE. * @return Plugin_Continue to allow the transmission of the TE, Plugin_Stop to block it. */ -functag public Action:TEHook(const String:te_name[], const Players[], numClients, Float:delay); +typedef TEHook = function Action (const char[] te_name, const int[] Players, int numClients, float delay); /** * Hooks a temp entity. @@ -171,7 +171,7 @@ native TE_WriteFloatArray(const String:prop[], const Float:array[], arraySize); * @noreturn * @error Invalid client index or client not in game. */ -native TE_Send(clients[], numClients, Float:delay=0.0); +native TE_Send(const clients[], numClients, Float:delay=0.0); /** * Sets an encoded entity index in the current temp entity. diff --git a/env/include/sdktools_trace.inc b/env/include/sdktools_trace.inc index 845a566..1dfe106 100644 --- a/env/include/sdktools_trace.inc +++ b/env/include/sdktools_trace.inc @@ -110,7 +110,7 @@ enum RayType RayType_Infinite /**< The trace ray will go from the start position to infinity using a direction vector. */ }; -funcenum TraceEntityFilter +typeset TraceEntityFilter { /** * Called on entity filtering. @@ -119,7 +119,7 @@ funcenum TraceEntityFilter * @param contentsMask Contents Mask. * @return True to allow the current entity to be hit, otherwise false. */ - bool:public(entity, contentsMask), + function bool (int entity, int contentsMask); /** * Called on entity filtering. @@ -129,7 +129,7 @@ funcenum TraceEntityFilter * @param data Data value, if used. * @return True to allow the current entity to be hit, otherwise false. */ - bool:public(entity, contentsMask, any:data), + function bool (int entity, int contentsMask, any data); }; /** @@ -371,4 +371,4 @@ native TR_GetPlaneNormal(Handle:hndl, Float:normal[3]); * @param pos Vector buffer to store data in. * @return True if outside world, otherwise false. */ -native TR_PointOutsideWorld(Float:pos[3]); \ No newline at end of file +native TR_PointOutsideWorld(Float:pos[3]); diff --git a/env/include/sorting.inc b/env/include/sorting.inc index 50ac310..297f1ad 100644 --- a/env/include/sorting.inc +++ b/env/include/sorting.inc @@ -98,7 +98,7 @@ native SortStrings(String:array[][], array_size, SortOrder:order = Sort_Ascendin * 0 if first is equal to second * 1 if first should go after second */ -functag public SortFunc1D(elem1, elem2, const array[], Handle:hndl); +typedef SortFunc1D = function int (int elem1, int elem2, const int[] array, Handle hndl); /** * Sorts a custom 1D array. You must pass in a comparison function. @@ -123,10 +123,10 @@ native SortCustom1D(array[], array_size, SortFunc1D:sortfunc, Handle:hndl=INVALI * 0 if first is equal to second * 1 if first should go after second */ -funcenum SortFunc2D +typeset SortFunc2D { - public(elem1[], elem2[], const array[][], Handle:hndl), - public(String:elem1[], String:elem2[], const String:array[][], Handle:hndl), + function int (int[] elem1, int[] elem2, const int[][] array, Handle hndl); + function int (char[] elem1, char[] elem2, const char[][] array, Handle hndl); }; /** @@ -163,7 +163,7 @@ native SortADTArray(Handle:array, SortOrder:order, SortType:type); * 0 if first is equal to second * 1 if first should go after second */ -functag public SortFuncADTArray(index1, index2, Handle:array, Handle:hndl); +typedef SortFuncADTArray = function int (int index1, int index2, Handle array, Handle hndl); /** * Custom sorts an ADT Array. You must pass in a comparison function. @@ -173,4 +173,4 @@ functag public SortFuncADTArray(index1, index2, Handle:array, Handle:hndl); * @param hndl Optional Handle to pass through the comparison calls. * @noreturn */ -native SortADTArrayCustom(Handle:array, SortFuncADTArray:sortfunc, Handle:hndl=INVALID_HANDLE); \ No newline at end of file +native SortADTArrayCustom(Handle:array, SortFuncADTArray:sortfunc, Handle:hndl=INVALID_HANDLE); diff --git a/env/include/sourcemod.inc b/env/include/sourcemod.inc index dec146d..0274e37 100644 --- a/env/include/sourcemod.inc +++ b/env/include/sourcemod.inc @@ -40,11 +40,11 @@ */ struct Plugin { - const String:name[], /**< Plugin Name */ - const String:description[], /**< Plugin Description */ - const String:author[], /**< Plugin Author */ - const String:version[], /**< Plugin Version */ - const String:url[], /**< Plugin URL */ + public const char[] name; /**< Plugin Name */ + public const char[] description; /**< Plugin Description */ + public const char[] author; /**< Plugin Author */ + public const char[] version; /**< Plugin Version */ + public const char[] url; /**< Plugin URL */ }; #include @@ -64,6 +64,7 @@ struct Plugin #include #include #include +#include #include #include #include @@ -74,6 +75,7 @@ struct Plugin #include #include #include +#include enum APLRes { @@ -82,18 +84,6 @@ enum APLRes APLRes_SilentFailure /**< Plugin shouldn't load but do so silently */ }; -/** - * Declare this as a struct in your plugin to expose its information. - * Example: - * - * public Plugin:myinfo = - * { - * name = "My Plugin", - * //etc - * }; - */ -public Plugin:myinfo; - /** * Called when the plugin is fully initialized and all known external references * are resolved. This is only called once in the lifetime of the plugin, and is @@ -108,7 +98,7 @@ public Plugin:myinfo; * * @noreturn */ -forward OnPluginStart(); +forward void OnPluginStart(); /** * @deprecated Use AskPluginLoad2() instead. @@ -144,7 +134,7 @@ forward APLRes:AskPluginLoad2(Handle:myself, bool:late, String:error[], err_max) * * @noreturn */ -forward OnPluginEnd(); +forward void OnPluginEnd(); /** * Called when the plugin's pause status is changing. @@ -152,14 +142,14 @@ forward OnPluginEnd(); * @param pause True if the plugin is being paused, false otherwise. * @noreturn */ -forward OnPluginPauseChange(bool:pause); +forward void OnPluginPauseChange(bool:pause); /** * Called before every server frame. Note that you should avoid * doing expensive computations here, and you should declare large * local arrays using 'decl' instead of 'new'. */ -forward OnGameFrame(); +forward void OnGameFrame(); /** * Called when the map is loaded. @@ -167,12 +157,12 @@ forward OnGameFrame(); * @note This used to be OnServerLoad(), which is now deprecated. * Plugins still using the old forward will work. */ -forward OnMapStart(); +forward void OnMapStart(); /** * Called right before a map ends. */ -forward OnMapEnd(); +forward void OnMapEnd(); /** * Called when the map has loaded, servercfgfile (server.cfg) has been @@ -184,7 +174,7 @@ forward OnMapEnd(); * * @noreturn */ -forward OnConfigsExecuted(); +forward void OnConfigsExecuted(); /** * This is called once, right after OnMapStart() but any time before @@ -201,20 +191,20 @@ forward OnConfigsExecuted(); * * @noreturn */ -forward OnAutoConfigsBuffered(); +forward void OnAutoConfigsBuffered(); /** * @deprecated Use OnConfigsExecuted() instead. */ #pragma deprecated Use OnConfigsExecuted() instead -forward OnServerCfg(); +forward void OnServerCfg(); /** * Called after all plugins have been loaded. This is called once for * every plugin. If a plugin late loads, it will be called immediately * after OnPluginStart(). */ -forward OnAllPluginsLoaded(); +forward void OnAllPluginsLoaded(); /** * Returns the calling plugin's Handle. @@ -461,7 +451,7 @@ native GetExtensionFileStatus(const String:name[], String:error[]="", maxlength= * * @param name Library name. */ -forward OnLibraryAdded(const String:name[]); +forward void OnLibraryAdded(const String:name[]); /** * Called right before a library is removed that the current plugin references @@ -470,7 +460,7 @@ forward OnLibraryAdded(const String:name[]); * * @param name Library name. */ -forward OnLibraryRemoved(const String:name[]); +forward void OnLibraryRemoved(const String:name[]); #define MAPLIST_FLAG_MAPSFOLDER (1<<0) /**< On failure, use all maps in the maps folder. */ #define MAPLIST_FLAG_CLEARARRAY (1<<1) /**< If an input array is specified, clear it before adding. */ @@ -564,7 +554,7 @@ forward bool:OnClientFloodCheck(client); * @param blocked True if client flooded last "say", false otherwise. * @noreturn */ -forward OnClientFloodResult(client, bool:blocked); +forward void OnClientFloodResult(client, bool:blocked); /** * Feature types. diff --git a/env/include/string.inc b/env/include/string.inc index a06b924..92d0a5b 100644 --- a/env/include/string.inc +++ b/env/include/string.inc @@ -433,30 +433,19 @@ stock CharToLower(chr) * @return The index of the first occurrence of the character * in the string, or -1 if the character was not found. */ -stock FindCharInString(const String:str[], c, bool:reverse = false) +stock int FindCharInString(const char[] str, char c, bool reverse = false) { - new i, len - - len = strlen(str); + int len = strlen(str); - if (!reverse) - { - for (i = 0; i < len; i++) - { + if (!reverse) { + for (int i = 0; i < len; i++) { if (str[i] == c) - { return i; - } } - } - else - { - for (i = len - 1; i >= 0; i--) - { + } else { + for (int i = len - 1; i >= 0; i--) { if (str[i] == c) - { return i; - } } } diff --git a/env/include/textparse.inc b/env/include/textparse.inc index 85ef687..880e4d7 100644 --- a/env/include/textparse.inc +++ b/env/include/textparse.inc @@ -1,7 +1,7 @@ /** - * vim: set ts=4 : + * vim: set ts=4 sw=4 tw=99 noet : * ============================================================================= - * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * SourceMod (C)2004-2014 AlliedModders LLC. All rights reserved. * ============================================================================= * * This file is part of the SourceMod/SourcePawn SDK. @@ -29,7 +29,7 @@ * * Version: $Id$ */ - + #if defined _textparse_included #endinput #endif @@ -45,7 +45,7 @@ /** * Parse result directive. */ -enum SMCResult +enum SMCResult: { SMCParse_Continue, /**< Continue parsing */ SMCParse_Halt, /**< Stop parsing here */ @@ -55,7 +55,7 @@ enum SMCResult /** * Parse error codes. */ -enum SMCError +enum SMCError: { SMCError_Okay = 0, /**< No error */ SMCError_StreamOpen, /**< Stream failed to open */ @@ -71,12 +71,117 @@ enum SMCError SMCError_InvalidProperty1, /**< A property was declared outside of any section */ }; +// Called when parsing is started. +// +// @param smc The SMC Parse Handle. +typedef SMC_ParseStart = function void (SMCParser smc); + +// Called when the parser is entering a new section or sub-section. +// +// Note: Enclosing quotes are always stripped. +// +// @param smc The SMC Parser. +// @param name String containing section name. +// @param opt_quotes True if the section name was quote-enclosed in the file. +// @return An SMCResult action to take. +typedef SMC_NewSection = function SMCResult (SMCParser smc, const char[] name, bool opt_quotes); + +// Called when the parser finds a new key/value pair. +// +// Note: Enclosing quotes are always stripped. +// +// @param smc The SMCParser. +// @param key String containing key name. +// @param value String containing value name. +// @param key_quotes Whether or not the key was enclosed in quotes. +// @param value_quotes Whether or not the value was enclosed in quotes. +// @return An SMCResult action to take. +typedef SMC_KeyValue = function SMCResult (SMCParser smc, const char[] key, const char[] value, bool key_quotes, bool value_quotes); + +// Called when the parser finds the end of the current section. +// +// @param smc The SMCParser. +// @return An SMCResult action to take. +typedef SMC_EndSection = function SMCResult (SMCParser smc); + +// Called when parsing is halted. +// +// @param smc The SMCParser. +// @param halted True if abnormally halted, false otherwise. +// @param failed True if parsing failed, false otherwise. +// @noreturn +typedef SMC_ParseEnd = function void (SMCParser smc, bool halted, bool failed); + +// Callback for whenever a new line of text is about to be parsed. +// +// @param smc The SMCParser. +// @param line A string containing the raw line from the file. +// @param lineno The line number it occurs on. +// @return An SMCResult action to take. +typedef SMC_RawLine = function SMCResult (SMCParser smc, const char[] line, int lineno); + +// An SMCParser is a callback-driven parser for SourceMod configuration files. +// SMC files are similar to Valve KeyValues format, with two key differences: +// (1) SMC cannot handle single-item entries (that is, a key with no value). +// (2) SMC files can have multi-line comment blocks, whereas KeyValues cannot. +methodmap SMCParser < Handle +{ + // Create a new SMC file format parser. + public native SMCParser(); + + // Parses an SMC file. + // + // @param file A string containing the file path. + // @param line An optional variable to store the last line number read. + // @param col An optional variable to store the last column number read. + // @return An SMCParseError result. + public native SMCError ParseFile(const char[] file, int &line = 0, int &col = 0); + + // Sets the callback for receiving SMC_ParseStart events. + property SMC_ParseStart OnStart { + public native set(SMC_ParseStart func); + } + + // Sets the callback for receiving SMC_ParseEnd events. + property SMC_ParseEnd OnEnd { + public native set(SMC_ParseEnd func); + } + + // Sets the callback for receiving SMC_NewSection events. + property SMC_NewSection OnEnterSection { + public native set(SMC_NewSection func); + } + + // Sets the callback for receiving SMC_EndSection events. + property SMC_EndSection OnLeaveSection { + public native set(SMC_EndSection func); + } + + // Sets the callback for receiving SMC_KeyValue events. + property SMC_KeyValue OnKeyValue { + public native set(SMC_KeyValue func); + } + + // Sets the callback for receiving SMC_RawLine events. + property SMC_RawLine OnRawLine { + public native set(SMC_RawLine func); + } + + // Gets an error string for an SMCError code. + // + // @param error The SMCParseError code. + // @param buffer A string buffer for the error (contents undefined on failure). + // @param buf_max The maximum size of the buffer. + // @return The number of characters written to buffer. + public native void GetErrorString(SMCError error, char[] buffer, int buf_max); +}; + /** * Creates a new SMC file format parser. This is used to set parse hooks. * * @return A new Handle to an SMC Parse structure. */ -native Handle:SMC_CreateParser(); +native SMCParser SMC_CreateParser(); /** * Parses an SMC file. @@ -86,9 +191,9 @@ native Handle:SMC_CreateParser(); * @param line An optional by reference cell to store the last line number read. * @param col An optional by reference cell to store the last column number read. * @return An SMCParseError result. - * @error Invalid or corrupt Handle. + * @error Invalid or corrupt Handle. */ -native SMCError:SMC_ParseFile(Handle:smc, const String:file[], &line=0, &col=0); +native SMCError SMC_ParseFile(Handle smc, const char[] file, int &line=0, int &col=0); /** * Gets an error string for an SMCError code. @@ -100,15 +205,7 @@ native SMCError:SMC_ParseFile(Handle:smc, const String:file[], &line=0, &col=0); * @param buf_max The maximum size of the buffer. * @return True on success, false otherwise. */ -native bool:SMC_GetErrorString(SMCError:error, String:buffer[], buf_max); - -/** - * Called when parsing is started. - * - * @param smc The SMC Parse Handle. - * @noreturn - */ -functag public SMC_ParseStart(Handle:smc); +native bool SMC_GetErrorString(SMCError error, char[] buffer, int buf_max); /** * Sets the SMC_ParseStart function of a parse Handle. @@ -116,19 +213,9 @@ functag public SMC_ParseStart(Handle:smc); * @param smc Handle to an SMC Parse. * @param func SMC_ParseStart function. * @noreturn - * @error Invalid or corrupt Handle. + * @error Invalid or corrupt Handle. */ -native SMC_SetParseStart(Handle:smc, SMC_ParseStart:func); - -/** - * Called when parsing is halted. - * - * @param smc The SMC Parse Handle. - * @param halted True if abnormally halted, false otherwise. - * @param failed True if parsing failed, false otherwise. - * @noreturn - */ -functag public SMC_ParseEnd(Handle:smc, bool:halted, bool:failed); +native SMC_SetParseStart(Handle smc, SMC_ParseStart func); /** * Sets the SMC_ParseEnd of a parse handle. @@ -136,41 +223,9 @@ functag public SMC_ParseEnd(Handle:smc, bool:halted, bool:failed); * @param smc Handle to an SMC Parse. * @param func SMC_ParseEnd function. * @noreturn - * @error Invalid or corrupt Handle. + * @error Invalid or corrupt Handle. */ -native SMC_SetParseEnd(Handle:smc, SMC_ParseEnd:func); - -/** - * Called when the parser is entering a new section or sub-section. - * @note Enclosing quotes are always stripped. - * - * @param smc The SMC Parse Handle. - * @param name String containing section name. - * @param opt_quotes True if the section name was quote-enclosed in the file. - * @return An SMCResult action to take. - */ -functag public SMCResult:SMC_NewSection(Handle:smc, const String:name[], bool:opt_quotes); - -/** - * Called when the parser finds a new key/value pair. - * @note Enclosing quotes are always stripped. - * - * @param smc The SMC Parse Handle. - * @param key String containing key name. - * @param value String containing value name. - * @param key_quotes Whether or not the key was enclosed in quotes. - * @param value_quotes Whether or not the value was enclosed in quotes. - * @return An SMCResult action to take. - */ -functag public SMCResult:SMC_KeyValue(Handle:smc, const String:key[], const String:value[], bool:key_quotes, bool:value_quotes); - -/** - * Called when the parser finds the end of the current section. - * - * @param smc The SMC Parse Handle. - * @return An SMCResult action to take. - */ -functag public SMCResult:SMC_EndSection(Handle:smc); +native SMC_SetParseEnd(Handle smc, SMC_ParseEnd func); /** * Sets the three main reader functions. @@ -179,25 +234,13 @@ functag public SMCResult:SMC_EndSection(Handle:smc); * @param ns An SMC_NewSection function pointer. * @param kv An SMC_KeyValue function pointer. * @param es An SMC_EndSection function pointer. - * @noreturn */ -native SMC_SetReaders(Handle:smc, SMC_NewSection:ns, SMC_KeyValue:kv, SMC_EndSection:es); - -/** - * Called whenever a raw line is read. - * - * @param smc The SMC Parse Handle. - * @param line A string containing the raw line from the file. - * @param lineno The line number it occurs on. - * @return An SMCResult action to take. - */ -functag public SMCResult:SMC_RawLine(Handle:smc, const String:line[], lineno); +native void SMC_SetReaders(Handle smc, SMC_NewSection ns, SMC_KeyValue kv, SMC_EndSection es); /** * Sets a raw line reader on an SMC parser Handle. * * @param smc Handle to an SMC Parse. * @param func SMC_RawLine function. - * @noreturn */ -native SMC_SetRawLine(Handle:smc, SMC_RawLine:func); +native void SMC_SetRawLine(Handle smc, SMC_RawLine func); diff --git a/env/include/tf2.inc b/env/include/tf2.inc index 789463d..de40428 100644 --- a/env/include/tf2.inc +++ b/env/include/tf2.inc @@ -107,7 +107,7 @@ enum TFCond TFCond_RegenBuffed, TFCond_MarkedForDeath, TFCond_NoHealingDamageBuff, - TFCond_SpeedBuffAlly, //32 + TFCond_SpeedBuffAlly, // 32 TFCond_HalloweenCritCandy, TFCond_CritCanteen, TFCond_CritDemoCharge, @@ -153,23 +153,47 @@ enum TFCond TFCond_HalloweenTiny, TFCond_HalloweenInHell, TFCond_HalloweenGhostMode, + + TFCond_DodgeChance = 79, + TFCond_Parachute, + TFCond_BlastJumping, + TFCond_HalloweenKart, + TFCond_HalloweenKartDash, + TFCond_BalloonHead, + TFCond_MeleeOnly, + TFCond_SwimmingCurse, + TFCond_HalloweenKartNoTurn, + TFCond_HalloweenKartCage, + TFCond_HasRune, + TFCond_RuneStrength, + TFCond_RuneHaste, + TFCond_RuneRegen, + TFCond_RuneResist, + TFCond_RuneVampire, + TFCond_RuneWarlock, + TFCond_RunePrecision, // 96 + TFCond_RuneAgility, }; const Float:TFCondDuration_Infinite = -1.0; enum TFHoliday { - TFHoliday_Birthday = 1, - TFHoliday_Halloween, - TFHoliday_Christmas, - TFHoliday_ValentinesDay, - TFHoliday_MeetThePyro, - TFHoliday_FullMoon, - TFHoliday_HalloweenOrFullMoon, - TFHoliday_HalloweenOrFullMoonOrValentines, - TFHoliday_AprilFools, + TFHoliday_Invalid = -1 }; +public const TFHoliday:TFHoliday_Birthday; +public const TFHoliday:TFHoliday_Halloween; +public const TFHoliday:TFHoliday_Christmas; +public const TFHoliday:TFHoliday_EndOfTheLine; +public const TFHoliday:TFHoliday_ValentinesDay; +public const TFHoliday:TFHoliday_MeetThePyro; +public const TFHoliday:TFHoliday_SpyVsEngyWar; +public const TFHoliday:TFHoliday_FullMoon; +public const TFHoliday:TFHoliday_HalloweenOrFullMoon; +public const TFHoliday:TFHoliday_HalloweenOrFullMoonOrValentines; +public const TFHoliday:TFHoliday_AprilFools; + enum TFObjectType { TFObject_CartDispenser = 0, @@ -254,12 +278,12 @@ native TF2_SetPlayerPowerPlay(client, bool:enabled); * * @param client Player's index. * @param team Team to disguise the player as (only TFTeam_Red and TFTeam_Blue have an effect) - * @param class TFClassType class to disguise the player as + * @param classType TFClassType class to disguise the player as * @param target Specific target player to disguise as (0 for any) * @noreturn * @error Invalid client index, client not in game, or no mod support. */ -native TF2_DisguisePlayer(client, TFTeam:team, TFClassType:class, target=0); +native TF2_DisguisePlayer(client, TFTeam:team, TFClassType:classType, target=0); /** * Removes the current disguise from a client. Only has an effect on spies. @@ -359,6 +383,17 @@ native bool:TF2_IsHolidayActive(TFHoliday:holiday); */ native bool:TF2_IsPlayerInDuel(client); +/** + * Removes an econ wearable (hat, misc, etc) from a player. + * This also deletes the wearable entity. + * + * @param client Client index. + * @param wearable Index of the wearable entity. + * @noreturn + * @error Invalid client index, client not in game, invalid wearable entity, or no mod support. +*/ +native TF2_RemoveWearable(client, wearable); + /** * Called after a condition is added to a player * @@ -436,5 +471,6 @@ public __ext_tf2_SetNTVOptional() MarkNativeAsOptional("TF2_GetClass"); MarkNativeAsOptional("TF2_IsPlayerInDuel"); MarkNativeAsOptional("TF2_IsHolidayActive"); + MarkNativeAsOptional("TF2_RemoveWearable"); } #endif diff --git a/env/include/tf2_stocks.inc b/env/include/tf2_stocks.inc index 10fff4b..550b540 100644 --- a/env/include/tf2_stocks.inc +++ b/env/include/tf2_stocks.inc @@ -249,6 +249,7 @@ enum { TF_WEAPON_SPELLBOOK, TF_WEAPON_SPELLBOOK_PROJECTILE, TF_WEAPON_SNIPERRIFLE_CLASSIC, + TF_WEAPON_PARACHUTE, }; // TF2 Weapon Loadout Slots @@ -318,7 +319,19 @@ static const String:TFResourceNames[TFResourceType][] = }; /** - * Get's a Clients current class. + * Gets a client's current team. + * + * @param client Client index. + * @return Current TFTeam of client. + * @error Invalid client index. + */ +stock TFTeam:TF2_GetClientTeam(client) +{ + return TFTeam:GetClientTeam(client); +} + +/** + * Gets a client's current class. * * @param client Player's index. * @return Current TFClassType of player. @@ -330,24 +343,24 @@ stock TFClassType:TF2_GetPlayerClass(client) } /** - * Set's a Clients class. + * Sets a client's class. * * Note: If setting player class in a player spawn hook weapons should be set to false. * * @param client Player's index. - * @param class TFClassType class symbol. - * @param weapons This paramater is ignored. - * @param persistent If true changes the players desired class so the change stays after death. + * @param classType TFClassType class symbol. + * @param weapons This parameter is ignored. + * @param persistent If true, changes the player's desired class so the change stays after death. * @noreturn * @error Invalid client index. */ -stock TF2_SetPlayerClass(client, TFClassType:class, bool:weapons=true, bool:persistent=true) +stock TF2_SetPlayerClass(client, TFClassType:classType, bool:weapons=true, bool:persistent=true) { - SetEntProp(client, Prop_Send, "m_iClass", _:class); + SetEntProp(client, Prop_Send, "m_iClass", _:classType); if (persistent) { - SetEntProp(client, Prop_Send, "m_iDesiredPlayerClass", _:class); + SetEntProp(client, Prop_Send, "m_iDesiredPlayerClass", _:classType); } } @@ -368,12 +381,12 @@ stock TF2_GetPlayerResourceData(client, TFResourceType:type) } new offset = FindSendPropInfo("CTFPlayerResource", TFResourceNames[type]); - + if (offset < 1) { return -1; } - + new entity = TF2_GetResourceEntity(); if (entity == -1) @@ -404,12 +417,12 @@ stock bool:TF2_SetPlayerResourceData(client, TFResourceType:type, any:value) } new offset = FindSendPropInfo("CTFPlayerResource", TFResourceNames[type]); - + if (offset < 1) { return false; } - + new entity = TF2_GetResourceEntity(); if (entity == -1) @@ -435,6 +448,20 @@ stock TF2_RemoveWeaponSlot(client, slot) new weaponIndex; while ((weaponIndex = GetPlayerWeaponSlot(client, slot)) != -1) { + // bug #6206 + // papering over a valve bug where a weapon's extra wearables aren't properly removed from the weapon's owner + new extraWearable = GetEntPropEnt(weaponIndex, Prop_Send, "m_hExtraWearable"); + if (extraWearable != -1) + { + TF2_RemoveWearable(client, extraWearable); + } + + extraWearable = GetEntPropEnt(weaponIndex, Prop_Send, "m_hExtraWearableViewModel"); + if (extraWearable != -1) + { + TF2_RemoveWearable(client, extraWearable); + } + RemovePlayerItem(client, weaponIndex); AcceptEntityInput(weaponIndex, "Kill"); } @@ -497,7 +524,7 @@ stock bool:TF2_IsPlayerInCondition(client, TFCond:cond) return true; } } - else + else if (_:cond < 96) { new bit = (1 << (_:cond - 64)); if ((GetEntProp(client, Prop_Send, "m_nPlayerCondEx2") & bit) == bit) @@ -505,6 +532,14 @@ stock bool:TF2_IsPlayerInCondition(client, TFCond:cond) return true; } } + else + { + new bit = (1 << (_:cond - 96)); + if ((GetEntProp(client, Prop_Send, "m_nPlayerCondEx3") & bit) == bit) + { + return true; + } + } return false; } diff --git a/env/include/timers.inc b/env/include/timers.inc index dbaeb14..1f6382a 100644 --- a/env/include/timers.inc +++ b/env/include/timers.inc @@ -45,7 +45,7 @@ /** * Any of the following prototypes will work for a timed function. */ -funcenum Timer +typeset Timer { /** * Called when the timer interval has elapsed. @@ -55,7 +55,7 @@ funcenum Timer * @return Plugin_Stop to stop a repeating timer, any other value for * default behavior. */ - Action:public(Handle:timer, Handle:hndl), + function Action(Handle timer, Handle hndl); /** * Called when the timer interval has elapsed. @@ -65,7 +65,7 @@ funcenum Timer * @return Plugin_Stop to stop a repeating timer, any other value for * default behavior. */ - Action:public(Handle:timer, any:data), + function Action(Handle timer, any data); /** * Called when the timer interval has elapsed. @@ -74,7 +74,7 @@ funcenum Timer * @return Plugin_Stop to stop a repeating timer, any other value for * default behavior. */ - Action:public(Handle:timer), + function Action(Handle timer); }; /** @@ -177,7 +177,7 @@ native Float:GetTickInterval(); * the map yet), then this will be called once the server begins ticking, even * if there is no time limit set. */ -forward OnMapTimeLeftChanged(); +forward void OnMapTimeLeftChanged(); /** * Returns whether or not the server is processing frames or not. diff --git a/env/include/topmenus.inc b/env/include/topmenus.inc index 9bc4d7f..902b4ff 100644 --- a/env/include/topmenus.inc +++ b/env/include/topmenus.inc @@ -1,5 +1,5 @@ /** - * vim: set ts=4 : + * vim: set ts=4 sw=4 tw=99 noet: * ============================================================================= * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. * ============================================================================= @@ -38,25 +38,25 @@ #include /** - * Actions a top menu will take on an object. + * Actions a top menu will take on an topobj. */ -enum TopMenuAction +enum TopMenuAction: { /** * An option is being drawn for a menu (or for sorting purposes). * - * INPUT : TopMenu Handle, object ID, client index. + * INPUT : TopMenu Handle, topobj ID, client index. * OUTPUT: Buffer for rendering, maxlength of buffer. */ TopMenuAction_DisplayOption = 0, /** - * The title of a menu is being drawn for a given object. + * The title of a menu is being drawn for a given topobj. * * Note: The Object ID will be INVALID_TOPMENUOBJECT if drawing the * root title. Otherwise, the Object ID is a category. * - * INPUT : TopMenu Handle, object ID, client index. + * INPUT : TopMenu Handle, topobj ID, client index. * OUTPUT: Buffer for rendering, maxlength of buffer. */ TopMenuAction_DisplayTitle = 1, @@ -66,14 +66,14 @@ enum TopMenuAction * * The Object ID will always be an item (not a category). * - * INPUT : TopMenu Handle, object ID, client index. + * INPUT : TopMenu Handle, topobj ID, client index. */ TopMenuAction_SelectOption = 2, /** * A menu option is being drawn and its flags can be overridden. * - * INPUT : TopMenu Handle, object ID, client index. + * INPUT : TopMenu Handle, topobj ID, client index. * OUTPUT: The first byte of the 'buffer' string should be set * to the desired flags. By default, it will contain * ITEMDRAW_DEFAULT. @@ -81,18 +81,18 @@ enum TopMenuAction TopMenuAction_DrawOption = 3, /** - * Called when an object is being removed from the menu. + * Called when an topobj is being removed from the menu. * This can be used to clean up data stored in the info string. * - * INPUT : TopMenu Handle, object ID. + * INPUT : TopMenu Handle, topobj ID. */ TopMenuAction_RemoveObject = 4, }; /** - * Top menu object types. + * Top menu topobj types. */ -enum TopMenuObjectType +enum TopMenuObjectType: { TopMenuObject_Category = 0, /**< Category (sub-menu branching from root) */ TopMenuObject_Item = 1 /**< Item on a sub-menu */ @@ -101,7 +101,7 @@ enum TopMenuObjectType /** * Top menu starting positions for display. */ -enum TopMenuPosition +enum TopMenuPosition: { TopMenuPosition_Start = 0, /**< Start/root of the menu */ TopMenuPosition_LastRoot = 1, /**< Last position in the root menu */ @@ -109,9 +109,9 @@ enum TopMenuPosition }; /** - * Top menu object tag for type checking. + * Top menu topobj tag for type checking. */ -enum TopMenuObject +enum TopMenuObject: { INVALID_TOPMENUOBJECT = 0, }; @@ -121,18 +121,138 @@ enum TopMenuObject * * @param topmenu Handle to the TopMenu. * @param action TopMenuAction being performed. - * @param object_id The object ID (if used). + * @param topobj_id The topobj ID (if used). * @param param Extra parameter (if used). * @param buffer Output buffer (if used). * @param maxlength Output buffer (if used). * @noreturn */ -functag public TopMenuHandler(Handle:topmenu, - TopMenuAction:action, - TopMenuObject:object_id, - param, - String:buffer[], - maxlength); +typedef TopMenuHandler = function void ( + Handle topmenu, + TopMenuAction action, + TopMenuObject topobj_id, + int param, + char[] buffer, + int maxlength +); + +// TopMenu objects are used for constructing multi-layer menus. Currently, they +// support at most two levels. The first level of items are called "categories". +methodmap TopMenu < Handle +{ + // Creates a new TopMenu. + // + // @param handler Handler to use for drawing the root title. + // @return A new TopMenu. + public native TopMenu(TopMenuHandler handler); + + // Returns a TopMenu handle from a generic handle. If the given handle is + // a TopMenu, the handle is simply casted back. Otherwise, an error is + // raised. + public static native TopMenu FromHandle(Handle handle); + + // Re-sorts the items in a TopMenu via a configuration file. + // + // The format of the configuration file should be a Valve Key-Values + // formatted file that SourceMod can parse. There should be one root + // section, and one sub-section for each category. Each sub-section's + // name should match the category name. + // + // Each sub-section may only contain key/value pairs in the form of: + // key: "item" + // value: Name of the item as passed to AddToTopMenu(). + // + // The TopMenu will draw items in the order declared in the configuration + // file. If items do not appear in the configuration file, they are sorted + // per-player based on how the handler function renders for that player. + // These items appear after the configuration sorted items. + // + // @param topmenu TopMenu Handle. + // @param file File path. + // @param error Error buffer. + // @param maxlength Maximum size of the error buffer. Error buffer + // will be filled with a zero-terminated string if + // false is returned. + // @return True on success, false on failure. + public native bool LoadConfig(const char[] file, char[] error, int maxlength); + + // Adds a category to a TopMenu. + // + // @param name Object name (MUST be unique). + // @param handler Handler for topobj. + // @param cmdname Command name (for access overrides). + // @param flags Default access flags. + // @param info_string Arbitrary storage (max 255 bytes). + // @return A new TopMenuObject ID, or INVALID_TOPMENUOBJECT on failure. + public native TopMenuObject AddCategory(const char[] name, TopMenuHandler handler, + const char[] cmdname = "", int flags = 0, + const char[] info_string = ""); + + // Adds an item to a TopMenu category. + // + // @param name Object name (MUST be unique). + // @param handler Handler for topobj. + // @param category The object of the parent category for the item. + // @param cmdname Command name (for access overrides). + // @param flags Default access flags. + // @param info_string Arbitrary storage (max 255 bytes). + // @return A new TopMenuObject ID, or INVALID_TOPMENUOBJECT on failure. + public native TopMenuObject AddItem(const char[] name, TopMenuHandler handler, + TopMenuObject parent, const char[] cmdname = "", + int flags = 0, const char[] info_string = ""); + + // Retrieves the info string of a top menu item. + // + // @param parent TopMenuObject ID. + // @param buffer Buffer to store info string. + // @param maxlength Maximum size of info string. + // @return Number of bytes written, not including the null terminator. + public native int GetInfoString(TopMenuObject parent, char[] buffer, int maxlength); + + // Retrieves the name string of a top menu item. + // + // @param topobj TopMenuObject ID. + // @param buffer Buffer to store info string. + // @param maxlength Maximum size of info string. + // @return Number of bytes written, not including the null terminator. + public native int GetObjName(TopMenuObject topobj, char[] buffer, int maxlength); + + // Removes an topobj from a TopMenu. + // + // Plugins' topobjs are automatically removed all TopMenus when the given + // plugin unloads or pauses. In the case of unpausing, all items are restored. + // + // @param topobj TopMenuObject ID. + public native void Remove(TopMenuObject topobj); + + // Displays a TopMenu to a client. + // + // @param client Client index. + // @param position Position to display from. + // @return True on success, false on failure. + public native bool Display(int client, TopMenuPosition position); + + // Displays a TopMenu category to a client. + // + // @param category Category topobj id. + // @param client Client index. + // @return True on success, false on failure. + public native bool DisplayCategory(TopMenuObject category, int client); + + // Finds a category's topobj ID in a TopMenu. + // + // @param name Object's unique name. + // @return TopMenuObject ID on success, or + // INVALID_TOPMENUOBJECT on failure. + public native TopMenuObject FindCategory(const char[] name); + + // Set the menu title caching behaviour of the TopMenu. By default titles + // are cached to reduce overhead. If you need dynamic menu titles which + // change each time the menu is displayed to a user, set this to false. + property bool CacheTitles { + public native set(bool value); + } +}; /** * Creates a TopMenu. @@ -140,7 +260,7 @@ functag public TopMenuHandler(Handle:topmenu, * @param handler Handler to use for drawing the root title. * @return A new TopMenu Handle, or INVALID_HANDLE on failure. */ -native Handle:CreateTopMenu(TopMenuHandler:handler); +native TopMenu CreateTopMenu(TopMenuHandler handler); /** * Re-sorts the items in a TopMenu via a configuration file. @@ -169,16 +289,16 @@ native Handle:CreateTopMenu(TopMenuHandler:handler); * @return True on success, false on failure. * @error Invalid TopMenu Handle. */ -native bool:LoadTopMenuConfig(Handle:topmenu, const String:file[], String:error[], maxlength); +native bool LoadTopMenuConfig(Handle topmenu, const char[] file, char[] error, int maxlength); /** - * Adds an object to a TopMenu. + * Adds an topobj to a TopMenu. * * @param topmenu TopMenu Handle. * @param name Object name (MUST be unique). * @param type Object type. - * @param handler Handler for object. - * @param parent Parent object ID, or INVALID_TOPMENUOBJECT for none. + * @param handler Handler for topobj. + * @param parent Parent topobj ID, or INVALID_TOPMENUOBJECT for none. * Items must have a category parent. * Categories must not have a parent. * @param cmdname Command name (for access overrides). @@ -188,14 +308,14 @@ native bool:LoadTopMenuConfig(Handle:topmenu, const String:file[], String:error[ * failure. * @error Invalid TopMenu Handle. */ -native TopMenuObject:AddToTopMenu(Handle:topmenu, - const String:name[], - TopMenuObjectType:type, - TopMenuHandler:handler, - TopMenuObject:parent, - const String:cmdname[]="", - flags=0, - const String:info_string[]=""); +native TopMenuObject AddToTopMenu(Handle topmenu, + const char[] name, + TopMenuObjectType type, + TopMenuHandler handler, + TopMenuObject parent, + const char[] cmdname="", + int flags=0, + const char[] info_string=""); /** * Retrieves the info string of a top menu item. @@ -208,33 +328,33 @@ native TopMenuObject:AddToTopMenu(Handle:topmenu, * null terminator. * @error Invalid TopMenu Handle or TopMenuObject ID. */ -native GetTopMenuInfoString(Handle:topmenu, TopMenuObject:parent, String:buffer[], maxlength); +native int GetTopMenuInfoString(Handle topmenu, TopMenuObject parent, char[] buffer, int maxlength); /** * Retrieves the name string of a top menu item. * * @param topmenu TopMenu Handle. - * @param object TopMenuObject ID. + * @param topobj TopMenuObject ID. * @param buffer Buffer to store info string. * @param maxlength Maximum size of info string. * @return Number of bytes written, not including the * null terminator. * @error Invalid TopMenu Handle or TopMenuObject ID. */ -native GetTopMenuObjName(Handle:topmenu, TopMenuObject:object, String:buffer[], maxlength); +native int GetTopMenuObjName(Handle topmenu, TopMenuObject topobj, char[] buffer, int maxlength); /** - * Removes an object from a TopMenu. + * Removes an topobj from a TopMenu. * - * Plugins' objects are automatically removed all TopMenus when the given + * Plugins' topobjs are automatically removed all TopMenus when the given * plugin unloads or pauses. In the case of unpausing, all items are restored. * * @param topmenu TopMenu Handle. - * @param object TopMenuObject ID. + * @param topobj TopMenuObject ID. * @noreturn * @error Invalid TopMenu Handle. */ -native RemoveFromTopMenu(Handle:topmenu, TopMenuObject:object); +native void RemoveFromTopMenu(Handle topmenu, TopMenuObject topobj); /** * Displays a TopMenu to a client. @@ -245,21 +365,21 @@ native RemoveFromTopMenu(Handle:topmenu, TopMenuObject:object); * @return True on success, false on failure. * @error Invalid TopMenu Handle or client not in game. */ -native bool:DisplayTopMenu(Handle:topmenu, client, TopMenuPosition:position); +native bool DisplayTopMenu(Handle topmenu, int client, TopMenuPosition position); /** * Displays a TopMenu category to a client. * * @param topmenu TopMenu Handle. - * @param category Category object id. + * @param category Category topobj id. * @param client Client index. * @return True on success, false on failure. * @error Invalid TopMenu Handle or client not in game. */ -native bool:DisplayTopMenuCategory(Handle:topmenu, TopMenuObject:category, client); +native bool DisplayTopMenuCategory(Handle topmenu, TopMenuObject category, int client); /** - * Finds a category's object ID in a TopMenu. + * Finds a category's topobj ID in a TopMenu. * * @param topmenu TopMenu Handle. * @param name Object's unique name. @@ -267,18 +387,21 @@ native bool:DisplayTopMenuCategory(Handle:topmenu, TopMenuObject:category, clien * INVALID_TOPMENUOBJECT on failure. * @error Invalid TopMenu Handle. */ -native TopMenuObject:FindTopMenuCategory(Handle:topmenu, const String:name[]); +native TopMenuObject FindTopMenuCategory(Handle topmenu, const char[] name); /** - * Change the menu title caching behaviour of the TopMenu. By default the titles are cached to reduce overhead. - * If you need dynamic menu titles, which can change everytime the menu is displayed to a user, set this to false. + * Change the menu title caching behaviour of the TopMenu. By default the + * titles are cached to reduce overhead. If you need dynamic menu titles, which + * can change everytime the menu is displayed to a user, set this to false. * * @param topmenu TopMenu Handle. - * @param cache_titles Cache the menu titles and don't call the handler with TopMenuAction_DisplayTitle everytime the menu is drawn? + * @param cache_titles Cache the menu titles and don't call the handler with + * TopMenuAction_DisplayTitle everytime the menu is drawn? * @noreturn * @error Invalid TopMenu Handle */ -native SetTopMenuTitleCaching(Handle:topmenu, bool:cache_titles); +native void SetTopMenuTitleCaching(Handle topmenu, bool cache_titles); + /** * Do not edit below this line! diff --git a/env/include/usermessages.inc b/env/include/usermessages.inc index 5a9538d..7d7c9e2 100644 --- a/env/include/usermessages.inc +++ b/env/include/usermessages.inc @@ -70,6 +70,29 @@ enum UserMessageType */ native UserMessageType:GetUserMessageType(); +stock Protobuf UserMessageToProtobuf(Handle msg) +{ + if (GetUserMessageType() != UM_Protobuf) + return null; + return Protobuf:msg; +} + +// Make sure to only call this on writable buffers (eg from StartMessage). +stock BfWrite UserMessageToBfWrite(Handle msg) +{ + if (GetUserMessageType() == UM_Protobuf) + return null; + return BfWrite:msg; +} + +// Make sure to only call this on readable buffers (eg from a message hook). +stock BfWrite UserMessageToBfRead(Handle msg) +{ + if (GetUserMessageType() == UM_Protobuf) + return null; + return BfRead:msg; +} + /** * Returns the ID of a given message, or -1 on failure. * @@ -128,27 +151,48 @@ native Handle:StartMessageEx(UserMsg:msg, clients[], numClients, flags=0); native EndMessage(); /** - * Called when a message is hooked - * - * @param msg_id Message index. - * @param msg Handle to the input bit buffer or protobuf. - * @param players Array containing player indexes. - * @param playersNum Number of players in the array. - * @param reliable True if message is reliable, false otherwise. - * @param init True if message is an initmsg, false otherwise. - * @return Ignored for normal hooks. For intercept hooks, Plugin_Handled - * blocks the message from being sent, and Plugin_Continue - * resumes normal functionality. - */ -functag public Action:MsgHook(UserMsg:msg_id, Handle:msg, const players[], playersNum, bool:reliable, bool:init); + * Hook function types for user messages. +*/ +typeset MsgHook +{ + /** + * Called when a bit buffer based usermessage is hooked + * + * @param msg_id Message index. + * @param msg Handle to the input bit buffer. + * @param players Array containing player indexes. + * @param playersNum Number of players in the array. + * @param reliable True if message is reliable, false otherwise. + * @param init True if message is an initmsg, false otherwise. + * @return Ignored for normal hooks. For intercept hooks, Plugin_Handled + * blocks the message from being sent, and Plugin_Continue + * resumes normal functionality. + */ + function Action (UserMsg msg_id, BfRead msg, const int[] players, int playersNum, bool reliable, bool init); + /** + * Called when a protobuf based usermessage is hooked + * + * @param msg_id Message index. + * @param msg Handle to the input protobuf. + * @param players Array containing player indexes. + * @param playersNum Number of players in the array. + * @param reliable True if message is reliable, false otherwise. + * @param init True if message is an initmsg, false otherwise. + * @return Ignored for normal hooks. For intercept hooks, Plugin_Handled + * blocks the message from being sent, and Plugin_Continue + * resumes normal functionality. + */ + function Action (UserMsg msg_id, Protobuf msg, const int[] players, int playersNum, bool reliable, bool init); +}; /** * Called when a message hook has completed. * * @param msg_id Message index. * @param sent True if message was sent, false if blocked. + * @noreturn */ -functag public MsgPostHook(UserMsg:msg_id, bool:sent); +typedef MsgPostHook = function void (UserMsg msg_id, bool sent); /** * Hooks a user message. @@ -162,7 +206,7 @@ functag public MsgPostHook(UserMsg:msg_id, bool:sent); * @noreturn * @error Invalid message index. */ -native HookUserMessage(UserMsg:msg_id, MsgHook:hook, bool:intercept=false, MsgPostHook:post=MsgPostHook:-1); +native HookUserMessage(UserMsg:msg_id, MsgHook:hook, bool:intercept=false, MsgPostHook:post=INVALID_FUNCTION); /** * Removes one usermessage hook. diff --git a/env/include/version.inc b/env/include/version.inc index b69d5c7..3982558 100644 --- a/env/include/version.inc +++ b/env/include/version.inc @@ -42,8 +42,8 @@ #define SOURCEMOD_V_REV 0 #define SOURCEMOD_V_CSET "0" #define SOURCEMOD_V_MAJOR 1 /**< SourceMod Major version */ -#define SOURCEMOD_V_MINOR 6 /**< SourceMod Minor version */ +#define SOURCEMOD_V_MINOR 7 /**< SourceMod Minor version */ #define SOURCEMOD_V_RELEASE 0 /**< SourceMod Release version */ -#define SOURCEMOD_VERSION "1.6.0-manual" /**< SourceMod version string (major.minor.release-tag) */ +#define SOURCEMOD_VERSION "1.7.0-manual" /**< SourceMod version string (major.minor.release-tag) */ #endif diff --git a/env/include/version_auto.inc b/env/include/version_auto.inc index 16dd8d2..2e88c33 100644 --- a/env/include/version_auto.inc +++ b/env/include/version_auto.inc @@ -5,11 +5,11 @@ #define _auto_version_included #define SOURCEMOD_V_TAG "" -#define SOURCEMOD_V_CSET "95ab81f" +#define SOURCEMOD_V_CSET "fd0aaf9" #define SOURCEMOD_V_MAJOR 1 -#define SOURCEMOD_V_MINOR 6 +#define SOURCEMOD_V_MINOR 7 #define SOURCEMOD_V_RELEASE 0 -#define SOURCEMOD_V_REV 4525 +#define SOURCEMOD_V_REV 5150 -#define SOURCEMOD_VERSION "1.6.0" +#define SOURCEMOD_VERSION "1.7.0" \ No newline at end of file diff --git a/env/linux/bin/spcomp-1.7.0 b/env/linux/bin/spcomp-1.7.0 new file mode 100755 index 0000000..3f519d1 Binary files /dev/null and b/env/linux/bin/spcomp-1.7.0 differ diff --git a/env/win32/bin/spcomp-1.7.0.exe b/env/win32/bin/spcomp-1.7.0.exe new file mode 100644 index 0000000..782925c Binary files /dev/null and b/env/win32/bin/spcomp-1.7.0.exe differ