Initial check in.

This commit is contained in:
mbalex 2008-10-04 22:59:11 +02:00
commit 01f65c9ee5
76 changed files with 19320 additions and 0 deletions

32
Makefile Executable file
View File

@ -0,0 +1,32 @@
SOURCEDIR=src
BUILDDIR=build
SPCOMP=bin/spcomp
vpath %.sp $(SOURCEDIR)
vpath %.inc $(SOURCEDIR)/include
vpath %.smx $(BUILDDIR)
SOURCEFILES=$(SOURCEDIR)/*.sp
OBJECTS=$(patsubst %.sp, %.smx, $(notdir $(wildcard $(SOURCEFILES))))
all: prepare $(OBJECTS)
prepare: prepare_newlines prepare_builddir
prepare_newlines:
@echo "Removing windows newlines"
@find $(SOURCEDIR) -name \*.inc -exec dos2unix -p '{}' \;
@find $(SOURCEDIR) -name \*.sp -exec dos2unix -p '{}' \;
prepare_builddir:
@echo "Creating build directory"
@mkdir -p $(BUILDDIR)
%.smx: %.sp
$(SPCOMP) -i$(SOURCEDIR) -i$(SOURCEDIR)/include -o$(BUILDDIR)/$@ $<
clean:
@echo "Removing build directory"
@rm -fr $(BUILDDIR)

BIN
bin/spcomp Executable file

Binary file not shown.

622
src/include/admin.inc Normal file
View File

@ -0,0 +1,622 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: admin.inc 1409 2007-09-10 23:38:58Z dvander $
*/
#if defined _admin_included
#endinput
#endif
#define _admin_included
/**
* Access levels (flags) for admins.
*/
enum AdminFlag
{
Admin_Reservation = 0, /**< Reserved slot */
Admin_Generic, /**< Generic admin abilities */
Admin_Kick, /**< Kick another user */
Admin_Ban, /**< Ban another user */
Admin_Unban, /**< Unban another user */
Admin_Slay, /**< Slay/kill/damage another user */
Admin_Changemap, /**< Change the map */
Admin_Convars, /**< Change basic convars */
Admin_Config, /**< Change configuration */
Admin_Chat, /**< Special chat privileges */
Admin_Vote, /**< Special vote privileges */
Admin_Password, /**< Set a server password */
Admin_RCON, /**< Use RCON */
Admin_Cheats, /**< Change sv_cheats and use its commands */
Admin_Root, /**< All access by default */
Admin_Custom1, /**< First custom flag type */
Admin_Custom2, /**< Second custom flag type */
Admin_Custom3, /**< Third custom flag type */
Admin_Custom4, /**< Fourth custom flag type */
Admin_Custom5, /**< Fifth custom flag type */
Admin_Custom6, /**< Sixth custom flag type */
/* --- */
};
#define AdminFlags_TOTAL 21 /**< Total number of admin flags */
/**
* @section Bitwise values definitions for admin flags.
*/
#define ADMFLAG_RESERVATION (1<<0) /**< Convenience macro for Admin_Reservation as a FlagBit */
#define ADMFLAG_GENERIC (1<<1) /**< Convenience macro for Admin_Generic as a FlagBit */
#define ADMFLAG_KICK (1<<2) /**< Convenience macro for Admin_Kick as a FlagBit */
#define ADMFLAG_BAN (1<<3) /**< Convenience macro for Admin_Ban as a FlagBit */
#define ADMFLAG_UNBAN (1<<4) /**< Convenience macro for Admin_Unban as a FlagBit */
#define ADMFLAG_SLAY (1<<5) /**< Convenience macro for Admin_Slay as a FlagBit */
#define ADMFLAG_CHANGEMAP (1<<6) /**< Convenience macro for Admin_Changemap as a FlagBit */
#define ADMFLAG_CONVARS (1<<7) /**< Convenience macro for Admin_Convars as a FlagBit */
#define ADMFLAG_CONFIG (1<<8) /**< Convenience macro for Admin_Config as a FlagBit */
#define ADMFLAG_CHAT (1<<9) /**< Convenience macro for Admin_Chat as a FlagBit */
#define ADMFLAG_VOTE (1<<10) /**< Convenience macro for Admin_Vote as a FlagBit */
#define ADMFLAG_PASSWORD (1<<11) /**< Convenience macro for Admin_Password as a FlagBit */
#define ADMFLAG_RCON (1<<12) /**< Convenience macro for Admin_RCON as a FlagBit */
#define ADMFLAG_CHEATS (1<<13) /**< Convenience macro for Admin_Cheats as a FlagBit */
#define ADMFLAG_ROOT (1<<14) /**< Convenience macro for Admin_Root as a FlagBit */
#define ADMFLAG_CUSTOM1 (1<<15) /**< Convenience macro for Admin_Custom1 as a FlagBit */
#define ADMFLAG_CUSTOM2 (1<<16) /**< Convenience macro for Admin_Custom2 as a FlagBit */
#define ADMFLAG_CUSTOM3 (1<<17) /**< Convenience macro for Admin_Custom3 as a FlagBit */
#define ADMFLAG_CUSTOM4 (1<<18) /**< Convenience macro for Admin_Custom4 as a FlagBit */
#define ADMFLAG_CUSTOM5 (1<<19) /**< Convenience macro for Admin_Custom5 as a FlagBit */
#define ADMFLAG_CUSTOM6 (1<<20) /**< Convenience macro for Admin_Custom6 as a FlagBit */
/**
* @endsection
*/
/**
* @section Hardcoded authentication methods
*/
#define AUTHMETHOD_STEAM "steam" /**< SteamID based authentication */
#define AUTHMETHOD_IP "ip" /**< IP based authentication */
#define AUTHMETHOD_NAME "name" /**< Name based authentication */
/**
* @endsection
*/
/**
* Access override types.
*/
enum OverrideType
{
Override_Command = 1, /**< Command */
Override_CommandGroup, /**< Command group */
};
/**
* Access override rules.
*/
enum OverrideRule
{
Command_Deny = 0,
Command_Allow = 1,
};
/**
* DEPRECATED, do not use.
*/
enum ImmunityType
{
Immunity_Default = 1, /**< Deprecated. */
Immunity_Global, /**< Deprecated. */
};
/**
* Identifies a unique entry in the group permissions cache. These are not Handles.
*/
enum GroupId
{
INVALID_GROUP_ID = -1, /**< An invalid/nonexistant group */
};
/**
* Identifies a unique entry in the admin permissions cache. These are not Handles.
*/
enum AdminId
{
INVALID_ADMIN_ID = -1, /**< An invalid/nonexistant admin */
};
/**
* Methods of computing access permissions.
*/
enum AdmAccessMode
{
Access_Real, /**< Access the user has inherently */
Access_Effective, /**< Access the user has from their groups */
};
/**
* Represents the various cache regions.
*/
enum AdminCachePart
{
AdminCache_Overrides = 0, /**< Global overrides */
AdminCache_Groups = 1, /**< All groups (automatically invalidates admins too) */
AdminCache_Admins = 2, /**< All admins */
};
/**
* Called when part of the cache which needs to be rebuilt.
*
* @param part Part of the admin cache to rebuild.
*/
forward OnRebuildAdminCache(AdminCachePart:part);
/**
* Tells the admin system to dump a portion of the cache.
*
* @param part Part of the cache to dump. Specifying groups also dumps admins.
* @param rebuild If true, the rebuild forwards will fire.
* @noreturn
*/
native DumpAdminCache(AdminCachePart:part, bool:rebuild);
/**
* Adds a global command flag override. Any command registered with this name
* will assume the new flag. This is applied retroactively as well.
*
* @param cmd String containing command name (case sensitive).
* @param type Override type (specific command or group).
* @param flags New admin flag.
* @noreturn
*/
native AddCommandOverride(const String:cmd[], OverrideType:type, flags);
/**
* Returns a command override.
*
* @param cmd String containing command name (case sensitive).
* @param type Override type (specific command or group).
* @param flags By-reference cell to store the flag (undefined if not found).
* @return True if there is an override, false otherwise.
*/
native bool:GetCommandOverride(const String:cmd[], OverrideType:type, &flags);
/**
* Unsets a command override.
*
* @param cmd String containing command name (case sensitive).
* @param type Override type (specific command or group).
* @noreturn
*/
native UnsetCommandOverride(const String:cmd[], OverrideType:type);
/**
* Adds a new group. Name must be unique.
*
* @param group_name String containing the group name.
* @return A new group id, INVALID_GROUP_ID if it already exists.
*/
native GroupId:CreateAdmGroup(const String:group_name[]);
/**
* Finds a group by name.
*
* @param group_name String containing the group name.
* @return A group id, or INVALID_GROUP_ID if not found.
*/
native GroupId:FindAdmGroup(const String:group_name[]);
/**
* Adds or removes a flag from a group's flag set.
* @note These are called "add flags" because they add to a user's flags.
*
* @param id Group id.
* @param flag Admin flag to toggle.
* @param enabled True to set the flag, false to unset/disable.
* @noreturn
*/
native SetAdmGroupAddFlag(GroupId:id, AdminFlag:flag, bool:enabled);
/**
* Gets the set value of an add flag on a group's flag set.
* @note These are called "add flags" because they add to a user's flags.
*
* @param id Group id.
* @param flag Admin flag to retrieve.
* @return True if enabled, false otherwise,
*/
native bool:GetAdmGroupAddFlag(GroupId:id, AdminFlag:flag);
/**
* Returns the flag set that is added to a user from their group.
* @note These are called "add flags" because they add to a user's flags.
*
* @param id GroupId of the group.
* @return Bitstring containing the flags enabled.
*/
native GetAdmGroupAddFlags(GroupId:id);
/**
* @deprecated Functionality removed.
*/
#pragma deprecated Use SetAdmGroupImmunityLevel() instead.
native SetAdmGroupImmunity(GroupId:id, ImmunityType:type, bool:enabled);
/**
* @deprecated Functionality removed.
*/
#pragma deprecated Use GetAdmGroupImmunityLevel() instead.
native bool:GetAdmGroupImmunity(GroupId:id, ImmunityType:type);
/**
* Adds immunity to a specific group.
*
* @param id Group id.
* @param other_id Group id to receive immunity to.
* @noreturn
*/
native SetAdmGroupImmuneFrom(GroupId:id, GroupId:other_id);
/**
* Returns the number of specific group immunities.
*
* @param id Group id.
* @return Number of group immunities.
*/
native GetAdmGroupImmuneCount(GroupId:id);
/**
* Returns a group that this group is immune to given an index.
*
* @param id Group id.
* @param number Index from 0 to N-1, from GetAdmGroupImmuneCount().
* @return GroupId that this group is immune to, or INVALID_GROUP_ID on failure.
*/
native GroupId:GetAdmGroupImmuneFrom(GroupId:id, number);
/**
* Adds a group-specific override type.
*
* @param id Group id.
* @param name String containing command name (case sensitive).
* @param type Override type (specific command or group).
* @param rule Override allow/deny setting.
* @noreturn
*/
native AddAdmGroupCmdOverride(GroupId:id, const String:name[], OverrideType:type, OverrideRule:rule);
/**
* Retrieves a group-specific command override.
*
* @param id Group id.
* @param name String containing command name (case sensitive).
* @param type Override type (specific command or group).
* @param rule Optional pointer to store allow/deny setting.
* @return True if an override exists, false otherwise.
*/
native bool:GetAdmGroupCmdOverride(GroupId:id, const String:name[], OverrideType:type, &OverrideRule:rule);
/**
* Registers an authentication identity type. You normally never need to call this except for
* very specific systems.
*
* @param codename Codename to use for your authentication type.
* @noreturn
*/
native RegisterAuthIdentType(const String:name[]);
/**
* Creates a new admin entry in the permissions cache.
*
* @param name Name for this entry (does not have to be unique).
* Specify an empty string for an anonymous admin.
*/
native AdminId:CreateAdmin(const String:name[]="");
/**
* Retrieves an admin's user name as made with CreateAdmin().
*
* @note This function can return UTF-8 strings, and will safely chop UTF-8 strings.
*
* @param id AdminId of the admin.
* @param name String buffer to store name.
* @param maxlength Maximum size of string buffer.
* @return Number of bytes written.
*/
native GetAdminUsername(AdminId:id, const String:name[], maxlength);
/**
* Binds an admin to an identity for fast lookup later on. The bind must be unique.
*
* @param id AdminId of the admin.
* @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.
*/
native bool:BindAdminIdentity(AdminId:id, const String:auth[], const String:ident[]);
/**
* Sets whether or not a flag is enabled on an admin.
*
* @param id AdminId index of the admin.
* @param flag Admin flag to use.
* @param enabled True to enable, false to disable.
* @noreturn
*/
native SetAdminFlag(AdminId:id, AdminFlag:flag, bool:enabled);
/**
* Returns whether or not a flag is enabled on an admin.
*
* @param id AdminId index of the admin.
* @param flag Admin flag to use.
* @param mode Access mode to check.
* @return True if enabled, false otherwise.
*/
native bool:GetAdminFlag(AdminId:id, AdminFlag:flag, AdmAccessMode:mode=Access_Effective);
/**
* Returns the bitstring of access flags on an admin.
*
* @param id AdminId index of the admin.
* @param mode Access mode to use.
* @return A bitstring containing which flags are enabled.
*/
native GetAdminFlags(AdminId:id, AdmAccessMode:mode);
/**
* Adds a group to an admin's inherited group list. Any flags the group has
* will be added to the admin's effective flags.
*
* @param id AdminId index of the admin.
* @param gid GroupId index of the group.
* @return True on success, false on invalid input or duplicate membership.
*/
native bool:AdminInheritGroup(AdminId:id, GroupId:gid);
/**
* Returns the number of groups this admin is a member of.
*
* @param id AdminId index of the admin.
* @return Number of groups this admin is a member of.
*/
native GetAdminGroupCount(AdminId:id);
/**
* Returns group information from an admin.
*
* @param id AdminId index of the admin.
* @param index Group number to retrieve, from 0 to N-1, where N
* is the value of GetAdminGroupCount(id).
* @param name Buffer to store the group's name.
* Note: This will safely chop UTF-8 strings.
* @param maxlength Maximum size of the output name buffer.
* @return A GroupId index and a name pointer, or
* INVALID_GROUP_ID and NULL if an error occurred.
*/
native GroupId:GetAdminGroup(AdminId:id, index, const String:name[], maxlength);
/**
* Sets a password on an admin.
*
* @param id AdminId index of the admin.
* @param passwd String containing the password.
* @noreturn
*/
native SetAdminPassword(AdminId:id, const String:password[]);
/**
* Gets an admin's password.
*
* @param id AdminId index of the admin.
* @param name Optional buffer to store the admin's password.
* @param maxlength Maximum size of the output name buffer.
* Note: This will safely chop UTF-8 strings.
* @return True if there was a password set, false otherwise.
*/
native bool:GetAdminPassword(AdminId:id, const String:buffer[]="", maxlength=0);
/**
* Attempts to find an admin by an auth method and an identity.
*
* @param auth Auth method to try.
* @param identity Identity string to look up.
* @return An AdminId index if found, INVALID_ADMIN_ID otherwise.
*/
native AdminId:FindAdminByIdentity(const String:auth[], const String:identity[]);
/**
* Removes an admin entry from the cache.
*
* @note This will remove any bindings to a specific user.
*
* @param id AdminId index to remove/invalidate.
* @return True on success, false otherwise.
*/
native bool:RemoveAdmin(AdminId:id);
/**
* Converts a flag bit string to a bit array.
*
* @param bits Bit string containing the flags.
* @param array Array to write the flags to. Enabled flags will be 'true'.
* @param maxSize Maximum number of flags the array can store.
* @return Number of flags written.
*/
native FlagBitsToBitArray(bits, bool:array[], maxSize);
/**
* Converts a flag array to a bit string.
*
* @param array Array containing true or false for each AdminFlag.
* @param maxSize Maximum size of the flag array.
* @return A bit string composed of the array bits.
*/
native FlagBitArrayToBits(const bool:array[], maxSize);
/**
* Converts an array of flags to bits.
*
* @param array Array containing flags that are enabled.
* @param numFlags Number of flags in the array.
* @return A bit string composed of the array flags.
*/
native FlagArrayToBits(const AdminFlag:array[], numFlags);
/**
* Converts a bit string to an array of flags.
*
* @param bits Bit string containing the flags.
* @param array Output array to write flags.
* @param maxSize Maximum size of the flag array.
* @return Number of flags written.
*/
native FlagBitsToArray(bits, AdminFlag:array[], maxSize);
/**
* Finds a flag by its string name.
*
* @param name Flag name (like "kick"), case sensitive.
* @param flag Variable to store flag in.
* @return True on success, false if not found.
*/
native bool:FindFlagByName(const String:name[], &AdminFlag:flag);
/**
* Finds a flag by a given character.
*
* @param c Flag ASCII character/token.
* @param flag Variable to store flag in.
* @return True on success, false if not found.
*/
native bool:FindFlagByChar(c, &AdminFlag:flag);
/**
* Converts a string of flag characters to a bit string.
*
* @param flags Flag ASCII string.
* @param numchars Optional variable to store the number of bytes read.
* @return Bit string of ADMFLAG values.
*/
native ReadFlagString(const String:flags[], &numchars=0);
/**
* Tests whether one admin can target another.
*
* The hueristics for this check are as follows:
* 0. If the targeting AdminId is INVALID_ADMIN_ID, targeting fails.
* 1. If the targeted AdminId is INVALID_ADMIN_ID, targeting succeeds.
* 2. If the targeted AdminId is the same as the targeting AdminId,
* (self) targeting succeeds.
* 3. If the targeting admin is root, targeting succeeds.
* 4. If the targeted admin has access higher (as interpreted by
* (sm_immunity_mode) than the targeting admin, then targeting fails.
* 5. If the targeted admin has specific immunity from the
* targeting admin via group immunities, targeting fails.
* 6. Targeting succeeds.
*
* @param admin Admin doing the targetting (may be INVALID_ADMIN_ID).
* @param target Target admin (may be INVALID_ADMIN_ID).
* @return True if targetable, false if immune.
*/
native CanAdminTarget(AdminId:admin, AdminId:target);
/**
* Creates an admin auth method. This does not need to be called more than once
* per method, ever.
*
* @param method Name of the authentication method.
* @return True on success, false on failure.
*/
native bool:CreateAuthMethod(const String:method[]);
/**
* Sets a group's immunity level.
*
* @param gid Group Id.
* @param level Immunity level value.
* @return Old immunity level value.
*/
native SetAdmGroupImmunityLevel(GroupId:gid, level);
/**
* Gets a group's immunity level (defaults to 0).
*
* @param gid Group Id.
* @return Immunity level value.
*/
native GetAdmGroupImmunityLevel(GroupId:gid);
/**
* Sets an admin's immunity level.
*
* @param id Admin Id.
* @param level Immunity level value.
* @return Old immunity level value.
*/
native SetAdminImmunityLevel(AdminId:id, level);
/**
* Gets an admin's immunity level.
*
* @param id Admin Id.
* @return Immunity level value.
*/
native GetAdminImmunityLevel(AdminId:id);
/**
* Converts a flag to its single bit.
*
* @param flag Flag to convert.
* @return Bit representation of the flag.
*/
stock FlagToBit(AdminFlag:flag)
{
return (1<<_:flag);
}
/**
* Converts a bit to an AdminFlag.
*
* @param bit Bit to convert.
* @param flag Stores the converted flag by reference.
* @return True on success, false otherwise.
*/
stock bool:BitToFlag(bit, &AdminFlag:flag)
{
new AdminFlag:array[1];
if (FlagBitsToArray(bit, array, 1))
{
flag = array[0];
return true;
}
return false;
}

153
src/include/adminmenu.inc Normal file
View File

@ -0,0 +1,153 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: adminmenu.inc 1838 2008-01-04 16:05:26Z dvander $
*/
#if defined _adminmenu_included
#endinput
#endif
#define _adminmenu_included
/* Decide whether topmenus should be required */
#if !defined REQUIRE_PLUGIN
#if defined REQUIRE_EXTENSIONS
#define TEMP_REQUIRE_EXTENSIONS
#undef REQUIRE_EXTENSIONS
#endif
#include <topmenus>
/* Restore old REQUIRE_EXTENSIONS value if necessary */
#if defined TEMP_REQUIRE_EXTENSIONS
#define REQUIRE_EXTENSIONS
#undef TEMP_REQUIRE_EXTENSIONS
#endif
/** Category for player commands. */
#define ADMINMENU_PLAYERCOMMANDS "PlayerCommands"
/** Category for server commands. */
#define ADMINMENU_SERVERCOMMANDS "ServerCommands"
/** Category for voting commands. */
#define ADMINMENU_VOTINGCOMMANDS "VotingCommands"
/**
* Called when the admin menu is created and 3rd party plugins can grab
* the Handle or add categories.
*
* @param topmenu Handle to the admin menu's TopMenu.
* @noreturn
*/
forward OnAdminMenuCreated(Handle:topmenu);
/**
* Called when the admin menu is ready to have items added.
*
* @param topmenu Handle to the admin menu's TopMenu.
* @noreturn
*/
forward OnAdminMenuReady(Handle:topmenu);
/**
* Retrieves the Handle to the admin top menu.
*
* @return Handle to the admin menu's TopMenu,
* or INVALID_HANDLE if not created yet.
*/
native Handle:GetAdminTopMenu();
/**
* Adds targets to an admin menu.
*
* Each client is displayed as: name (userid)
* Each item contains the userid as a string for its info.
*
* @param menu Menu Handle.
* @param source_client Source client, or 0 to ignore immunity.
* @param in_game_only True to only select in-game players.
* @param alive_only True to only select alive players.
* @return Number of clients added.
*/
native AddTargetsToMenu(Handle:menu,
source_client,
bool:in_game_only=true,
bool:alive_only=false);
/**
* Adds targets to an admin menu.
*
* Each client is displayed as: name (userid)
* Each item contains the userid as a string for its info.
*
* @param menu Menu Handle.
* @param source_client Source client, or 0 to ignore immunity.
* @param flags COMMAND_FILTER flags from commandfilters.inc.
* @return Number of clients added.
*/
native AddTargetsToMenu2(Handle:menu, source_client, flags);
/**
* Re-displays the admin menu to a client after selecting an item.
* Auto-aborts if the Handle is invalid.
*
* @param topmenu TopMenu Handle.
* @param client Client index.
* @return True on success, false on failure.
*/
stock bool:RedisplayAdminMenu(Handle:topmenu, client)
{
if (topmenu == INVALID_HANDLE)
{
return false;
}
return DisplayTopMenu(topmenu, client, TopMenuPosition_LastCategory);
}
/* DO NOT EDIT BELOW THIS LINE */
public SharedPlugin:__pl_adminmenu =
{
name = "adminmenu",
file = "adminmenu.smx",
#if defined REQUIRE_PLUGIN
required = 1,
#else
required = 0,
#endif
};
#if !defined REQUIRE_PLUGIN
public __pl_adminmenu_SetNTVOptional()
{
MarkNativeAsOptional("GetAdminTopMenu");
MarkNativeAsOptional("AddTargetsToMenu");
MarkNativeAsOptional("AddTargetsToMenu2");
}
#endif

39
src/include/adt.inc Normal file
View File

@ -0,0 +1,39 @@
/**
* 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: adt.inc 2093 2008-04-24 10:25:27Z damagedsoul $
*/
#if defined _adt_included
#endinput
#endif
#define _adt_included
#include <adt_array>
#include <adt_trie>

283
src/include/adt_array.inc Normal file
View File

@ -0,0 +1,283 @@
/**
* 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: adt_array.inc 2093 2008-04-24 10:25:27Z damagedsoul $
*/
#if defined _adt_array_included
#endinput
#endif
#define _adt_array_included
/**
* Given a maximum string size (including the null terminator),
* returns the number of cells required to fit that string.
*
* @param size Number of bytes.
* @return Minimum number of cells required to fit the byte count.
*/
stock ByteCountToCells(size)
{
if (!size)
{
return 1;
}
return (size + 3) / 4;
}
/**
* 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.
*/
native Handle:CreateArray(blocksize=1, 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);
/**
* 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. You MUST close it.
*
* @param array Array handle to be cloned
* @return New handle to the cloned array object
* @error Invalid Handle
*/
native Handle:CloneArray(Handle:array);
/**
* Resizes an array. If the size is smaller than the current size,
* the array is truncated.
*
* @param array Array Handle.
* @param newsize New size.
* @noreturn
* @error Invalid Handle or out of memory.
*/
native bool:ResizeArray(Handle:array, newsize);
/**
* Returns the array size.
*
* @param array Array Handle.
* @return Number of elements in the array.
* @error Invalid Handle.
*/
native GetArraySize(Handle:array);
/**
* 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 array Array Handle.
* @param value Value to push.
* @return Index of the new entry.
* @error Invalid Handle or out of memory.
*/
native PushArrayCell(Handle:array, any:value);
/**
* Pushes a string onto the end of an array, truncating it
* if it is too big.
*
* @param array Array Handle.
* @param value String to push.
* @return Index of the new entry.
* @error Invalid Handle or out of memory.
*/
native PushArrayString(Handle:array, const String: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 array Array 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.
* @return Index of the new entry.
* @error Invalid Handle or out of memory.
*/
native PushArrayArray(Handle:array, const any:values[], size=-1);
/**
* Retrieves a cell value from an array.
*
* @param array Array Handle.
* @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 Handle, invalid index, or invalid block.
*/
native any:GetArrayCell(Handle:array, index, block=0, bool:asChar=false);
/**
* Retrieves a string value from an array.
*
* @param array Array Handle.
* @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 Handle or invalid index.
*/
native GetArrayString(Handle:array, index, String:buffer[], maxlength);
/**
* Retrieves an array of cells from an array.
*
* @param array Array Handle.
* @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 Handle or invalid index.
*/
native GetArrayArray(Handle:array, index, any:buffer[], size=-1);
/**
* Sets a cell value in an array.
*
* @param array Array Handle.
* @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.
* @noreturn
* @error Invalid Handle, invalid index, or invalid block.
*/
native any:SetArrayCell(Handle:array, index, any:value, block=0, bool:asChar=false);
/**
* Sets a string value in an array.
*
* @param array Array Handle.
* @param index Index in the array.
* @param value String value to set.
* @return Number of characters copied.
* @error Invalid Handle or invalid index.
*/
native SetArrayString(Handle:array, index, const String:buffer[]);
/**
* Sets an array of cells in an array.
*
* @param array Array Handle.
* @param index Index in the array.
* @param buffer 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 Handle or invalid index.
*/
native SetArrayArray(Handle:array, index, const any:values[], 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 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);
/**
* 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 array Array Handle.
* @param index Index in the array to remove at.
* @noreturn
* @error Invalid Handle or invalid index.
*/
native RemoveFromArray(Handle:array, index);
/**
* Swaps two items in the array.
*
* @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);
/**
* Returns the index for the first occurance of the provided string. If the string
* cannot be located, -1 will be returned.
*
* @param array Array Handle.
* @param item String to search for
* @return Array index, or -1 on failure
* @error Invalid Handle
*/
native FindStringInArray(Handle:array, const String:item[]);
/**
* Returns the index for the first occurance of the provided value. If the value
* cannot be located, -1 will be returned.
*
* @param array Array Handle.
* @param item Value to search for
* @return Array index, or -1 on failure
* @error Invalid Handle
*/
native FindValueInArray(Handle:array, any:item);

158
src/include/adt_trie.inc Normal file
View File

@ -0,0 +1,158 @@
/**
* 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: adt_trie.inc 2093 2008-04-24 10:25:27Z damagedsoul $
*/
#if defined _adt_trie_included
#endinput
#endif
#define _adt_trie_included
/**
* Creates a Trie structure. A trie is a data storage object that maps any value to a
* string of text. It features very fast lookup and deletion, but grows very slow for
* insertion once tens of thousands of items are added.
*
* Keys in Tries are unique. That is, each key may only have one value. Unlike arrays,
* Tries cannot be iterated right now. Since the contents are known to be unique, to
* work around this, you can use ADT Arrays to store a list of keys known to be in a
* Trie.
*
* @return New Trie Handle, which must be freed via CloseHandle().
*/
native Handle:CreateTrie();
/**
* Sets a value in a Trie, either inserting a new entry or replacing an old one.
*
* @param trie Trie Handle.
* @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.
* @error Invalid Handle.
*/
native bool:SetTrieValue(Handle:trie, const String:key[], any:value, bool:replace=true);
/**
* Sets an array value in a Trie, either inserting a new entry or replacing an old one.
*
* @param trie Trie Handle.
* @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.
* @error Invalid Handle.
*/
native bool:SetTrieArray(Handle:trie, const String:key[], const any:array[], num_items, bool:replace=true);
/**
* Sets a string value in a Trie, either inserting a new entry or replacing an old one.
*
* @param trie Trie Handle.
* @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.
* @error Invalid Handle.
*/
native bool:SetTrieString(Handle:trie, const String:key[], const String:value[], bool:replace=true);
/**
* Retrieves a value in a Trie.
*
* @param trie Trie Handle.
* @param key Key string.
* @param val 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).
* @error Invalid Handle.
*/
native bool:GetTrieValue(Handle:trie, const String:key[], &any:value);
/**
* Retrieves an array in a Trie.
*
* @param trie Trie 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).
* @error Invalid Handle.
*/
native bool:GetTrieArray(Handle:trie, const String:key[], any:array[], max_size, &size=0);
/**
* Retrieves a string in a Trie.
*
* @param trie Trie Handle.
* @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).
* @error Invalid Handle.
*/
native bool:GetTrieString(Handle:trie, const String:key[], String:value[], max_size, &size=0);
/**
* Removes a key entry from a Trie.
*
* @param trie Trie Handle.
* @param key Key string.
* @return True on success, false if the value was never set.
* @error Invalid Handle.
*/
native RemoveFromTrie(Handle:trie, const String:key[]);
/**
* Clears all entries from a Trie.
*
* @param trie Trie Handle.
* @error Invalid Handle.
*/
native ClearTrie(Handle:trie);
/**
* Retrieves the number of elements in a trie.
*
* Note that trie items are not enumerable/iteratable. If you need to
* retrieve the elements in a trie, store its keys in an ADT Array.
*
* @param trie Trie Handle.
* @return Number of elements in the trie.
* @error Invalid Handle.
*/
native GetTrieSize(Handle:trie);

157
src/include/banning.inc Normal file
View File

@ -0,0 +1,157 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: banning.inc 1456 2007-09-21 14:56:18Z dvander $
*/
#if defined _banning_included
#endinput
#endif
#define _banning_included
#define BANFLAG_AUTO (1<<0) /**< Auto-detects whether to ban by steamid or IP */
#define BANFLAG_IP (1<<1) /**< Always ban by IP address */
#define BANFLAG_AUTHID (1<<2) /**< Always ban by authstring (for BanIdentity) if possible */
#define BANFLAG_NOKICK (1<<3) /**< Does not kick the client */
/**
* Called for calls to BanClient() with a non-empty command.
*
* @param client Client being banned.
* @param time Time the client is being banned for (0 = permanent).
* @param flags One if AUTHID or IP will be enabled. If AUTO is also
* enabled, it means Core autodetected which to use.
* @param reason Reason passed via BanClient().
* @param kick_message Kick message passed via BanClient().
* @param command Command string to identify the ban source.
* @param source Source value passed via BanClient().
* @return Plugin_Handled to block the actual server banning.
* Kicking will still occur.
*/
forward Action:OnBanClient(client,
time,
flags,
const String:reason[],
const String:kick_message[],
const String:command[],
any:source);
/**
* Called for calls to BanIdentity() with a non-empty command.
*
* @param identity Identity string being banned (authstring or ip).
* @param time Time the client is being banned for (0 = permanent).
* @param flags Ban flags (only IP or AUTHID are valid here).
* @param reason Reason passed via BanIdentity().
* @param command Command string to identify the ban source.
* @param source Source value passed via BanIdentity().
* @return Plugin_Handled to block the actual server banning.
*/
forward Action:OnBanIdentity(const String:identity[],
time,
flags,
const String:reason[],
const String:command[],
any:source);
/**
* Called for calls to RemoveBan() with a non-empty command.
*
* @param identity Identity string being banned (authstring or ip).
* @param flags Ban flags (only IP or AUTHID are valid here).
* @param command Command string to identify the ban source.
* @param source Source value passed via BanIdentity().
* @return Plugin_Handled to block the actual server banning.
*/
forward Action:OnRemoveBan(const String:identity[],
flags,
const String:command[],
any:source);
/**
* Bans a client.
*
* @param client Client being banned.
* @param time Time (in minutes) to ban (0 = permanent).
* @param flags Flags for controlling the ban mechanism. If AUTHID
* is set and no AUTHID is available, the ban will fail
* unless AUTO is also flagged.
* @param reason Reason to ban the client for.
* @param kick_message Message to display to the user when kicking.
* @param command Command string to identify the source. If this is left
* empty, then the OnBanClient forward will not be called.
* @param source A source value that could be interpreted as a player
* index of any sort (not actually checked by Core).
* @return True on success, false on failure.
* @error Invalid client index or client not in game.
*/
native bool:BanClient(client,
time,
flags,
const String:reason[],
const String:kick_message[]="",
const String:command[]="",
any:source=0);
/**
* Bans an identity (either an IP address or auth string).
*
* @param identity String to ban (ip or authstring).
* @param time Time to ban for (0 = permanent).
* @param flags Flags (only IP and AUTHID are valid flags here).
* @param reason Ban reason string.
* @param command Command string to identify the source. If this is left
* empty, then the OnBanIdentity forward will not be called.
* @param source A source value that could be interpreted as a player
* index of any sort (not actually checked by Core).
* @return True on success, false on failure.
*/
native bool:BanIdentity(const String:identity[],
time,
flags,
const String:reason[],
const String:command[]="",
any:source=0);
/**
* Removes a ban that was written to the server (either in memory or on disk).
*
* @param identity String to unban (ip or authstring).
* @param flags Flags (only IP and AUTHID are valid flags here).
* @param command Command strnig to identify the source. If this is left
* empty, then OnRemoveBan will not be called.
* @param source A source value that could be interpreted as a player
* index of any sort (not actually checked by Core).
* @return True on success, false on failure.
*/
native bool:RemoveBan(const String:identity[],
flags,
const String:command[]="",
any:source=0);

325
src/include/bitbuffer.inc Normal file
View File

@ -0,0 +1,325 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: bitbuffer.inc 2038 2008-04-11 17:22:19Z damagedsoul $
*/
#if defined _bitbuffer_included
#endinput
#endif
#define _bitbuffer_included
/**
* 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);
/**
* 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);
/**
* 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);
/**
* 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);
/**
* 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);
/**
* 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);
/**
* 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);
/**
* 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[]);
/**
* Writes an entity to a writable bitbuffer (bf_write).
* @note This is a wrapper around BfWriteShort().
*
* @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);
/**
* Writes a bit angle to a writable bitbuffer (bf_write).
*
* @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);
/**
* 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);
/**
* 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]);
/**
* Writes a 3D normal vector to a writable bitbuffer (bf_write).
*
* @param bf bf_write handle to write to.
* @param vec Vector to write.
* @noreturn
* @error Invalid or incorrect Handle.
*/
native 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]);
/**
* Reads a single bit from a readable bitbuffer (bf_read).
*
* @param bf bf_read handle to read from.
* @return Bit value read.
* @error Invalid or incorrect Handle.
*/
native bool:BfReadBool(Handle:bf);
/**
* Reads a byte from a readable bitbuffer (bf_read).
*
* @param bf bf_read handle to read from.
* @return Byte value read (read as 8bit).
* @error Invalid or incorrect Handle.
*/
native BfReadByte(Handle:bf);
/**
* Reads a character from a readable bitbuffer (bf_read).
*
* @param bf bf_read handle to read from.
* @return Character value read.
* @error Invalid or incorrect Handle.
*/
native BfReadChar(Handle:bf);
/**
* 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).
* @error Invalid or incorrect Handle.
*/
native BfReadShort(Handle:bf);
/**
* 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).
* @error Invalid or incorrect Handle.
*/
native BfReadWord(Handle:bf);
/**
* Reads a normal integer to a readable bitbuffer (bf_read).
*
* @param bf bf_read handle to read from.
* @return Integer value read (read as 32bit).
* @error Invalid or incorrect Handle.
*/
native BfReadNum(Handle:bf);
/**
* Reads a floating point number from a readable bitbuffer (bf_read).
*
* @param bf bf_read handle to read from.
* @return Floating point value read.
* @error Invalid or incorrect Handle.
*/
native Float:BfReadFloat(Handle:bf);
/**
* Reads a string from a readable bitbuffer (bf_read).
*
* @param bf bf_read handle to read from.
* @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.
* @error Invalid or incorrect Handle.
*/
native BfReadString(Handle:bf, String:buffer[], maxlength, bool:line=false);
/**
* Reads an entity from a readable bitbuffer (bf_read).
* @note This is a wrapper around BfReadShort().
*
* @param bf bf_read handle to read from.
* @return Entity index read.
* @error Invalid or incorrect Handle.
*/
native BfReadEntity(Handle:bf);
/**
* Reads a bit angle from a readable bitbuffer (bf_read).
*
* @param bf bf_read handle to read from.
* @param numBits Optional number of bits to use.
* @return Angle read.
* @error Invalid or incorrect Handle.
*/
native Float:BfReadAngle(Handle:bf, numBits=8);
/**
* Reads a coordinate from a readable bitbuffer (bf_read).
*
* @param bf bf_read handle to read from.
* @return Coordinate read.
* @error Invalid or incorrect Handle.
*/
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]);
/**
* 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]);
/**
* 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]);
/**
* Returns the number of bytes left in a readable bitbuffer (bf_read).
*
* @param bf bf_read handle to read from.
* @return Number of bytes left unread.
* @error Invalid or incorrect Handle.
*/
native BfGetNumBytesLeft(Handle:bf);

684
src/include/clients.inc Normal file
View File

@ -0,0 +1,684 @@
/**
* 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: clients.inc 2362 2008-07-06 00:44:56Z dvander $
*/
#if defined _clients_included
#endinput
#endif
#define _clients_included
/**
* Network flow directions.
*/
enum NetFlow
{
NetFlow_Outgoing = 0, /**< Outgoing traffic */
NetFlow_Incoming, /**< Incoming traffic */
NetFlow_Both, /**< Both values added together */
};
#define MAXPLAYERS 64 /**< Maximum number of players that can be in server */
#define MAX_NAME_LENGTH 32 /**< Maximum buffer required to store a client name */
/**
* Called on client connection.
*
* @param client Client index.
* @param rejectmsg Buffer to store the rejection message when the connection is refused.
* @param maxlen Maximum number of characters for rejection buffer.
* @return True to validate client's connection, false to refuse it.
*/
forward bool:OnClientConnect(client, String:rejectmsg[], maxlen);
/**
* Called when a client is entering the game.
*
* Whether a client has a steamid is undefined until OnClientAuthorized
* is called, which may occur either before or after OnClientPutInServer.
* Similarly, use OnClientPostAdminCheck() if you need to verify whether
* connecting players are admins.
*
* GetClientCount() will include clients as they are passed through this
* function, as clients are already in game at this point.
*
* @param client Client index.
* @noreturn
*/
forward OnClientPutInServer(client);
/**
* Called when a client is disconnecting from the server.
*
* @param client Client index.
* @noreturn
*/
forward OnClientDisconnect(client);
/**
* Called when a client is disconnected from the server.
*
* @param client Client index.
* @noreturn
*/
forward OnClientDisconnect_Post(client);
/**
* Called when a client is sending a command.
*
* @param client Client index.
* @param args Number of arguments.
* @noreturn
*/
forward Action:OnClientCommand(client, args);
/**
* Called whenever the client's settings are changed.
*
* @param client Client index.
* @noreturn
*/
forward OnClientSettingsChanged(client);
/**
* Called when a client receives a Steam ID. The state of a client's
* authorization via Steam or as an admin is not guaranteed here.
* Use OnClientAuthorized() or OnClientPostAdminCheck() for those,
* respectively.
*
* This is called by bots, but the ID will be "BOT".
*
* @param client Client index.
* @param auth Client auth string.
* @noreturn
*/
forward OnClientAuthorized(client, const String:auth[]);
/**
* Called once a client is authorized and fully in-game, but
* before admin checks are done. This can be used to override
* the default admin checks for a client. You should only use
* this for overriding; use OnClientPostAdminCheck() instead
* if you want notification.
*
* Note: If handled/blocked, PostAdminCheck must be signalled
* manually via NotifyPostAdminCheck().
*
* This callback is gauranteed to occur on all clients, and always
* after each OnClientPutInServer() call.
*
* @param client Client index.
* @return Plugin_Handled to block admin checks.
*/
forward Action:OnClientPreAdminCheck(client);
/**
* Called directly before OnClientPostAdminCheck() as a method to
* alter administrative permissions before plugins perform final
* post-connect operations.
*
* In general, do not use this function unless you are specifically
* attempting to change access permissions. Use OnClientPostAdminCheck()
* instead if you simply want to perform post-connect authorization
* routines.
*
* See OnClientPostAdminCheck() for more information.
*
* @param client Client index.
* @noreturn
*/
forward OnClientPostAdminFilter(client);
/**
* Called once a client is authorized and fully in-game, and
* after all post-connection authorizations have been performed.
*
* This callback is gauranteed to occur on all clients, and always
* after each OnClientPutInServer() call.
*
* @param client Client index.
* @noreturn
*/
forward OnClientPostAdminCheck(client);
/**
* Returns the maximum number of clients allowed on the server. This may
* return 0 if called before OnMapStart(), and thus should not be called
* in OnPluginStart().
*
* @return Maximum number of clients allowed.
*/
native GetMaxClients();
/**
* Returns the client count put in the server.
*
* @param inGameOnly If false connecting players are also counted.
* @return Client count in the server.
*/
native GetClientCount(bool:inGameOnly=true);
/**
* Returns the client's name.
*
* @param client Player index.
* @param name Buffer to store the client's name.
* @param maxlen Maximum length of string buffer (includes NULL terminator).
* @return True on success, false otherwise.
* @error If the client is not connected an error will be thrown.
*/
native bool:GetClientName(client, String:name[], maxlen);
/**
* Retrieves a client's IP address.
*
* @param client Player index.
* @param name Buffer to store the client's ip address.
* @param maxlen Maximum length of string buffer (includes NULL terminator).
* @param remport Remove client's port from the ip string (true by default).
* @return True on success, false otherwise.
* @error If the client is not connected or the index is invalid.
*/
native bool:GetClientIP(client, String:ip[], maxlen, bool:remport=true);
/**
* Retrieves a client's authentication string (SteamID).
*
* @param client Player index.
* @param auth Buffer to store the client's auth string.
* @param maxlen Maximum length of string buffer (includes NULL terminator).
* @return True on success, false otherwise.
* @error If the client is not connected or the index is invalid.
*/
native bool:GetClientAuthString(client, String:auth[], maxlen);
/**
* Retrieves a client's user id, which is an index incremented for every client
* that joins the server.
*
* @param client Player index.
* @return User id of the client.
* @error If the client is not connected or the index is invalid.
*/
native GetClientUserId(client);
/**
* Returns if a certain player is connected.
*
* @param client Player index.
* @return True if player is connected to the server, false otherwise.
*/
native bool:IsClientConnected(client);
/**
* Returns if a certain player has entered the game.
*
* @param client Player index (index does not have to be connected).
* @return True if player has entered the game, false otherwise.
* @error Invalid client index.
*/
native bool:IsClientInGame(client);
/**
* Returns if a client is in the "kick queue" (i.e. the client will be kicked
* shortly and thus they should not appear as valid).
*
* @param client Player index (must be connected).
* @return True if in the kick queue, false otherwise.
* @error Invalid client index.
*/
native bool:IsClientInKickQueue(client);
/**
* Backwards compatibility stock - use IsClientInGame
* @deprecated Renamed to IsClientInGame
*/
#pragma deprecated Use IsClientInGame() instead
stock bool:IsPlayerInGame(client)
{
return IsClientInGame(client);
}
/**
* Returns if a certain player has been authenticated.
*
* @param client Player index.
* @return True if player has been authenticated, false otherwise.
*/
native bool:IsClientAuthorized(client);
/**
* Returns if a certain player is a fake client.
*
* @param client Player index.
* @return True if player is a fake client, false otherwise.
*/
native bool:IsFakeClient(client);
/**
* Returns if a certain player is an observer/spectator.
*
* @param client Player index.
* @return True if player is an obverser, false otherwise.
*/
native bool:IsClientObserver(client);
/**
* Returns if the client is alive or dead.
*
* Note: This function was originally in SDKTools and was moved to core.
*
* @param client Player's index.
* @return True if the client is alive, false otherwise.
* @error Invalid client index, client not in game, or no mod support.
*/
native bool:IsPlayerAlive(client);
/**
* Retrieves values from client replicated keys.
*
* @param client Player's index.
* @param key Key string.
* @param value Buffer to store value.
* @param maxlen Maximum length of valve (UTF-8 safe).
* @return True on success, false otherwise.
* @error Invalid client index, or client not connected.
*/
native bool:GetClientInfo(client, const String:key[], String:value[], maxlen);
/**
* Retrieves a client's team index.
*
* @param client Player's index.
* @return Team index the client is on (mod specific).
* @error Invalid client index, client not in game, or no mod support.
*/
native GetClientTeam(client);
/**
* Sets a client's AdminId.
*
* @param client Player's index.
* @param id AdminId to set. INVALID_ADMIN_ID removes admin permissions.
* @param temp True if the id should be freed on disconnect.
* @noreturn
* @error Invalid client index, client not connected, or bogus AdminId.
*/
native SetUserAdmin(client, AdminId:id, bool:temp=false);
/**
* Retrieves a client's AdminId.
*
* @param client Player's index.
* @return AdminId of the client, or INVALID_ADMIN_ID if none.
* @error Invalid client index, or client not connected.
*/
native AdminId:GetUserAdmin(client);
/**
* Sets access flags on a client. If the client is not an admin,
* a temporary, anonymous AdminId is given.
*
* @param client Player's index.
* @param ... Flags to set on the client.
* @noreturn
* @error Invalid client index, or client not connected.
*/
native AddUserFlags(client, AdminFlag:...);
/**
* Removes flags from a client. If the client is not an admin,
* this has no effect.
*
* @param client Player's index.
* @param ... Flags to remove from the client.
* @noreturn
* @error Invalid client index, or client not connected.
*/
native RemoveUserFlags(client, AdminFlag:...);
/**
* Sets access flags on a client using bits instead of flags. If the
* client is not an admin, and flags not 0, a temporary, anonymous AdminId is given.
*
* @param client Player's index.
* @param flags Bitstring of flags to set on client.
* @noreturn
*/
native SetUserFlagBits(client, flags);
/**
* Returns client access flags. If the client is not an admin,
* the result is always 0.
*
* @param client Player's index.
* @return Flags
* @error Invalid client index, or client not connected.
*/
native GetUserFlagBits(client);
/**
* Returns whether a user can target another user.
* This is a helper function for CanAdminTarget.
*
* @param client Player's index.
* @param target Target player's index.
* @return True if target is targettable by the player, false otherwise.
* @error Invalid or unconnected player indexers.
*/
native bool:CanUserTarget(client, target);
/**
* Runs through the Core-defined admin authorization checks on a player.
* Has no effect if the player is already an admin.
*
* Note: This function is based on the internal cache only.
*
* @param client Client index.
* @return True if access was changed, false if it did not.
* @error Invalid client index or client not in-game AND authorized.
*/
native bool:RunAdminCacheChecks(client);
/**
* Signals that a player has completed post-connection admin checks.
* Has no effect if the player has already had this event signalled.
*
* Note: This must be sent even if no admin id was assigned.
*
* @param client Client index.
* @noreturn
* @error Invalid client index or client not in-game AND authorized.
*/
native NotifyPostAdminCheck(client);
/**
* Creates a fake client.
*
* @param name Name to use.
* @return Client index on success, 0 otherwise.
*/
native CreateFakeClient(const String:name[]);
/**
* Sets a convar value on a fake client.
*
* @param client Client index.
* @param cvar ConVar name.
* @param value ConVar value.
* @noreturn
* @error Invalid client index, client not connected,
* or client not a fake client.
*/
native SetFakeClientConVar(client, const String:cvar[], const String:value[]);
/**
* Returns the client's health.
*
* @param client Player's index.
* @return Health value.
* @error Invalid client index, client not in game, or no mod support.
*/
native GetClientHealth(client);
/**
* Returns the client's model name.
*
* @param client Player's index.
* @param model Buffer to store the client's model name.
* @param maxlen Maximum length of string buffer (includes NULL terminator).
* @noreturn
* @error Invalid client index, client not in game, or no mod support.
*/
native GetClientModel(client, String:model[], maxlen);
/**
* Returns the client's weapon name.
*
* @param client Player's index.
* @param weapon Buffer to store the client's weapon name.
* @param maxlen Maximum length of string buffer (includes NULL terminator).
* @noreturn
* @error Invalid client index, client not in game, or no mod support.
*/
native GetClientWeapon(client, String:weapon[], maxlen);
/**
* Returns the client's max size vector.
*
* @param client Player's index.
* @param vec Destination vector to store the client's max size.
* @noreturn
* @error Invalid client index, client not in game, or no mod support.
*/
native GetClientMaxs(client, Float:vec[3]);
/**
* Returns the client's min size vector.
*
* @param client Player's index.
* @param vec Destination vector to store the client's min size.
* @noreturn
* @error Invalid client index, client not in game, or no mod support.
*/
native GetClientMins(client, Float:vec[3]);
/**
* Returns the client's position angle.
*
* @param client Player's index.
* @param ang Destination vector to store the client's position angle.
* @noreturn
* @error Invalid client index, client not in game, or no mod support.
*/
native GetClientAbsAngles(client, Float:ang[3]);
/**
* Returns the client's origin vector.
*
* @param client Player's index.
* @param vec Destination vector to store the client's origin vector.
* @noreturn
* @error Invalid client index, client not in game, or no mod support.
*/
native GetClientAbsOrigin(client, Float:vec[3]);
/**
* Returns the client's armor.
*
* @param client Player's index.
* @return Armor value.
* @error Invalid client index, client not in game, or no mod support.
*/
native GetClientArmor(client);
/**
* Returns the client's death count.
*
* @param client Player's index.
* @return Death count.
* @error Invalid client index, client not in game, or no mod support.
*/
native GetClientDeaths(client);
/**
* Returns the client's frag count.
*
* @param client Player's index.
* @return Frag count.
* @error Invalid client index, client not in game, or no mod support.
*/
native GetClientFrags(client);
/**
* Returns the client's send data rate in bytes/sec.
*
* @param client Player's index.
* @return Data rate.
* @error Invalid client index, client not in game, or fake client.
*/
native GetClientDataRate(client);
/**
* Returns if a client is timing out
*
* @param client Player's index.
* @return True if client is timing out, false otherwise.
* @error Invalid client index, client not in game, or fake client.
*/
native bool:IsClientTimingOut(client);
/**
* Returns the client's connection time in seconds.
*
* @param client Player's index.
* @return Connection time.
* @error Invalid client index, client not in game, or fake client.
*/
native Float:GetClientTime(client);
/**
* Returns the client's current latency (RTT), more accurate than GetAvgLatency but jittering.
*
* @param client Player's index.
* @param flow Traffic flowing direction.
* @return Latency.
* @error Invalid client index, client not in game, or fake client.
*/
native Float:GetClientLatency(client, NetFlow:flow);
/**
* Returns the client's average packet latency in seconds.
*
* @param client Player's index.
* @param flow Traffic flowing direction.
* @return Average latency.
* @error Invalid client index, client not in game, or fake client.
*/
native Float:GetClientAvgLatency(client, NetFlow:flow);
/**
* Returns the client's average packet loss, values go from 0 to 1 (for percentages).
*
* @param client Player's index.
* @param flow Traffic flowing direction.
* @return Average packet loss.
* @error Invalid client index, client not in game, or fake client.
*/
native Float:GetClientAvgLoss(client, NetFlow:flow);
/**
* Returns the client's average packet choke, values go from 0 to 1 (for percentages).
*
* @param client Player's index.
* @param flow Traffic flowing direction.
* @return Average packet choke.
* @error Invalid client index, client not in game, or fake client.
*/
native Float:GetClientAvgChoke(client, NetFlow:flow);
/**
* Returns the client's data flow in bytes/sec.
*
* @param client Player's index.
* @param flow Traffic flowing direction.
* @return Data flow.
* @error Invalid client index, client not in game, or fake client.
*/
native Float:GetClientAvgData(client, NetFlow:flow);
/**
* Returns the client's average packet frequency in packets/sec.
*
* @param client Player's index.
* @param flow Traffic flowing direction.
* @return Packet frequency.
* @error Invalid client index, client not in game, or fake client.
*/
native Float:GetClientAvgPackets(client, NetFlow:flow);
/**
* Translates an userid index to the real player index.
*
* @param userid Userid value.
* @return Client value.
* @error Returns 0 if invalid userid.
*/
native GetClientOfUserId(userid);
/**
* Disconnects a client from the server as soon as the next frame starts.
*
* Note: Originally, KickClient() was immediate. The delay was introduced
* because despite warnings, plugins were using it in ways that would crash.
* The new safe version can break cases that rely on immediate disconnects,
* but ensures that plugins do not accidentally cause crashes.
*
* If you need immediate disconnects, use KickClientEx().
*
* Note: IsClientInKickQueue() will return true before the kick occurs.
*
* @param client Client index.
* @param format Optional formatting rules for disconnect reason.
* Note that a period is automatically appended to the string by the engine.
* @param ... Variable number of format parameters.
* @noreturn
* @error Invalid client index, or client not connected.
*/
native KickClient(client, const String:format[]="", any:...);
/**
* Immediately disconnects a client from the server.
*
* Kicking clients from certain events or callbacks may cause crashes. If in
* doubt, create a short (0.1 second) timer to kick the client in the next
* available frame.
*
* @param client Client index.
* @param format Optional formatting rules for disconnect reason.
* Note that a period is automatically appended to the string by the engine.
* @param ... Variable number of format parameters.
* @noreturn
* @error Invalid client index, or client not connected.
*/
native KickClientEx(client, const String:format[]="", any:...);
/**
* Changes a client's team through the mod's generic team changing function.
* On CS:S, this will kill the player.
*
* @param client Client index.
* @param team Mod-specific team index.
* @noreturn
* @error Invalid client index, client not connected, or lack of
* mod support.
*/
native ChangeClientTeam(client, team);

View File

@ -0,0 +1,134 @@
/**
* 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: commandfilters.inc 2080 2008-04-19 00:44:11Z dvander $
*/
#if defined _commandfilters_included
#endinput
#endif
#define _commandfilters_included
#define MAX_TARGET_LENGTH 64
#define COMMAND_FILTER_ALIVE (1<<0) /**< Only allow alive players */
#define COMMAND_FILTER_DEAD (1<<1) /**< Only filter dead players */
#define COMMAND_FILTER_CONNECTED (1<<2) /**< Allow players not fully in-game */
#define COMMAND_FILTER_NO_IMMUNITY (1<<3) /**< Ignore immunity rules */
#define COMMAND_FILTER_NO_MULTI (1<<4) /**< Do not allow multiple target patterns */
#define COMMAND_FILTER_NO_BOTS (1<<5) /**< Do not allow bots to be targetted */
#define COMMAND_TARGET_NONE 0 /**< No target was found */
#define COMMAND_TARGET_NOT_ALIVE -1 /**< Single client is not alive */
#define COMMAND_TARGET_NOT_DEAD -2 /**< Single client is not dead */
#define COMMAND_TARGET_NOT_IN_GAME -3 /**< Single client is not in game */
#define COMMAND_TARGET_IMMUNE -4 /**< Single client is immune */
#define COMMAND_TARGET_EMPTY_FILTER -5 /**< A multi-filter (such as @all) had no targets */
#define COMMAND_TARGET_NOT_HUMAN -6 /**< Target was not human */
#define COMMAND_TARGET_AMBIGUOUS -7 /**< Partial name had too many targets */
/**
* Processes a generic command target string, and resolves it to a list
* of clients or one client, based on filtering rules and a pattern.
*
* Note that you should use LoadTranslations("common.phrases") in OnPluginStart(),
* as that file is guaranteed to contain all of the translatable phrases that
* ProcessTargetString() will return.
*
* @param pattern Pattern to find clients against.
* @param admin Admin performing the action, or 0 if the server.
* @param targets Array to hold targets.
* @param max_targets Maximum size of the targets array.
* @param filter_flags Filter flags.
* @param target_name Buffer to store the target name.
* @param tn_maxlength Maximum length of the target name buffer.
* @param tn_is_ml OUTPUT: Will be true if the target name buffer is an ML phrase,
* false if it is a normal string.
* @return If a multi-target pattern was used, the number of clients found
* is returned. If a single-target pattern was used, 1 is returned
* if one valid client is found. Otherwise, a COMMAND_TARGET reason
* for failure is returned.
*/
native ProcessTargetString(const String:pattern[],
admin,
targets[],
max_targets,
filter_flags,
String:target_name[],
tn_maxlength,
&bool:tn_is_ml);
/**
* Replies to a client with a given message describing a targetting
* failure reason.
*
* Note: The translation phrases are found in common.phrases.txt.
*
* @param client Client index, or 0 for server.
* @param reason COMMAND_TARGET reason.
* @noreturn
*/
stock ReplyToTargetError(client, reason)
{
switch (reason)
{
case COMMAND_TARGET_NONE:
{
ReplyToCommand(client, "[SM] %t", "No matching client");
}
case COMMAND_TARGET_NOT_ALIVE:
{
ReplyToCommand(client, "[SM] %t", "Target must be alive");
}
case COMMAND_TARGET_NOT_DEAD:
{
ReplyToCommand(client, "[SM] %t", "Target must be dead");
}
case COMMAND_TARGET_NOT_IN_GAME:
{
ReplyToCommand(client, "[SM] %t", "Target is not in game");
}
case COMMAND_TARGET_IMMUNE:
{
ReplyToCommand(client, "[SM] %t", "Unable to target");
}
case COMMAND_TARGET_EMPTY_FILTER:
{
ReplyToCommand(client, "[SM] %t", "No matching clients");
}
case COMMAND_TARGET_NOT_HUMAN:
{
ReplyToCommand(client, "[SM] %t", "Cannot target bot");
}
case COMMAND_TARGET_AMBIGUOUS:
{
ReplyToCommand(client, "[SM] %t", "More than one client matched");
}
}
}

779
src/include/console.inc Normal file
View File

@ -0,0 +1,779 @@
/**
* 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: console.inc 2482 2008-09-02 03:58:23Z dvander $
*/
#if defined _console_included
#endinput
#endif
#define _console_included
#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.
*/
enum QueryCookie
{
QUERYCOOKIE_FAILED = 0,
};
/**
* Reply sources for commands.
*/
enum ReplySource
{
SM_REPLY_TO_CONSOLE = 0,
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.
*/
#define FCVAR_NONE 0 /**< The default, no flags at all */
#define FCVAR_UNREGISTERED (1<<0) /**< If this is set, don't add to linked list, etc. */
#define FCVAR_LAUNCHER (1<<1) /**< Defined by launcher. */
#define FCVAR_GAMEDLL (1<<2) /**< Defined by the game DLL. */
#define FCVAR_CLIENTDLL (1<<3) /**< Defined by the client DLL. */
#define FCVAR_MATERIAL_SYSTEM (1<<4) /**< Defined by the material system. */
#define FCVAR_PROTECTED (1<<5) /**< It's a server cvar, but we don't send the data since it's a password, etc. Sends 1 if it's not bland/zero, 0 otherwise as value. */
#define FCVAR_SPONLY (1<<6) /**< This cvar cannot be changed by clients connected to a multiplayer server. */
#define FCVAR_ARCHIVE (1<<7) /**< Set to cause it to be saved to vars.rc */
#define FCVAR_NOTIFY (1<<8) /**< Notifies players when changed. */
#define FCVAR_USERINFO (1<<9) /**< Changes the client's info string. */
#define FCVAR_PRINTABLEONLY (1<<10) /**< This cvar's string cannot contain unprintable characters (e.g., used for player name, etc.) */
#define FCVAR_UNLOGGED (1<<11) /**< If this is a FCVAR_SERVER, don't log changes to the log file / console if we are creating a log */
#define FCVAR_NEVER_AS_STRING (1<<12) /**< Never try to print that cvar. */
#define FCVAR_REPLICATED (1<<13) /**< Server setting enforced on clients. */
#define FCVAR_CHEAT (1<<14) /**< Only useable in singleplayer / debug / multiplayer & sv_cheats */
#define FCVAR_STUDIORENDER (1<<15) /**< Defined by the studiorender system. */
#define FCVAR_DEMO (1<<16) /**< Record this cvar when starting a demo file. */
#define FCVAR_DONTRECORD (1<<17) /**< Don't record these command in demo files. */
#define FCVAR_PLUGIN (1<<18) /**< Defined by a 3rd party plugin. */
#define FCVAR_DATACACHE (1<<19) /**< Defined by the datacache system. */
#define FCVAR_TOOLSYSTEM (1<<20) /**< Defined by an IToolSystem library */
#define FCVAR_FILESYSTEM (1<<21) /**< Defined by the file system. */
#define FCVAR_NOT_CONNECTED (1<<22) /**< Cvar cannot be changed by a client that is connected to a server. */
#define FCVAR_SOUNDSYSTEM (1<<23) /**< Defined by the soundsystem library. */
#define FCVAR_ARCHIVE_XBOX (1<<24) /**< Cvar written to config.cfg on the Xbox. */
#define FCVAR_INPUTSYSTEM (1<<25) /**< Defined by the inputsystem DLL. */
#define FCVAR_NETWORKSYSTEM (1<<26) /**< Defined by the network system. */
#define FCVAR_VPHYSICS (1<<27) /**< Defined by vphysics. */
/**
* @endsection
*/
/**
* Executes a server command as if it were on the server console (or RCON)
*
* @param format Formatting rules.
* @param ... Variable number of format parameters.
* @noreturn
*/
native ServerCommand(const String:format[], any:...);
/**
* Inserts a server command at the beginning of the server command buffer.
*
* @param format Formatting rules.
* @param ... Variable number of format parameters.
* @noreturn
*/
native InsertServerCommand(const String:format[], any:...);
/**
* Executes every command in the server's command buffer, rather than once per frame.
*
* @noreturn
*/
native ServerExecute();
/**
* Executes a client command. Note that this will not work on clients unless
* they have cl_restrict_server_commands set to 0.
*
* @param client Index of the client.
* @param fmt Format of the client command.
* @param ... Format parameters/
* @noreturn
* @error Invalid client index, or client not connected.
*/
native ClientCommand(client, const String:fmt[], any:...);
/**
* Executes a client command on the server without being networked.
*
* FakeClientCommand() overwrites the command tokenization buffer. This can
* cause undesired effects because future calls to GetCmdArg* will return
* data from the FakeClientCommand(), not the parent command. If you are in
* a hook where this matters (for example, a "say" hook), you should use
* FakeClientCommandEx() instead.
*
* @param client Index of the client.
* @param fmt Format of the client command.
* @param ... Format parameters
* @noreturn
* @error Invalid client index, or client not connected.
*/
native FakeClientCommand(client, const String:fmt[], any:...);
/**
* Executes a client command on the server without being networked. The
* execution of the client command is delayed by one frame to prevent any
* re-entrancy issues that might surface with FakeClientCommand().
*
* @param client Index of the client.
* @param fmt Format of the client command.
* @param ... Format parameters
* @noreturn
* @error Invalid client index, or client not connected.
*/
native FakeClientCommandEx(client, const String:fmt[], any:...);
/**
* Sends a message to the server console.
*
* @param format Formatting rules.
* @param ... Variable number of format parameters.
* @noreturn
*/
native PrintToServer(const String:format[], any:...);
/**
* Sends a message to a client's console.
*
* @param client Client index.
* @param format Formatting rules.
* @param ... Variable number of format parameters.
* @noreturn
* @error If the client is not connected an error will be thrown.
*/
native PrintToConsole(client, const String:format[], any:...);
/**
* Reples to a message in a command.
*
* A client index of 0 will use PrintToServer().
* If the command was from the console, PrintToConsole() is used.
* If the command was from chat, PrintToChat() is used.
*
* @param client Client index, or 0 for server.
* @param format Formatting rules.
* @param ... Variable number of format parameters.
* @noreturn
* @error If the client is not connected or invalid.
*/
native ReplyToCommand(client, const String:format[], any:...);
/**
* Returns the current reply source of a command.
*
* @return ReplySource value.
*/
native ReplySource:GetCmdReplySource();
/**
* Sets the current reply source of a command.
*
* Only use this if you know what you are doing. You should save the old value
* and restore it once you are done.
*
* @param source New ReplySource value.
* @return Old ReplySource value.
*/
native ReplySource:SetCmdReplySource(ReplySource:source);
/**
* Returns whether the current say hook is a chat trigger.
*
* This function is only meaningful inside say or say_team hooks.
*
* @return True if a chat trigger, false otherwise.
*/
native bool:IsChatTrigger();
/**
* Displays usage of an admin command to users depending on the
* setting of the sm_show_activity cvar. All users receive a message
* in their chat text, except for the originating client, who receives
* the message based on the current ReplySource.
*
* @param client Client index doing the action, or 0 for server.
* @param tag Tag to prepend to the message.
* @param format Formatting rules.
* @param ... Variable number of format parameters.
* @noreturn
* @error
*/
native ShowActivity2(client, const String:tag[], const String:format[], any:...);
/**
* Displays usage of an admin command to users depending on the
* setting of the sm_show_activity cvar.
*
* This version does not display a message to the originating client
* if used from chat triggers or menus. If manual replies are used
* for these cases, then this function will suffice. Otherwise,
* ShowActivity2() is slightly more useful.
*
* @param client Client index doing the action, or 0 for server.
* @param format Formatting rules.
* @param ... Variable number of format parameters.
* @noreturn
* @error
*/
native ShowActivity(client, const String:format[], any:...);
/**
* Same as ShowActivity(), except the tag parameter is used instead of
* "[SM] " (note that you must supply any spacing).
*
* @param client Client index doing the action, or 0 for server.
* @param tag Tag to display with.
* @param format Formatting rules.
* @param ... Variable number of format parameters.
* @noreturn
* @error
*/
native ShowActivityEx(client, const String:tag[], const String:format[], any:...);
/**
* Called when a server-only command is invoked.
*
* @params args Number of arguments that were in the argument string.
* @return An Action value. Not handling the command
* means that Source will report it as "not found."
*/
functag SrvCmd Action:public(args);
/**
* Creates a server-only console command, or hooks an already existing one.
*
* Server commands are case sensitive.
*
* @param cmd Name of the command to hook or create.
* @param callback A function to use as a callback for when the command is invoked.
* @param description Optional description to use for command creation.
* @param flags Optional flags to use for command creation.
* @noreturn
* @error Command name is the same as an existing convar.
*/
native RegServerCmd(const String:cmd[], SrvCmd:callback, const String:description[]="", flags=0);
/**
* Called when a generic console command is invoked.
*
* @param client Index of the client, or 0 from the server.
* @param args Number of arguments that were in the argument string.
* @return An Action value. Not handling the command
* means that Source will report it as "not found."
*/
functag ConCmd Action:public(client, args);
/**
* Creates a console command, or hooks an already existing one.
*
* Console commands are case sensitive. However, if the command already exists in the game,
* the a client may enter the command in any case. SourceMod corrects for this automatically,
* and you should only hook the "real" version of the command.
*
* @param cmd Name of the command to hook or create.
* @param callback A function to use as a callback for when the command is invoked.
* @param description Optional description to use for command creation.
* @param flags Optional flags to use for command creation.
* @noreturn
* @error Command name is the same as an existing convar.
*/
native RegConsoleCmd(const String:cmd[], ConCmd:callback, const String:description[]="", flags=0);
/**
* Creates a console command as an administrative command. If the command does not exist,
* it is created. When this command is invoked, the access rights of the player are
* automatically checked before allowing it to continue.
*
* Admin commands are case sensitive from both the client and server.
*
* @param cmd String containing command to register.
* @param callback A function to use as a callback for when the command is invoked.
* @param adminflags Administrative flags (bitstring) to use for permissions.
* @param description Optional description to use for help.
* @param group String containing the command group to use. If empty,
* the plugin's filename will be used instead.
* @param flags Optional console flags.
* @noreturn
* @error Command name is the same as an existing convar.
*/
native RegAdminCmd(const String:cmd[],
ConCmd:callback,
adminflags,
const String:description[]="",
const String:group[]="",
flags=0);
/**
* Returns the number of arguments from the current console or server command.
* @note Unlike the HL2 engine call, this does not include the command itself.
*
* @return Number of arguments to the current command.
*/
native GetCmdArgs();
/**
* Retrieves a command argument given its index, from the current console or
* server command.
* @note Argument indexes start at 1; 0 retrieves the command name.
*
* @param argnum Argument number to retrieve.
* @param buffer Buffer to use for storing the string.
* @param maxlength Maximum length of the buffer.
* @return Length of string written to buffer.
*/
native GetCmdArg(argnum, String:buffer[], maxlength);
/**
* Retrieves the entire command argument string in one lump from the current
* console or server command.
*
* @param buffer Buffer to use for storing the string.
* @param maxlength Maximum length of the buffer.
* @return Length of string written to buffer.
*/
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 ConVarChanged public(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.
*
* @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.
*
* @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.
*
* @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.
*
* @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.
*
* @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);
/**
* 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 value 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, const 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 name 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().
*
* @return A new command iterator.
*/
native Handle:GetCommandIterator();
/**
* Reads a command iterator, then advances to the next command if any.
* Only SourceMod specific commands are returned.
*
* @param iter Command iterator Handle.
* @param name Name buffer.
* @param nameLen Name buffer size.
* @param eflags Effective default flags of a command.
* @param desc Command description buffer.
* @param descLen Command description buffer size.
* @return True on success, false if there are no more commands.
*/
native bool:ReadCommandIterator(Handle:iter,
String:name[],
nameLen,
&eflags=0,
String:desc[]="",
descLen=0);
/**
* Returns whether a client has access to a given command string. The string
* can also be any override string, as overrides can be independent of
* commands. This important feature essentially allows you to create custom
* flags using the override system.
*
* @param client Client index.
* @param command Command name. If the command is not found, the default
* flags are used.
* @param flags Flag string to use as a default, if the command or override
* is not found.
* @param override_only If true, SourceMod will not attempt to find a matching
* command, and it will only use the default flags specified.
* Otherwise, SourceMod will ignore the default flags if
* there is a matching admin command.
* @return True if the client has access, false otherwise.
*/
native bool:CheckCommandAccess(client,
const String:command[],
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.
*
* @param name Name of the command.
* @return A bitstring containing the FCVAR_* flags that are enabled
* or INVALID_FCVAR_FLAGS if command not found.
*/
native GetCommandFlags(const String:name[]);
/**
* Sets the bitstring of flags of a command.
*
* @param name Name of the command.
* @param flags A bitstring containing the FCVAR_* flags to enable.
* @return True on success, otherwise false.
*/
native bool:SetCommandFlags(const String:name[], flags);
/**
* Starts a ConCommandBase search, traversing the list of ConVars and
* ConCommands. If a Handle is returned, the next entry must be read
* via FindNextConCommand(). The order of the list is undefined.
*
* @param buffer Buffer to store entry name.
* @param max_size Maximum size of the buffer.
* @param isCommand Variable to store whether the entry is a command.
* If it is not a command, it is a ConVar.
* @param flags Variable to store entry flags.
* @param description Buffer to store the description, empty if no description present.
* @param descrmax_size Maximum size of the description buffer.
* @return On success, a ConCmdIter Handle is returned, which
* can be read via FindNextConCommand(), and must be
* closed via CloseHandle(). Additionally, the output
* parameters will be filled with information of the
* first ConCommandBase entry.
* On failure, INVALID_HANDLE is returned, and the
* contents of outputs is undefined.
*/
native Handle:FindFirstConCommand(String:buffer[], max_size, &bool:isCommand, &flags=0, String:description[]="", descrmax_size=0);
/**
* Reads the next entry in a ConCommandBase iterator.
*
* @param search ConCmdIter Handle to search.
* @param buffer Buffer to store entry name.
* @param max_size Maximum size of the buffer.
* @param isCommand Variable to store whether the entry is a command.
* If it is not a command, it is a ConVar.
* @param flags Variable to store entry flags.
* @param description Buffer to store the description, empty if no description present.
* @param descrmax_size Maximum size of the description buffer.
* @return On success, the outputs are filled, the iterator is
* advanced to the next entry, and true is returned.
* If no more entries exist, false is returned, and the
* contents of outputs is undefined.
*/
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[]);

141
src/include/core.inc Normal file
View File

@ -0,0 +1,141 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: core.inc 2243 2008-06-02 05:04:02Z dvander $
*/
#if defined _core_included
#endinput
#endif
#define _core_included
#include <version>
#define SOURCEMOD_PLUGINAPI_VERSION 3
struct PlVers
{
version,
String:filevers[],
String:date[],
String:time[]
};
/**
* Function helper values.
*/
enum Function
{
INVALID_FUNCTION = -1,
};
/**
* Specifies what to do after a hook completes.
*/
enum Action
{
Plugin_Continue = 0, /**< Continue with the original action */
Plugin_Changed = 1, /**< Inputs or outputs have been overridden with new values */
Plugin_Handled = 3, /**< Handle the action at the end (don't call it) */
Plugin_Stop = 4, /**< Immediately stop the hook chain and handle the original */
};
/**
* Specifies identity types.
*/
enum Identity
{
Identity_Core = 0,
Identity_Extension = 1,
Identity_Plugin = 2
};
public PlVers:__version =
{
version = SOURCEMOD_PLUGINAPI_VERSION,
filevers = SOURCEMOD_VERSION,
date = __DATE__,
time = __TIME__
};
/**
* Plugin status values.
*/
enum PluginStatus
{
Plugin_Running=0, /**< Plugin is running */
/* All states below are "temporarily" unexecutable */
Plugin_Paused, /**< Plugin is loaded but paused */
Plugin_Error, /**< Plugin is loaded but errored/locked */
/* All states below do not have all natives */
Plugin_Loaded, /**< Plugin has passed loading and can be finalized */
Plugin_Failed, /**< Plugin has a fatal failure */
Plugin_Created, /**< Plugin is created but not initialized */
Plugin_Uncompiled, /**< Plugin is not yet compiled by the JIT */
Plugin_BadLoad, /**< Plugin failed to load */
};
/**
* Plugin information properties.
*/
enum PluginInfo
{
PlInfo_Name, /**< Plugin name */
PlInfo_Author, /**< Plugin author */
PlInfo_Description, /**< Plugin description */
PlInfo_Version, /**< Plugin verison */
PlInfo_URL, /**< Plugin URL */
};
/**
* Defines how an extension must expose itself for autoloading.
*/
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 */
};
/**
* Defines how a plugin must expose itself for native requiring.
*/
struct SharedPlugin
{
const String:name[], /**< Short name */
const String:file[], /**< File name */
bool:required, /**< Whether or not to require */
};
public Float:NULL_VECTOR[3]; /**< Pass this into certain functions to act as a C++ NULL */
public const String:NULL_STRING[1]; /**< pass this into certain functions to act as a C++ NULL */
#define AUTOLOAD_EXTENSIONS
#define REQUIRE_EXTENSIONS
#define REQUIRE_PLUGIN

88
src/include/cstrike.inc Normal file
View File

@ -0,0 +1,88 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: cstrike.inc 1828 2007-12-24 20:41:33Z pred $
*/
#if defined _cstrike_included
#endinput
#endif
#define _cstrike_included
#define CS_TEAM_NONE 0 /**< No team yet. */
#define CS_TEAM_SPECTATOR 1 /**< Spectators. */
#define CS_TEAM_T 2 /**< Terrorists. */
#define CS_TEAM_CT 3 /**< Counter-Terrorists. */
#define CS_SLOT_PRIMARY 0 /**< Primary weapon slot. */
#define CS_SLOT_SECONDARY 1 /**< Secondary weapon slot. */
#define CS_SLOT_GRENADE 3 /**< Grenade slot (will only return one grenade). */
#define CS_SLOT_C4 4 /**< C4 slot. */
/**
* Respawns a player.
*
* @param client Player's index.
* @noreturn
* @error Invalid client index, client not in game.
*/
native CS_RespawnPlayer(client);
/**
* Switches the player's team.
*
* @param client Player's index.
* @param team Team index.
* @noreturn
* @error Invalid client index, client not in game.
*/
native CS_SwitchTeam(client, team);
/**
* Do not edit below this line!
*/
public Extension:__ext_cstrike =
{
name = "cstrike",
file = "games/game.cstrike.ext",
autoload = 0,
#if defined REQUIRE_EXTENSIONS
required = 1,
#else
required = 0,
#endif
};
#if !defined REQUIRE_EXTENSIONS
public __ext_cstrike_SetNTVOptional()
{
MarkNativeAsOptional("CS_RespawnPlayer");
MarkNativeAsOptional("CS_SwitchTeam");
}
#endif

142
src/include/datapack.inc Normal file
View File

@ -0,0 +1,142 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: datapack.inc 1336 2007-08-15 06:19:30Z damagedsoul $
*/
#if defined _datapack_included
#endinput
#endif
#define _datapack_included
/**
* Creates a new data pack.
*
* @return A Handle to the data pack. Must be closed with CloseHandle().
*/
native Handle:CreateDataPack();
/**
* Packs a normal cell into a data pack.
*
* @param pack Handle to the data pack.
* @param cell Cell to add.
* @noreturn
* @error Invalid handle.
*/
native WritePackCell(Handle:pack, cell);
/**
* Packs a float into a data pack.
*
* @param pack Handle to the data pack.
* @param val Float to add.
* @noreturn
* @error Invalid handle.
*/
native WritePackFloat(Handle:pack, Float:val);
/**
* Packs a string into a data pack.
*
* @param pack Handle to the data pack.
* @param str String to add.
* @noreturn
* @error Invalid handle.
*/
native WritePackString(Handle:pack, const String:str[]);
/**
* Reads a cell from a data pack.
*
* @param pack Handle to the data pack.
* @return Cell value.
* @error Invalid handle, or bounds error.
*/
native ReadPackCell(Handle:pack);
/**
* Reads a float from a data pack.
*
* @param pack Handle to the data pack.
* @return Float value.
* @error Invalid handle, or bounds error.
*/
native Float:ReadPackFloat(Handle:pack);
/**
* Reads a string from a data pack.
*
* @param pack Handle to the data pack.
* @param buffer Destination string buffer.
* @param maxlen Maximum length of output string buffer.
* @noreturn
* @error Invalid handle, or bounds error.
*/
native ReadPackString(Handle:pack, String:buffer[], maxlen);
/**
* Resets the position in a data pack.
*
* @param pack Handle to the data pack.
* @param clear If true, clears the contained data.
* @noreturn
* @error Invalid handle.
*/
native ResetPack(Handle:pack, bool:clear=false);
/**
* Returns the read or write position in a data pack.
*
* @param pack Handle to the data pack.
* @return Numerical position in the data pack.
* @error Invalid handle.
*/
native GetPackPosition(Handle:pack);
/**
* Sets the read/write position in a data pack.
*
* @param pack Handle to the data pack.
* @param position New position to set.
* @noreturn
* @error Invalid handle, or position is beyond the pack bounds.
*/
native SetPackPosition(Handle:pack, position);
/**
* Returns whether or not a specified number of bytes from the data pack
* position to the end can be read.
*
* @param pack Handle to the data pack.
* @param bytes Number of bytes to simulate reading.
* @return True if can be read, false otherwise.
* @error Invalid handle.
*/
native bool:IsPackReadable(Handle:pack, bytes);

633
src/include/dbi.inc Normal file
View File

@ -0,0 +1,633 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: dbi.inc 1918 2008-03-02 18:01:49Z dvander $
*/
#if defined _dbi_included
#endinput
#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.
*/
enum DBResult
{
DBVal_Error = 0, /**< Column number/field is invalid. */
DBVal_TypeMismatch = 1, /**< You cannot retrieve this data with this type. */
DBVal_Null = 2, /**< Field has no data (NULL) */
DBVal_Data = 3, /**< Field has data */
};
/**
* Describes binding types.
*/
enum DBBindType
{
DBBind_Int = 0, /**< Bind an integer. */
DBBind_Float = 1, /**< Bind a float. */
DBBind_String = 2, /**< Bind a string. */
};
/**
* Threading priority level.
*/
enum DBPriority
{
DBPrio_High = 0, /**< High priority. */
DBPrio_Normal = 1, /**< Normal priority. */
DBPrio_Low = 2, /**< Low priority. */
};
/**
* Creates an SQL connection from a named configuration.
*
* @param confname Named configuration.
* @param persistent True to re-use a previous persistent connection if
* possible, false otherwise.
* @param error Error buffer.
* @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);
/**
* Creates a default SQL connection.
*
* @param error Error buffer.
* @param maxlength Maximum length of the error buffer.
* @param persistent True to re-use a previous persistent connection
* if possible, false otherwise.
* @return A database connection Handle, or INVALID_HANDLE on failure.
*/
stock Handle:SQL_DefConnect(String:error[], maxlength, bool:persistent=true)
{
return SQL_Connect("default", persistent, error, maxlength);
}
/**
* Creates an SQL connection from specific parameters.
*
* @param driver Driver Handle, or INVALID_HANDLE for default.
* @param host Host name.
* @param user User name.
* @param pass User password.
* @param database Database name.
* @param error Error buffer.
* @param maxlength Maximum length of the error buffer.
* @param persistent True to re-use a previous persistent connection
* if possible, false otherwise.
* @param port Optional port to specify.
* @param maxTimeout Maximum timeout in seconds if applicable.
* @return A database connection Handle, or INVALID_HANDLE on failure.
* @error Invalid driver Handle other than INVALID_HANDLE.
*/
native Handle:SQL_ConnectEx(Handle:driver,
const String:host[],
const String:user[],
const String:pass[],
const String:database[],
String:error[],
maxlength,
bool:persistent=true,
port=0,
maxTimeout=0);
/**
* Returns if a named configuration is present in databases.cfg.
*
* @param name Configuration name.
* @return True if it exists, false otherwise.
*/
native bool:SQL_CheckConfig(const String:name[]);
/**
* Returns a driver Handle from a name string.
*
* If the driver is not found, SourceMod will attempt
* to load an extension named dbi.<name>.ext.[dll|so].
*
* @param name Driver identification string, or an empty
* string to return the default driver.
* @return Driver Handle, or INVALID_HANDLE on failure.
*/
native Handle:SQL_GetDriver(const String:name[]="");
/**
* Reads the driver of an opened database.
*
* @param database Database Handle.
* @param ident Option buffer to store the identification string.
* @param ident_length Maximum length of the buffer.
* @return Driver Handle.
*/
native Handle:SQL_ReadDriver(Handle:database, String:ident[]="", ident_length=0);
/**
* Retrieves a driver's identification string.
*
* Example: "mysql", "sqlite"
*
* @param driver Driver Handle, or INVALID_HANDLE for the default driver.
* @param ident Identification string buffer.
* @param maxlength Maximum length of the buffer.
* @noreturn
* @error Invalid Handle other than INVALID_HANDLE.
*/
native SQL_GetDriverIdent(Handle:driver, String:ident[], maxlength);
/**
* Retrieves a driver's product string.
*
* Example: "MySQL", "SQLite"
*
* @param driver Driver Handle, or INVALID_HANDLE for the default driver.
* @param product Product string buffer.
* @param maxlength Maximum length of the buffer.
* @noreturn
* @error Invalid Handle other than INVALID_HANDLE.
*/
native SQL_GetDriverProduct(Handle:driver, String:product[], maxlength);
/**
* Returns the number of affected rows from the last query.
*
* @param hndl A database OR statement Handle.
* @return Number of rows affected by the last query.
* @error Invalid database or statement Handle.
*/
native SQL_GetAffectedRows(Handle:hndl);
/**
* Returns the last query's insertion id.
*
* @param hndl A database OR statement Handle.
* @return Last query's insertion id.
* @error Invalid database or statement Handle.
*/
native SQL_GetInsertId(Handle:hndl);
/**
* Returns the error reported by the last query.
*
* @param hndl A database OR statement Handle.
* @param error Error buffer.
* @param maxlength Maximum length of the buffer.
* @return True if there was an error, false otherwise.
* @error Invalid database or statement Handle.
*/
native bool:SQL_GetError(Handle:hndl, String:error[], maxlength);
/**
* 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.
*
* @param hndl A database Handle.
* @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.
* @error Invalid database or statement Handle.
*/
native bool:SQL_EscapeString(Handle:database,
const String:string[],
String:buffer[],
maxlength,
&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[],
maxlength,
&written=0)
{
return SQL_EscapeString(database, string, buffer, maxlength, written);
}
/**
* Executes a query and ignores the result set.
*
* @param database A database Handle.
* @param query Query string.
* @param len Optional parameter to specify the query length, in
* bytes. This can be used to send binary queries that
* have a premature terminator.
* @return True if query succeeded, false otherwise. Use
* SQL_GetError to find the last error.
* @error Invalid database Handle.
*/
native bool:SQL_FastQuery(Handle:database, const String:query[], len=-1);
/**
* Executes a simple query and returns a new query Handle for
* receiving the results.
*
* @param database A database Handle.
* @param query Query string.
* @param len Optional parameter to specify the query length, in
* bytes. This can be used to send binary queries that
* have a premature terminator.
* @return A new Query Handle on success, INVALID_HANDLE
* otherwise. The Handle must be freed with CloseHandle().
* @error Invalid database Handle.
*/
native Handle:SQL_Query(Handle:database, const String:query[], len=-1);
/**
* Creates a new prepared statement query. Prepared statements can
* be executed any number of times. They can also have placeholder
* parameters, similar to variables, which can be bound safely and
* securely (for example, you do not need to quote bound strings).
*
* Statement handles will work in any function that accepts a Query handle.
*
* @param database A database Handle.
* @param query Query string.
* @param error Error buffer.
* @param maxlength Maximum size of the error buffer.
* @return A new statement Handle on success, INVALID_HANDLE
* otherwise. The Handle must be freed with CloseHandle().
* @error Invalid database Handle.
*/
native Handle:SQL_PrepareQuery(Handle:database, const String:query[], String:error[], maxlength);
/**
* 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.
*
* @param query A query Handle.
* @return True if there was another result set, false otherwise.
* @error Invalid query Handle.
*/
native bool:SQL_FetchMoreResults(Handle:query);
/**
* 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.
*
* @param query A query (or statement) Handle.
* @return True if there is a result set, false otherwise.
* @error Invalid query Handle.
*/
native bool:SQL_HasResultSet(Handle:query);
/**
* 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.
* @error Invalid query Handle.
*/
native SQL_GetRowCount(Handle:query);
/**
* Retrieves the number of fields in the last result set.
*
* @param query A query (or statement) Handle.
* @return Number of fields in the current result set.
* @error Invalid query Handle.
*/
native SQL_GetFieldCount(Handle:query);
/**
* Retrieves the name of a field by index.
*
* @param query A query (or statement) Handle.
* @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);
/**
* Retrieves a field index by name.
*
* @param query A query (or statement) Handle.
* @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 Invalid query Handle or no current result set.
*/
native bool:SQL_FieldNameToNum(Handle:query, const String:name[], &field);
/**
* Fetches a row from the current result set. This must be
* successfully called before any results are fetched.
*
* If this function fails, SQL_MoreResults() can be used to
* tell if there was an error or the result set is finished.
*
* @param query A query (or statement) Handle.
* @return True if a row was fetched, false otherwise.
* @error Invalid query Handle.
*/
native bool:SQL_FetchRow(Handle:query);
/**
* Returns if there are more rows.
*
* @param query A query (or statement) Handle.
* @return True if there are more rows, false otherwise.
* @error Invalid query Handle.
*/
native bool:SQL_MoreRows(Handle:query);
/**
* Rewinds a result set back to the first result.
*
* @param query A query (or statement) Handle.
* @return True on success, false otherwise.
* @error Invalid query Handle or no current result set.
*/
native bool:SQL_Rewind(Handle:query);
/**
* 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 query A query (or statement) Handle.
* @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 query Handle or field index, invalid
* type conversion requested from the database,
* or no current result set.
*/
native SQL_FetchString(Handle:query, field, String:buffer[], 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 query A query (or statement) Handle.
* @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 query Handle or field index, invalid
* type conversion requested from the database,
* or no current result set.
*/
native Float:SQL_FetchFloat(Handle:query, 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 query A query (or statement) Handle.
* @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 query Handle or field index, invalid
* type conversion requested from the database,
* or no current result set.
*/
native SQL_FetchInt(Handle:query, 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 query A query (or statement) Handle.
* @param field The field index (starting from 0).
* @return True if data is NULL, false otherwise.
* @error Invalid query Handle or field index, or no
* current result set.
*/
native bool:SQL_IsFieldNull(Handle:query, 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 query A query (or statement) Handle.
* @param field The field index (starting from 0).
* @return Number of bytes for the field's data size.
* @error Invalid query Handle or field index or no
* current result set.
*/
native SQL_FetchSize(Handle:query, field);
/**
* Binds a parameter in a prepared statement to a given integer value.
*
* @param statement A statement (prepared query) Handle.
* @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.
* @noreturn
* @error Invalid statement Handle or parameter index, or
* SQL error.
*/
native SQL_BindParamInt(Handle:statement, param, number, bool:signed=true);
/**
* Binds a parameter in a prepared statement to a given float value.
*
* @param statement A statement (prepared query) Handle.
* @param param The parameter index (starting from 0).
* @param float The float number to bind.
* @noreturn
* @error Invalid statement Handle or parameter index, or
* SQL error.
*/
native SQL_BindParamFloat(Handle:statement, param, Float:value);
/**
* Binds a parameter in a prepared statement to a given string value.
*
* @param statement A statement (prepared query) Handle.
* @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.
* @noreturn
* @error Invalid statement Handle or parameter index, or
* SQL error.
*/
native SQL_BindParamString(Handle:statement, param, const String:value[], bool:copy);
/**
* Executes a prepared statement. All parameters must be bound beforehand.
*
* @param statement A statement (prepared query) Handle.
* @return True on success, false on failure.
* @error Invalid statement Handle.
*/
native bool:SQL_Execute(Handle:statement);
/**
* Locks a database so threading operations will not interrupt.
*
* If you are using a database Handle for both threading and non-threading,
* this MUST be called before doing any set of non-threading DB operations.
* Otherwise you risk corrupting the database driver's memory or network
* connection.
*
* Leaving a lock on a database and then executing a threaded query results
* in a dead lock! Make sure to call SQL_UnlockDatabase()!
*
* If the lock cannot be acquired, the main thread will pause until the
* threaded operation has concluded.
*
* @param database A database Handle.
* @noreturn
* @error Invalid database Handle.
*/
native 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);
/**
* General callback for threaded SQL stuff.
*
* @param db 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 SQLTCallback public(Handle:owner, Handle:hndl, const String:error[], any:data);
/**
* Tells whether two database handles both point to the same database
* connection.
*
* @param hndl1 First database Handle.
* @param hndl2 Second database Handle.
* @return True if the Handles point to the same
* connection, false otherwise.
* @error Invalid Handle.
*/
native bool:SQL_IsSameConnection(Handle:hndl1, Handle:hndl2);
/**
* Connects to a database via a thread. This can be used instead of
* SQL_Connect() if you wish for non-blocking functionality.
*
* It is not necessary to use this to use threaded queries. However, if you
* don't (or you mix threaded/non-threaded queries), you should see
* SQL_LockDatabase().
*
* @param callback Callback; new Handle will be in hndl, owner is the driver.
* If no driver was found, the owner is INVALID_HANDLE.
* @param name Database name.
* @noreturn
*/
native SQL_TConnect(SQLTCallback:callback, const String:name[]="default", any:data=0);
/**
* Executes a simple query via a thread. The query Handle is passed through
* the callback.
*
* The database Handle returned through the callback is always a new Handle,
* and if necessary, SQL_IsSameConnection() should be used to test against
* other conenctions.
*
* The query Handle returned through the callback is temporary and destroyed
* at the end of the callback. If you need to hold onto it, use CloneHandle().
*
* @param database A database Handle.
* @param callback Callback; database is in "owner" and the query Handle
* is passed in "hndl".
* @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);

677
src/include/entity.inc Normal file
View File

@ -0,0 +1,677 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: entity.inc 1890 2008-02-22 16:51:15Z dvander $
*/
#if defined _entity_included
#endinput
#endif
#define _entity_included
/**
* Property types for entities.
*/
enum PropType
{
Prop_Send = 0, /**< This property is networked. */
Prop_Data = 1, /**< This property is for save game data fields. */
};
/**
* @section For more information on these, see the HL2SDK (public/edict.h)
*/
#define FL_EDICT_CHANGED (1<<0) /**< Game DLL sets this when the entity state changes
Mutually exclusive with FL_EDICT_PARTIAL_CHANGE. */
#define FL_EDICT_FREE (1<<1) /**< this edict if free for reuse */
#define FL_EDICT_FULL (1<<2) /**< this is a full server entity */
#define FL_EDICT_FULLCHECK (0<<0) /**< call ShouldTransmit() each time, this is a fake flag */
#define FL_EDICT_ALWAYS (1<<3) /**< always transmit this entity */
#define FL_EDICT_DONTSEND (1<<4) /**< don't transmit this entity */
#define FL_EDICT_PVSCHECK (1<<5) /**< always transmit entity, but cull against PVS */
#define FL_EDICT_PENDING_DORMANT_CHECK (1<<6)
#define FL_EDICT_DIRTY_PVS_INFORMATION (1<<7)
#define FL_FULL_EDICT_CHANGED (1<<8)
enum PropFieldType
{
PropField_Unsupported, /**< The type is unsupported. */
PropField_Integer, /**< Valid for SendProp and Data fields */
PropField_Float, /**< Valid for SendProp and Data fields */
PropField_Entity, /**< Valid for Data fields only (SendProp shows as int) */
PropField_Vector, /**< Valid for SendProp and Data fields */
PropField_String, /**< Valid for SendProp and Data fields */
PropField_String_T, /**< Valid for Data fields. Read only.
Note that the size of a string_t is dynamic, and
thus FindDataMapOffs() will return the constant size
of the string_t container (which is 32 bits right now).
*/
};
/**
* @endsection
*/
/**
* Returns the maximum number of entities.
*
* @return Maximum number of entities.
*/
native GetMaxEntities();
/**
* Returns the number of entities in the server.
*
* @return Number of entities in the server.
*/
native GetEntityCount();
/**
* Returns whether or not an entity is valid. Returns false
* if there is no matching CBaseEntity for this edict index.
*
* @param edict Index of the entity/edict.
* @return True if valid, false otherwise.
*/
native bool:IsValidEntity(edict);
/**
* Returns whether or not an edict index is valid.
*
* @param edict Index of the edict.
* @return True if valid, false otherwise.
*/
native bool:IsValidEdict(edict);
/**
* Returns whether or not an entity is a valid networkable edict.
*
* @param edict Index of the edict.
* @return True if networkable, false if invalid or not networkable.
*/
native bool:IsEntNetworkable(edict);
/**
* Creates a new edict (the basis of a networkable entity)
*
* @return Index of the edict, 0 on failure.
*/
native CreateEdict();
/**
* Removes an edict from the world.
*
* @param edict Index of the edict.
* @noreturn
* @error Invalid edict index.
*/
native RemoveEdict(edict);
/**
* Returns the flags on an edict. These are not the same as entity flags.
*
* @param edict Index of the entity.
* @return Edict flags.
* @error Invalid edict index.
*/
native GetEdictFlags(edict);
/**
* Sets the flags on an edict. These are not the same as entity flags.
*
* @param edict Index of the entity.
* @param flags Flags to set.
* @noreturn
* @error Invalid edict index.
*/
native SetEdictFlags(edict, flags);
/**
* Retrieves an edict classname.
*
* @param edict Index of the entity.
* @param clsname Buffer to store the classname.
* @param maxlength Maximum length of the buffer.
* @return True on success, false if there is no classname set.
*/
native bool:GetEdictClassname(edict, String:clsname[], maxlength);
/**
* Retrieves an entity's networkable serverclass name.
* This is not the same as the classname and is used for networkable state changes.
*
* @param edict Index of the entity.
* @param clsname Buffer to store the serverclass name.
* @param maxlength Maximum lnegth of the buffer.
* @return True on success, false if the edict is not networkable.
* @error Invalid edict index.
*/
native bool:GetEntityNetClass(edict, String:clsname[], maxlength);
/**
* @section Entity offset functions
*
* Offsets should be specified in byte distance from the CBaseEntity
* structure, not short (double byte) or integer (four byte) multiples.
* It is somewhat common practice to use offsets aligned to their final
* type, and thus make sure you are not falling to this error in SourceMod.
* For example, if your "integer-aligned" offset was 119, your byte-aligned
* offset is 119*4, or 476.
* Specifying incorrect offsets or the incorrect data type for an offset
* can have fatal consequences. If you are hardcoding offsets, and the
* layout of CBaseEntity does not match, you can easily crash the server.
*
* The reasonable bounds for offsets is greater than or equal to 0 and
* below 32768. Offsets out of these bounds will throw an error. However,
* this does not represent any real range, it is simply a sanity check for
* illegal values. Any range outside of the CBaseEntity structure's private
* size will cause undefined behaviour or even crash.
*/
/**
* Marks an entity as state changed. This can be useful if you set an offset
* and wish for it to be immediately changed over the network. By default this
* is not done for offset setting functions.
*
* @param edict Index to the edict.
* @param offset Offset to mark as changed. If 0,
* the entire edict is marked as changed.
* @noreturn
* @error Invalid entity or offset out of bounds.
*/
native ChangeEdictState(edict, offset = 0);
/**
* Peeks into an entity's object data and retrieves the integer value at
* the given offset.
*
* @param entity Edict index.
* @param offset Offset to use.
* @param size Number of bytes to read (valid values are 1, 2, or 4).
* @return Value at the given memory location.
* @error Invalid entity or offset out of reasonable bounds.
*/
native GetEntData(entity, offset, size=4);
/**
* Peeks into an entity's object data and sets the integer value at
* the given offset.
*
* @param entity Edict index.
* @param offset Offset to use.
* @param size Number of bytes to write (valid values are 1, 2, or 4).
* @param changeState If true, change will be sent over the network.
* @return Value at the given memory location.
* @error Invalid entity or offset out of reasonable bounds.
* @noreturn
*/
native SetEntData(entity, offset, any:value, size=4, bool:changeState=false);
/**
* Peeks into an entity's object data and retrieves the float value at
* the given offset.
*
* @param entity Edict index.
* @param offset Offset to use.
* @return Value at the given memory location.
* @error Invalid entity or offset out of reasonable bounds.
*/
native Float:GetEntDataFloat(entity, offset);
/**
* Peeks into an entity's object data and sets the integer value at
* the given offset.
*
* @param entity Edict index.
* @param offset Offset to use.
* @param changeState If true, change will be sent over the network.
* @return Value at the given memory location.
* @error Invalid entity or offset out of reasonable bounds.
* @noreturn
*/
native SetEntDataFloat(entity, offset, Float:value, bool:changeState=false);
/**
* This function is deprecated. Use GetEntDataEnt2 instead, for
* reasons explained in the notes.
*
* Note: This function returns 0 on failure, which may be misleading,
* as the number 0 is also used for the world entity index.
*
* Note: This function makes no attempt to validate the returned
* entity, and in fact, it could be garbage or completely unexpected.
*
* @param entity Edict index.
* @param offset Offset to use.
* @return Entity index at the given location, or 0 if none.
* @error Invalid entity or offset out of reasonable bounds.
*/
native GetEntDataEnt(entity, offset);
/**
* This function is deprecated. Use GetEntDataEnt2 instead, for
* reasons explained in the notes.
*
* Note: This function uses 0 as an indicator to unset data, but
* 0 is also the world entity index. Thus, the a property cannot
* be set to the world entity using this native.
*
* @param entity Edict index.
* @param offset Offset to use.
* @param other Entity index to set, or 0 to clear.
* @param changeState If true, change will be sent over the network.
* @noreturn
* @error Invalid entity or offset out of reasonable bounds.
*/
native SetEntDataEnt(entity, offset, other, bool:changeState=false);
/**
* Peeks into an entity's object data and retrieves the entity index
* at the given offset.
*
* Note: This will only work on offsets that are stored as "entity
* handles" (which usually looks like m_h* in properties). These
* are not SourceMod Handles, but internal Source structures.
*
* @param entity Edict index.
* @param offset Offset to use.
* @return Entity index at the given location. If there is no entity,
* or the stored entity is invalid, then -1 is returned.
* @error Invalid input entity, or offset out of reasonable bounds.
*/
native GetEntDataEnt2(entity, offset);
/**
* Peeks into an entity's object data and sets the entity index at the
* given offset.
*
* Note: This will only work on offsets that are stored as "entity
* handles" (which usually looks like m_h* in properties). These
* are not SourceMod Handles, but internal Source structures.
*
* @param entity Edict index.
* @param offset Offset to use.
* @param other Entity index to set, or -1 to clear.
* @param changeState If true, change will be sent over the network.
* @noreturn
* @error Invalid input entity, or offset out of reasonable bounds.
*/
native SetEntDataEnt2(entity, offset, other, bool:changeState=false);
/**
* Peeks into an entity's object data and retrieves the vector at the
* given offset.
* @note Both a Vector and a QAngle are three floats. This is a
* convenience function and will work with both types.
*
* @param entity Edict index.
* @param offset Offset to use.
* @param vec Vector buffer to store data in.
* @noreturn
* @error Invalid entity or offset out of reasonable bounds.
*/
native GetEntDataVector(entity, offset, Float:vec[3]);
/**
* Peeks into an entity's object data and sets the vector at the given
* offset.
* @note Both a Vector and a QAngle are three floats. This is a
* convenience function and will work with both types.
*
* @param entity Edict index.
* @param offset Offset to use.
* @param vec Vector to set.
* @param changeState If true, change will be sent over the network.
* @noreturn
* @error Invalid entity or offset out of reasonable bounds.
*/
native SetEntDataVector(entity, offset, const Float:vec[3], bool:changeState=false);
/**
* Peeks into an entity's object data and retrieves the string at
* the given offset.
*
* @param entity Edict index.
* @param offset Offset to use.
* @param buffer Destination string buffer.
* @param maxlen Maximum length of output string buffer.
* @return Number of non-null bytes written.
* @error Invalid entity or offset out of reasonable bounds.
*/
native GetEntDataString(entity, offset, String:buffer[], maxlen);
/**
* Peeks into an entity's object data and sets the string at
* the given offset.
*
* @param entity Edict index.
* @param offset Offset to use.
* @param buffer String to set.
* @param maxlen Maximum length of bytes to write.
* @param changeState If true, change will be sent over the network.
* @return Number of non-null bytes written.
* @error Invalid entity or offset out of reasonable bounds.
*/
native SetEntDataString(entity, offset, const String:buffer[], maxlen, bool:changeState=false);
/**
* @endsection
*/
/**
* Given a ServerClass name, finds a networkable send property offset.
* This information is cached for future calls.
*
* Note, this function may return offsets that do not work!
* If a property is nested beneath a parent object, the resulting offset
* will be invalid for direct use with data functions. Therefore, you
* should use FindSendPropInfo() instead. An example of such a property is
* CTFPlayer::DT_LocalPlayer.m_nDisguiseClass on Team Fortress.
*
* @param cls Classname.
* @param prop Property name.
* @return An offset, or -1 on failure.
*/
native FindSendPropOffs(const String:cls[], const String:prop[]);
/**
* Given a ServerClass name, finds a networkable send property offset.
* This information is cached for future calls.
*
* Note: This function will correctly compute nested offsets, unlike
* FindSendPropOffs(). YOU SHOULD NOT use this function to self-compute
* nested offsets. For example, it is okay to add indexes for arrays,
* but not to add DT_LocalPlayer to m_nDisguiseClass.
*
* @param cls Classname.
* @param prop Property name.
* @param type Optional parameter to store the type.
* @param num_bits Optional parameter to store the number of bits the field
* uses, if applicable (otherwise 0 is stored). The number
* of bits varies for integers and floats, and is always 0
* for strings.
* @param local_offset Optional parameter to store the local offset, as
* FindSendPropOffs() would return.
* @return On success, returns an absolutely computed offset.
* If no offset is available, 0 is returned.
* If the property is not found, -1 is returned.
*/
native FindSendPropInfo(const String:cls[],
const String:prop[],
&PropFieldType:type=PropFieldType:0,
&num_bits=0,
&local_offset=0);
/**
* Given an entity, finds a datamap property offset.
* This information is cached for future calls.
*
* @param entity Entity index.
* @param prop Property name.
* @param type Optional parameter to store the type.
* @param num_bits Optional parameter to store the number of bits the field
* uses. The bit count will either be 1 (for boolean) or
* divisible by 8 (including 0 if unknown).
* @return An offset, or -1 on failure.
*/
native FindDataMapOffs(entity,
const String:prop[],
&PropFieldType:type=PropFieldType:0,
&num_bits=0);
/**
* Wrapper function for finding a send property for a particular entity.
*
* @param ent Entity index.
* @param prop Property name.
* @param actual Defaults to false for backwards compatibility.
* If true, the newer FindSendPropInfo() function
* is used instead.
* @return An offset, or -1 on failure.
*/
stock GetEntSendPropOffs(ent, const String:prop[], bool:actual=false)
{
decl String:cls[64];
if (!GetEntityNetClass(ent, cls, sizeof(cls)))
{
return -1;
}
if (actual)
{
return FindSendPropInfo(cls, prop);
}
else
{
return FindSendPropOffs(cls, prop);
}
}
/**
* Retrieves an integer value from an entity's property.
*
* This function is considered safer and more robust over GetEntData,
* because it performs strict offset checking and typing rules. There is a
* very minor performance hit from this.
*
* @param entity Entity/edict index.
* @param type Property type.
* @param prop Property name.
* @param size Number of bytes to write (valid values are 1, 2, or 4).
* This value is auto-detected, and the size parameter is
* only used as a fallback in case detection fails.
* @return Value at the given property offset.
* @error Invalid entity or property not found.
*/
native GetEntProp(entity, PropType:type, const String:prop[], size=4);
/**
* Sets an integer value in an entity's property.
*
* This function is considered safer and more robust over SetEntData,
* because it performs strict offset checking and typing rules. There is a
* very minor performance hit from this.
*
* @param entity Entity/edict index.
* @param type Property type.
* @param prop Property name.
* @param size Number of bytes to write (valid values are 1, 2, or 4).
* This value is auto-detected, and the size parameter is
* only used as a fallback in case detection fails.
* @error Invalid entity or offset out of reasonable bounds.
* @noreturn
*/
native SetEntProp(entity, PropType:type, const String:prop[], any:value, size=4);
/**
* Retrieves a float value from an entity's property.
*
* This function is considered safer and more robust over GetEntDataFloat,
* because it performs strict offset checking and typing rules. There is a
* very minor performance hit from this.
*
* @param entity Entity/edict index.
* @param type Property type.
* @param prop Property name.
* @return Value at the given property offset.
* @error Invalid entity or offset out of reasonable bounds.
*/
native Float:GetEntPropFloat(entity, PropType:type, const String:prop[]);
/**
* Sets a float value in an entity's property.
*
* This function is considered safer and more robust over SetEntDataFloat,
* because it performs strict offset checking and typing rules. There is a
* very minor performance hit from this.
*
* @param entity Entity/edict index.
* @param type Property type.
* @param prop Property name.
* @param value Value to set.
* @noreturn
* @error Invalid entity or offset out of reasonable bounds.
*/
native SetEntPropFloat(entity, PropType:type, const String:prop[], Float:value);
/**
* Retrieves an entity index from an entity's property.
*
* This function is considered safer and more robust over GetEntDataEnt*,
* because it performs strict offset checking and typing rules. There is a
* very minor performance hit from this.
*
* @param entity Entity/edict index.
* @param type Property type.
* @param prop Property name.
* @return Entity index at the given property.
* If there is no entity, or the entity is not valid,
* then -1 is returned.
* @error Invalid entity or offset out of reasonable bounds.
*/
native GetEntPropEnt(entity, PropType:type, const String:prop[]);
/**
* Sets an entity index in an entity's property.
*
* This function is considered safer and more robust over SetEntDataEnt*,
* because it performs strict offset checking and typing rules. There is a
* very minor performance hit from this.
*
* @param entity Entity/edict index.
* @param type Property type.
* @param prop Property name.
* @param other Entity index to set, or -1 to unset.
* @noreturn
* @error Invalid entity or offset out of reasonable bounds.
*/
native SetEntPropEnt(entity, PropType:type, const String:prop[], other);
/**
* Retrieves a vector of floats from an entity, given a named network property.
*
* This function is considered safer and more robust over GetEntDataVector,
* because it performs strict offset checking and typing rules. There is a
* very minor performance hit from this.
*
* @param entity Entity/edict index.
* @param type Property type.
* @param prop Property name.
* @param vec Vector buffer to store data in.
* @noreturn
* @error Invalid entity, property not found, or property not
* actually a vector data type.
*/
native GetEntPropVector(entity, PropType:type, const String:prop[], Float:vec[3]);
/**
* Sets a vector of floats in an entity, given a named network property.
*
* This function is considered safer and more robust over SetEntDataVector,
* because it performs strict offset checking and typing rules. There is a
* very minor performance hit from this.
*
* @param entity Entity/edict index.
* @param type Property type.
* @param prop Property name.
* @param vec Vector to set.
* @noreturn
* @error Invalid entity, property not found, or property not
* actually a vector data type.
*/
native SetEntPropVector(entity, PropType:type, const String:prop[], const Float:vec[3]);
/**
* Gets a network property as a string.
*
* @param entity Edict index.
* @param type Property type.
* @param prop Property to use.
* @param buffer Destination string buffer.
* @param maxlen Maximum length of output string buffer.
* @return Number of non-null bytes written.
* @error Invalid entity, offset out of reasonable bounds, or property is not a valid string.
*/
native GetEntPropString(entity, PropType:type, const String:prop[], String:buffer[], maxlen);
/**
* Sets a network property as a string.
*
* This cannot set property fields of type PropField_String_T (such as "m_target").
* To set such fields, you should use DispatchKeyValue() from SDKTools.
*
* @param entity Edict index.
* @param type Property type.
* @param prop Property to use.
* @param buffer String to set.
* @return Number of non-null bytes written.
* @error Invalid entity, offset out of reasonable bounds, or property is not a valid string.
*/
native SetEntPropString(entity, PropType:type, const String:prop[], const String:buffer[]);
/**
* Copies an array of cells from an entity at a given offset.
*
* @param entity Entity index.
* @param offset Offset to use.
* @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)
{
for (new i=0; i<arraySize; i++)
{
array[i] = GetEntData(entity, offset + i*dataSize, dataSize)
}
}
/**
* Copies an array of cells to an entity at a given offset.
*
* @param entity Entity index.
* @param offset Offset to use.
* @param array Array of values to copy.
* @param arraySize Number of values to copy.
* @param dataSize Size of each value in bytes (1, 2, or 4).
* @param changeState True to set the network state as changed; false otherwise.
* @noreturn
* @error Invalid entity or offset out of reasonable bounds.
*/
stock SetEntDataArray(entity, offset, const array[], arraySize, dataSize=4, bool:changeState=false)
{
for (new i=0; i<arraySize; i++)
{
SetEntData(entity, offset + i*dataSize, array[i], dataSize, changeState);
}
}

View File

@ -0,0 +1,324 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: entity_prop_stocks.inc 1943 2008-03-16 23:16:34Z dvander $
*/
#if defined _entity_prop_stocks_included
#endinput
#endif
#define _entity_prop_stocks_included
enum MoveType
{
MOVETYPE_NONE = 0, /**< never moves */
MOVETYPE_ISOMETRIC, /**< For players */
MOVETYPE_WALK, /**< Player only - moving on the ground */
MOVETYPE_STEP, /**< gravity, special edge handling -- monsters use this */
MOVETYPE_FLY, /**< No gravity, but still collides with stuff */
MOVETYPE_FLYGRAVITY, /**< flies through the air + is affected by gravity */
MOVETYPE_VPHYSICS, /**< uses VPHYSICS for simulation */
MOVETYPE_PUSH, /**< no clip to world, push and crush */
MOVETYPE_NOCLIP, /**< No gravity, no collisions, still do velocity/avelocity */
MOVETYPE_LADDER, /**< Used by players only when going onto a ladder */
MOVETYPE_OBSERVER, /**< Observer movement, depends on player's observer mode */
MOVETYPE_CUSTOM, /**< Allows the entity to describe its own physics */
};
enum RenderMode
{
RENDER_NORMAL, /**< src */
RENDER_TRANSCOLOR, /**< c*a+dest*(1-a) */
RENDER_TRANSTEXTURE, /**< src*a+dest*(1-a) */
RENDER_GLOW, /**< src*a+dest -- No Z buffer checks -- Fixed size in screen space */
RENDER_TRANSALPHA, /**< src*srca+dest*(1-srca) */
RENDER_TRANSADD, /**< src*a+dest */
RENDER_ENVIRONMENTAL, /**< not drawn, used for environmental effects */
RENDER_TRANSADDFRAMEBLEND, /**< use a fractional frame value to blend between animation frames */
RENDER_TRANSALPHAADD, /**< src + dest*(1-a) */
RENDER_WORLDGLOW, /**< Same as kRenderGlow but not fixed size in screen space */
RENDER_NONE, /**< Don't render. */
};
enum RenderFx
{
RENDERFX_NONE = 0,
RENDERFX_PULSE_SLOW,
RENDERFX_PULSE_FAST,
RENDERFX_PULSE_SLOW_WIDE,
RENDERFX_PULSE_FAST_WIDE,
RENDERFX_FADE_SLOW,
RENDERFX_FADE_FAST,
RENDERFX_SOLID_SLOW,
RENDERFX_SOLID_FAST,
RENDERFX_STROBE_SLOW,
RENDERFX_STROBE_FAST,
RENDERFX_STROBE_FASTER,
RENDERFX_FLICKER_SLOW,
RENDERFX_FLICKER_FAST,
RENDERFX_NO_DISSIPATION,
RENDERFX_DISTORT, /**< Distort/scale/translate flicker */
RENDERFX_HOLOGRAM, /**< kRenderFxDistort + distance fade */
RENDERFX_EXPLODE, /**< Scale up really big! */
RENDERFX_GLOWSHELL, /**< Glowing Shell */
RENDERFX_CLAMP_MIN_SCALE, /**< Keep this sprite from getting very small (SPRITES only!) */
RENDERFX_ENV_RAIN, /**< for environmental rendermode, make rain */
RENDERFX_ENV_SNOW, /**< " " " , make snow */
RENDERFX_SPOTLIGHT, /**< TEST CODE for experimental spotlight */
RENDERFX_RAGDOLL, /**< HACKHACK: TEST CODE for signalling death of a ragdoll character */
RENDERFX_PULSE_FAST_WIDER,
RENDERFX_MAX
};
// These defines are for client button presses.
#define IN_ATTACK (1 << 0)
#define IN_JUMP (1 << 1)
#define IN_DUCK (1 << 2)
#define IN_FORWARD (1 << 3)
#define IN_BACK (1 << 4)
#define IN_USE (1 << 5)
#define IN_CANCEL (1 << 6)
#define IN_LEFT (1 << 7)
#define IN_RIGHT (1 << 8)
#define IN_MOVELEFT (1 << 9)
#define IN_MOVERIGHT (1 << 10)
#define IN_ATTACK2 (1 << 11)
#define IN_RUN (1 << 12)
#define IN_RELOAD (1 << 13)
#define IN_ALT1 (1 << 14)
#define IN_ALT2 (1 << 15)
#define IN_SCORE (1 << 16) // Used by client.dll for when scoreboard is held down
#define IN_SPEED (1 << 17) // Player is holding the speed key
#define IN_WALK (1 << 18) // Player holding walk key
#define IN_ZOOM (1 << 19) // Zoom key for HUD zoom
#define IN_WEAPON1 (1 << 20) // weapon defines these bits
#define IN_WEAPON2 (1 << 21) // weapon defines these bits
#define IN_BULLRUSH (1 << 22)
#define IN_GRENADE1 (1 << 23) // grenade 1
#define IN_GRENADE2 (1 << 24) // grenade 2
// CBaseEntity::m_fFlags
// PLAYER SPECIFIC FLAGS FIRST BECAUSE WE USE ONLY A FEW BITS OF NETWORK PRECISION
#define FL_ONGROUND (1 << 0) // At rest / on the ground
#define FL_DUCKING (1 << 1) // Player flag -- Player is fully crouched
#define FL_WATERJUMP (1 << 2) // player jumping out of water
#define FL_ONTRAIN (1 << 3) // Player is _controlling_ a train, so movement commands should be ignored on client during prediction.
#define FL_INRAIN (1 << 4) // Indicates the entity is standing in rain
#define FL_FROZEN (1 << 5) // Player is frozen for 3rd person camera
#define FL_ATCONTROLS (1 << 6) // Player can't move, but keeps key inputs for controlling another entity
#define FL_CLIENT (1 << 7) // Is a player
#define FL_FAKECLIENT (1 << 8) // Fake client, simulated server side; don't send network messages to them
// NOTE if you move things up, make sure to change this value
#define PLAYER_FLAG_BITS 9
// NON-PLAYER SPECIFIC (i.e., not used by GameMovement or the client .dll ) -- Can still be applied to players, though
#define FL_INWATER (1 << 9) // In water
#define FL_FLY (1 << 10) // Changes the SV_Movestep() behavior to not need to be on ground
#define FL_SWIM (1 << 11) // Changes the SV_Movestep() behavior to not need to be on ground (but stay in water)
#define FL_CONVEYOR (1 << 12)
#define FL_NPC (1 << 13)
#define FL_GODMODE (1 << 14)
#define FL_NOTARGET (1 << 15)
#define FL_AIMTARGET (1 << 16) // set if the crosshair needs to aim onto the entity
#define FL_PARTIALGROUND (1 << 17) // not all corners are valid
#define FL_STATICPROP (1 << 18) // Eetsa static prop!
#define FL_GRAPHED (1 << 19) // worldgraph has this ent listed as something that blocks a connection
#define FL_GRENADE (1 << 20)
#define FL_STEPMOVEMENT (1 << 21) // Changes the SV_Movestep() behavior to not do any processing
#define FL_DONTTOUCH (1 << 22) // Doesn't generate touch functions, generates Untouch() for anything it was touching when this flag was set
#define FL_BASEVELOCITY (1 << 23) // Base velocity has been applied this frame (used to convert base velocity into momentum)
#define FL_WORLDBRUSH (1 << 24) // Not moveable/removeable brush entity (really part of the world, but represented as an entity for transparency or something)
#define FL_OBJECT (1 << 25) // Terrible name. This is an object that NPCs should see. Missiles, for example.
#define FL_KILLME (1 << 26) // This entity is marked for death -- will be freed by game DLL
#define FL_ONFIRE (1 << 27) // You know...
#define FL_DISSOLVING (1 << 28) // We're dissolving!
#define FL_TRANSRAGDOLL (1 << 29) // In the process of turning into a client side ragdoll.
#define FL_UNBLOCKABLE_BY_PLAYER (1 << 30) // pusher that can't be blocked by the player
// END m_fFlags #defines
/**
* Get an entity's flags.
*
* @param entity Entity index.
* @return Entity's flags, see m_fFlag defines above
* @error Invalid entity index, or lack of mod compliance.
*/
stock GetEntityFlags(entity)
{
return GetEntProp(entity, Prop_Data, "m_fFlags");
}
/**
* Gets an entity's movetype.
*
* @param entity Entity index.
* @return Movetype, see enum above.
* @error Invalid entity index, or lack of mod compliance.
*/
stock MoveType:GetEntityMoveType(entity)
{
new offset = GetEntSendPropOffs(entity, "movetype");
return MoveType:GetEntData(entity, offset, 1);
}
/**
* Sets an entity's movetype.
*
* @param entity Entity index.
* @param mt Movetype, see enum above.
* @noreturn
* @error Invalid entity index, or lack of mod compliance.
*/
stock SetEntityMoveType(entity, MoveType:mt)
{
new offset = GetEntSendPropOffs(entity, "movetype");
SetEntData(entity, offset, mt, 1, true);
}
/**
* Gets an entity's render mode.
*
* @param entity Entity index.
* @return RenderMode value.
* @error Invalid entity index, or lack of mod compliance.
*/
stock RenderMode:GetEntityRenderMode(entity)
{
return RenderMode:GetEntProp(entity, Prop_Send, "m_nRenderMode", 1);
}
/**
* Sets an entity's render mode.
*
* @param entity Entity index.
* @param mode RenderMode value.
* @noreturn
* @error Invalid entity index, or lack of mod compliance.
*/
stock SetEntityRenderMode(entity, RenderMode:mode)
{
SetEntProp(entity, Prop_Send, "m_nRenderMode", mode, 1);
}
/**
* Gets an entity's render Fx.
*
* @param entity Entity index.
* @return RenderFx value.
* @error Invalid entity index, or lack of mod compliance.
*/
stock RenderFx:GetEntityRenderFx(entity)
{
return RenderFx:GetEntProp(entity, Prop_Send, "m_nRenderFX", 1);
}
/**
* Sets an entity's render Fx.
*
* @param entity Entity index.
* @param fx RenderFx value.
* @noreturn
* @error Invalid entity index, or lack of mod compliance.
*/
stock SetEntityRenderFx(entity, RenderFx:fx)
{
SetEntProp(entity, Prop_Send, "m_nRenderFX", fx, 1);
}
/**
* Sets an entity's color.
*
* @param entity Entity index
* @param r Amount of red (0-255)
* @param g Amount of green (0-255)
* @param b Amount of blue (0-255)
* @param a Amount of alpha (0-255)
* @noreturn
* @error Invalid entity index, or lack of mod compliance.
*/
stock SetEntityRenderColor(entity, r=255, g=255, b=255, a=255)
{
new offset = GetEntSendPropOffs(entity, "m_clrRender");
SetEntData(entity, offset, r, 1, true);
SetEntData(entity, offset + 1, g, 1, true);
SetEntData(entity, offset + 2, b, 1, true);
SetEntData(entity, offset + 3, a, 1, true);
}
/* GuessSDKVersion */
/**
* Gets an entity's gravity.
*
* @param entity Entity index.
* @return Entity's m_flGravity value.
* @error Invalid entity index, or lack of mod compliance.
*/
stock Float:GetEntityGravity(entity)
{
return GetEntPropFloat(entity, Prop_Data, "m_flGravity");
}
/**
* Sets an entity's gravity.
*
* @param entity Entity index.
* @param amount Gravity to set (default = 1.0, half = 0.5, double = 2.0).
* @noreturn
* @error Invalid entity index, or lack of mod compliance.
*/
stock SetEntityGravity(entity, Float:amount)
{
SetEntPropFloat(entity, Prop_Data, "m_flGravity", amount);
}
/**
* Sets an entity's health
*
* @param entity Entity index.
* @param amount Health amount.
* @noreturn
* @error Invalid entity index, or lack of mod compliance.
*/
stock SetEntityHealth(entity, amount)
{
SetEntProp(entity, Prop_Send, "m_iHealth", amount);
}
/**
* Get's a users current pressed buttons
*
* @param client Client index
* @return Bitsum of buttons
* @error Invalid client index, client not in game,
* or lack of mod compliance.
*/
stock GetClientButtons(client)
{
return GetEntProp(client, Prop_Data, "m_nButtons");
}

243
src/include/events.inc Normal file
View File

@ -0,0 +1,243 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: events.inc 1857 2008-01-19 20:58:10Z dvander $
*/
#if defined _events_included
#endinput
#endif
#define _events_included
/**
* Event hook modes determining how hooking should be handled
*/
enum EventHookMode
{
EventHookMode_Pre, /**< Hook callback fired before event is fired */
EventHookMode_Post, /**< Hook callback fired after event is fired */
EventHookMode_PostNoCopy /**< Hook callback fired after event is fired, but event data won't be copied */
};
/**
* Hook function types for events.
*/
funcenum EventHook
{
/**
* Called when a game event is fired.
*
* @param event Handle to event. This could be INVALID_HANDLE if every plugin hooking
* this event has set the hook mode EventHookMode_PostNoCopy.
* @param name String containing the name of the event.
* @param dontBroadcast True if event was not broadcast to clients, false otherwise.
* @return Ignored for post hooks. Plugin_Handled will block event if hooked as pre.
*/
Action:public(Handle:event, const String:name[], bool:dontBroadcast),
/**
* Called when a game event is fired.
*
* @param event Handle to event. This could be INVALID_HANDLE if every plugin hooking
* this event has set the hook mode EventHookMode_PostNoCopy.
* @param name String containing the name of the event.
* @param dontBroadcast True if event was not broadcast to clients, false otherwise.
* @noreturn
*/
public(Handle:event, const String:name[], bool:dontBroadcast),
};
/**
* Creates a hook for when a game event is fired.
*
* @param name Name of event.
* @param callback An EventHook function pointer.
* @param mode Optional EventHookMode determining the type of hook.
* @noreturn
* @error Invalid event name or invalid callback function.
*/
native HookEvent(const String:name[], EventHook:callback, EventHookMode:mode=EventHookMode_Post);
/**
* Creates a hook for when a game event is fired.
*
* @param name Name of event.
* @param callback An EventHook function pointer.
* @param mode Optional EventHookMode determining the type of hook.
* @return True if event exists and was hooked successfully, false otherwise.
* @error Invalid callback function.
*/
native bool:HookEventEx(const String:name[], EventHook:callback, EventHookMode:mode=EventHookMode_Post);
/**
* Removes a hook for when a game event is fired.
*
* @param name Name of event.
* @param callback An EventHook function pointer.
* @param mode Optional EventHookMode determining the type of hook.
* @noreturn
* @error Invalid callback function or no active hook for specified event.
*/
native UnhookEvent(const String:name[], EventHook:callback, EventHookMode:mode=EventHookMode_Post);
/**
* Creates a game event to be fired later.
*
* The Handle should not be closed via CloseHandle(). It must be closed via
* FireEvent() or CancelCreatedEvent().
*
* @param name Name of event.
* @param force If set to true, this forces the event to be created even if it's not being hooked.
* Note that this will not force it if the event doesn't exist at all.
* @return Handle to event. INVALID_HANDLE is returned if the event doesn't exist or isn't
being hooked (unless force is true).
*/
native Handle:CreateEvent(const String:name[], bool:force=false);
/**
* Fires a game event.
*
* This function closes the event Handle after completing.
*
* @param event Handle to the event.
* @param dontBroadcast Optional boolean that determines if event should be broadcast to clients.
* @noreturn
* @error Invalid or corrupt Handle.
*/
native FireEvent(Handle:event, bool:dontBroadcast=false);
/**
* Cancels a previously created game event that has not been fired.
*
* @param event Handled to the event.
* @noreturn
* @error Invalid or corrupt Handle.
*/
native CancelCreatedEvent(Handle:event);
/**
* Returns the boolean value of a game event's key.
*
* @param event Handle to the event.
* @param key Name of event key.
* @return The boolean value of the specfied event key.
* @error Invalid or corrupt Handle.
*/
native bool:GetEventBool(Handle:event, const String:key[]);
/**
* Sets the boolean value of a game event's key.
*
* @param event Handle to the event.
* @param key Name of event key.
* @param value New boolean value.
* @noreturn
* @error Invalid or corrupt Handle.
*/
native SetEventBool(Handle:event, const String:key[], bool:value);
/**
* Returns the integer value of a game event's key.
*
* @param event Handle to the event.
* @param key Name of event key.
* @return The integer value of the specfied event key.
* @error Invalid or corrupt Handle.
*/
native GetEventInt(Handle:event, const String:key[]);
/**
* Sets the integer value of a game event's key.
*
* Integer value refers to anything that can be reduced to an integer.
* The various size specifiers, such as "byte" and "short" are still
* integers, and only refer to how much data will actually be sent
* over the network (if applicable).
*
* @param event Handle to the event.
* @param key Name of event key.
* @param value New integer value.
* @noreturn
* @error Invalid or corrupt Handle.
*/
native SetEventInt(Handle:event, const String:key[], value);
/**
* Returns the floating point value of a game event's key.
*
* @param event Handle to the event.
* @param key Name of event key.
* @return The floating point value of the specfied event key.
* @error Invalid or corrupt Handle.
*/
native Float:GetEventFloat(Handle:event, const String:key[]);
/**
* Sets the floating point value of a game event's key.
*
* @param event Handle to the event.
* @param key Name of event key.
* @param value New floating point value.
* @noreturn
* @error Invalid or corrupt Handle.
*/
native SetEventFloat(Handle:event, const String:key[], Float:value);
/**
* Retrieves the string value of a game event's key.
*
* @param event Handle to the event.
* @param key Name of event key.
* @param value Buffer to store the value of the specified event key.
* @param maxlength Maximum length of string buffer.
* @noreturn
* @error Invalid or corrupt Handle.
*/
native GetEventString(Handle:event, const String:key[], String:value[], maxlength);
/**
* Sets the string value of a game event's key.
*
* @param event Handle to the event.
* @param key Name of event key.
* @param value New string value.
* @noreturn
* @error Invalid or corrupt Handle.
*/
native SetEventString(Handle:event, const String:key[], const String:value[]);
/**
* Retrieves the name of a game event.
*
* @param event Handle to the event.
* @param value Buffer to store the name of the event.
* @param maxlength Maximum length of string buffer.
* @noreturn
* @error Invalid or corrupt Handle.
*/
native GetEventName(Handle:event, String:name[], maxlength);

388
src/include/files.inc Normal file
View File

@ -0,0 +1,388 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: files.inc 1860 2008-01-22 17:04:59Z dvander $
*/
#if defined _files_included
#endinput
#endif
#define _files_included
/**
* @global All paths in SourceMod natives are relative to the mod folder
* unless otherwise noted.
*
* Most functions in SourceMod (at least, ones that deal with direct
* file manipulation) will support an alternate path specification.
*
* If the path starts with the string "file://" and the PathType is
* not relative, then the "file://" portion is stripped off, and the
* rest of the path is used without any modification (except for
* correcting slashes). This can be used to override the path
* builder to supply alternate absolute paths. Examples:
*
* file://C:/Temp/file.txt
* file:///tmp/file.txt
*/
/**
* File inode types.
*/
enum FileType
{
FileType_Unknown = 0, /* Unknown file type (device/socket) */
FileType_Directory = 1, /* File is a directory */
FileType_File = 2, /* File is a file */
};
/**
* File time modes.
*/
enum FileTimeMode
{
FileTime_LastAccess = 0, /* Last access (does not work on FAT) */
FileTime_Created = 1, /* Creation (does not work on FAT) */
FileTime_LastChange = 2, /* Last modification */
};
#define PLATFORM_MAX_PATH 256 /**< Maximum path length. */
#define SEEK_SET 0 /**< Seek from start. */
#define SEEK_CUR 1 /**< Seek from current position. */
#define SEEK_END 2 /**< Seek from end position. */
/**
* Path types.
*/
enum PathType
{
Path_SM, /**< SourceMod root folder */
};
/**
* 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
* folder layout.
*
* @param type Type of path to build as the base.
* @param buffer Buffer to store the path.
* @param maxlength Maximum length of buffer.
* @param fmt Format string.
* @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:...);
/**
* Opens a directory/folder for contents enumeration.
*
* @note Directories are closed with CloseHandle().
* @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.
*/
native Handle:OpenDirectory(const String:path[]);
/**
* Reads the current directory entry as a local filename, then moves to the next file.
*
* @note Contents of buffers are undefined when returning false.
* @note Both the '.' and '..' automatic directory entries will be retrieved for Windows and Linux.
*
* @param dir Handle to a directory.
* @param buffer String buffer to hold directory name.
* @param maxlength Maximum size of string buffer.
* @param type Optional variable to store the file type.
* @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);
/**
* Opens a file.
*
* @note Files are closed with CloseHandle().
* @note File Handles can be cloned.
* @note OpenFile() supports the "file://" notation.
*
* @param file File to open.
* @param mode Open mode.
* @return A Handle to the file, INVALID_HANDLE on open error.
*/
native Handle:OpenFile(const String:file[], const String:mode[]);
/**
* Deletes a file.
*
* @param path Path of the file to delete.
* @return True on success, false otherwise.
*/
native bool:DeleteFile(const String:path[]);
/**
* Reads a line from a text file.
*
* @param hndl Handle to the file.
* @param buffer String buffer to hold the line.
* @param maxlength Maximum size of string buffer.
* @return True on success, false otherwise.
*/
native bool:ReadFileLine(Handle:hndl, String:buffer[], maxlength);
/**
* Reads binary data from a file.
*
* @param hndl Handle to the file.
* @param items Array to store each item read.
* @param num_items Number of items to read into the array.
* @param size Size of each element, in bytes, to be read.
* Valid sizes are 1, 2, or 4.
* @return Number of elements read, or -1 on error.
*/
native ReadFile(Handle:hndl, items[], num_items, size);
/**
* Reads a UTF8 or ANSI string from a file.
*
* @param hndl Handle to the file.
* @param buffer Buffer to store the string.
* @param max_size Maximum size of the string buffer.
* @param stop If true, reading will stop once max_size-1 bytes have
* been read. If false, reading will stop once a NUL
* terminator is reached. The buffer will simply be
* terminated in either case, the difference is in how
* the far the file position is changed.
* @return Number of characters written to the buffer, or -1
* if an error was encountered.
* @error Invalid Handle, or read_count > max_size.
*/
native ReadFileString(Handle:hndl, String:buffer[], max_size, read_count=-1);
/**
* Writes binary data to a file.
*
* @param hndl Handle to the 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.
* @error Invalid Handle.
*/
native bool:WriteFile(Handle:hndl, const items[], num_items, size);
/**
* Writes a binary string to a file.
*
* @param hndl Handle to th efile.
* @param buffer String to write.
* @param term True to append NUL terminator, false otherwise.
* @return True on success, false on error.
* @error Invalid Handle.
*/
native bool:WriteFileString(Handle:hndl, const String: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.
* @error Invalid Handle.
*/
native bool:WriteFileLine(Handle:hndl, const String:format[], any:...);
/**
* Reads a single binary cell from a file.
*
* @param hndl Handle to the file.
* @param data Variable to store the data read.
* @param size Size of the data to read in bytes. Valid
* sizes are 1, 2, or 4 bytes.
* @return Number of elements read (max 1), or -1 on error.
* @error Invalid Handle.
*/
stock ReadFileCell(Handle:hndl, &data, size)
{
new array[1], ret;
if ((ret = ReadFile(hndl, array, 1, size)) == 1)
{
data = array[0];
}
return ret;
}
/**
* Writes a single binary cell to a file.
*
* @param hndl Handle to the file.
* @param data Cell to write to the file.
* @param size Size of the data to read in bytes. Valid
* sizes are 1, 2, or 4 bytes. If the size
* is less than 4 bytes, the data is truncated
* rather than casted. That is, only the lower
* bits will be read.
* @return True on success, false on error.
* @error Invalid Handle.
*/
stock bool:WriteFileCell(Handle:hndl, data, size)
{
new array[1];
array[0] = data;
return WriteFile(hndl, array, 1, size);
}
/**
* Tests if the end of file has been reached.
*
* @param file Handle to the file.
* @return True if end of file has been reached, false otherwise.
* @error Invalid Handle.
*/
native bool:IsEndOfFile(Handle:file);
/**
* Sets the file position indicator.
*
* @param file Handle to the file.
* @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.
* @error Invalid Handle.
*/
native bool:FileSeek(Handle:file, position, where);
/**
* Get current position in the file.
*
* @param file Handle to the file.
* @return Value for the file position indicator.
* @error Invalid Handle.
*/
native FilePosition(Handle:file);
/**
* Checks if a file exists.
*
* @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 check for the existance of files
* inside GCFs or the game cache, rather than solely files
* that are on disk.
* @return True if the file exists, false otherwise.
*/
native bool:FileExists(const String:path[], bool:use_valve_fs=false);
/**
* Renames a file.
*
* @param newpath New path to the file.
* @param oldpath Path to the existing file.
* @return True on success, false otherwise.
*/
native bool:RenameFile(const String:newpath[], const String:oldpath[]);
/**
* Checks if a directory exists.
*
* @param path Path to the directory.
* @return True if the directory exists, false otherwise.
*/
native bool:DirExists(const String:path[]);
/**
* Get the file size in bytes.
*
* @param path Path to the file.
* @return File size in bytes, -1 if file not found.
*/
native FileSize(const String:path[]);
/**
* 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.
*/
native FlushFile(Handle:file);
/**
* Removes a directory.
* @note On most Operating Systems you cannot remove a directory which has files inside it.
*
* @param path Path to the directory.
* @return True on success, false otherwise.
*/
native bool:RemoveDir(const String:path[]);
/**
* Returns a file timestamp as a unix timestamp.
*
* @param file File name.
* @param tmode Time mode.
* @return Time value, or -1 on failure.
*/
native GetFileTime(const String:file[], FileTimeMode:tmode);
/**
* Same as LogToFile(), except uses an open file Handle. The file must
* be opened in text appending mode.
*
* @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:...);
/**
* Same as LogToFileEx(), except uses an open file Handle. The file must
* be opened in text appending mode.
*
* @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:...);

415
src/include/float.inc Normal file
View File

@ -0,0 +1,415 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: float.inc 1942 2008-03-16 23:08:56Z dvander $
*/
#if defined _float_included
#endinput
#endif
#define _float_included
/**
* Converts an integer into a floating point value.
*
* @param value Integer to convert.
* @return Floating point value.
*/
native Float:float(value);
/**
* Multiplies two floats together.
*
* @param oper1 First value.
* @param oper2 Second value.
* @return oper1*oper2.
*/
native Float:FloatMul(Float:oper1, Float:oper2);
/**
* Divides the dividend by the divisor.
*
* @param dividend First value.
* @param divisor Second value.
* @return dividend/divisor.
*/
native Float:FloatDiv(Float:dividend, Float:divisor);
/**
* Adds two floats together.
*
* @param oper1 First value.
* @param oper2 Second value.
* @return oper1+oper2.
*/
native Float:FloatAdd(Float:oper1, Float:oper2);
/**
* Subtracts oper2 from oper1.
*
* @param oper1 First value.
* @param oper2 Second value.
* @return oper1-oper2.
*/
native Float:FloatSub(Float:oper1, Float:oper2);
/**
* Returns the decimal part of a float.
*
* @param value Input value.
* @return Decimal part.
*/
native Float:FloatFraction(Float:value);
/**
* Rounds a float to the closest integer to zero.
*
* @param value Input value to be rounded.
* @return Rounded value.
*/
native RoundToZero(Float:value);
/**
* Rounds a float to the next highest integer value.
*
* @param value Input value to be rounded.
* @return Rounded value.
*/
native RoundToCeil(Float:value);
/**
* Rounds a float to the next lowest integer value.
*
* @param value Input value to be rounded.
* @return Rounded value.
*/
native RoundToFloor(Float:value);
/**
* Standard IEEE rounding.
*
* @param value Input value to be rounded.
* @return Rounded value.
*/
native RoundToNearest(Float:value);
/**
* Compares two floats.
*
* @param fOne First value.
* @param fTwo Second value.
* @return Returns 1 if the first argument is greater than the second argument.
* Returns -1 if the first argument is smaller than the second argument.
* Returns 0 if both arguments are equal.
*/
native FloatCompare(Float:fOne, Float:fTwo);
/**
* Returns the square root of the input value, equivalent to floatpower(value, 0.5).
*
* @param value Input value.
* @return Square root of the value.
*/
native Float:SquareRoot(Float:value);
/**
* Returns the value raised to the power of the exponent.
*
* @param value Value to be raised.
* @param exponent Value to raise the base.
* @return value^exponent.
*/
native Float:Pow(Float:value, Float:exponent);
/**
* Returns the value of raising the input by e.
*
* @param value Input value.
* @return exp(value).
*/
native Float:Exponential(Float:value);
/**
* Returns the logarithm of any base specified.
*
* @param value Input value.
* @param base Logarithm base to use, default is 10.
* @return log(value)/log(base).
*/
native Float:Logarithm(Float:value, Float:base=10.0);
/**
* Returns the sine of the argument.
*
* @param value Input value in radians.
* @return sin(value).
*/
native Float:Sine(Float:value);
/**
* Returns the cosine of the argument.
*
* @param value Input value in radians.
* @return cos(value).
*/
native Float:Cosine(Float:value);
/**
* Returns the tangent of the argument.
*
* @param value Input value in radians.
* @return tan(value).
*/
native Float:Tangent(Float:value);
/**
* Returns an absolute value.
*
* @param value Input value.
* @return Absolute value of the input.
*/
native Float:FloatAbs(Float:value);
/**
* Returns the arctangent of the input value.
*
* @param angle Input value.
* @return atan(value) in radians.
*/
native Float:ArcTangent(Float:angle);
/**
* Returns the arccosine of the input value.
*
* @param angle Input value.
* @return acos(value) in radians.
*/
native Float:ArcCosine(Float:angle);
/**
* Returns the arcsine of the input value.
*
* @param angle Input value.
* @return asin(value) in radians.
*/
native Float:ArcSine(Float:angle);
/**
* Returns the arctangent2 of the input values.
*
* @param x Horizontal value.
* @param y Vertical value.
* @return atan2(value) in radians.
*/
native Float:ArcTangent2(Float:x, Float:y);
/**
* Rounds a floating point number using the "round to nearest" algorithm.
*
* @param value Floating point value to round.
* @return The value rounded to the nearest integer.
*/
stock RoundFloat(Float:value)
{
return RoundToNearest(value);
}
/**
* User defined operators.
*
*/
#pragma rational Float
native Float:operator*(Float:oper1, Float:oper2) = FloatMul;
native Float:operator/(Float:oper1, Float:oper2) = FloatDiv;
native Float:operator+(Float:oper1, Float:oper2) = FloatAdd;
native Float:operator-(Float:oper1, Float:oper2) = FloatSub;
stock Float:operator++(Float:oper)
{
return oper+1.0;
}
stock Float:operator--(Float:oper)
{
return oper-1.0;
}
stock Float:operator-(Float:oper)
{
return oper^Float:((-1)^((-1)/2)); /* IEEE values are sign/magnitude */
}
stock Float:operator*(Float:oper1, oper2)
{
return FloatMul(oper1, float(oper2)); /* "*" is commutative */
}
stock Float:operator/(Float:oper1, oper2)
{
return FloatDiv(oper1, float(oper2));
}
stock Float:operator/(oper1, Float:oper2)
{
return FloatDiv(float(oper1), oper2);
}
stock Float:operator+(Float:oper1, oper2)
{
return FloatAdd(oper1, float(oper2)); /* "+" is commutative */
}
stock Float:operator-(Float:oper1, oper2)
{
return FloatSub(oper1, float(oper2));
}
stock Float:operator-(oper1, Float:oper2)
{
return FloatSub(float(oper1), oper2);
}
stock bool:operator==(Float:oper1, Float:oper2)
{
return FloatCompare(oper1, oper2) == 0;
}
stock bool:operator==(Float:oper1, oper2)
{
return FloatCompare(oper1, float(oper2)) == 0; /* "==" is commutative */
}
stock bool:operator!=(Float:oper1, Float:oper2)
{
return FloatCompare(oper1, oper2) != 0;
}
stock bool:operator!=(Float:oper1, oper2)
{
return FloatCompare(oper1, float(oper2)) != 0; /* "==" is commutative */
}
stock bool:operator>(Float:oper1, Float:oper2)
{
return FloatCompare(oper1, oper2) > 0;
}
stock bool:operator>(Float:oper1, oper2)
{
return FloatCompare(oper1, float(oper2)) > 0;
}
stock bool:operator>(oper1, Float:oper2)
{
return FloatCompare(float(oper1), oper2) > 0;
}
stock bool:operator>=(Float:oper1, Float:oper2)
{
return FloatCompare(oper1, oper2) >= 0;
}
stock bool:operator>=(Float:oper1, oper2)
{
return FloatCompare(oper1, float(oper2)) >= 0;
}
stock bool:operator>=(oper1, Float:oper2)
{
return FloatCompare(float(oper1), oper2) >= 0;
}
stock bool:operator<(Float:oper1, Float:oper2)
{
return FloatCompare(oper1, oper2) < 0;
}
stock bool:operator<(Float:oper1, oper2)
{
return FloatCompare(oper1, float(oper2)) < 0;
}
stock bool:operator<(oper1, Float:oper2)
{
return FloatCompare(float(oper1), oper2) < 0;
}
stock bool:operator<=(Float:oper1, Float:oper2)
{
return FloatCompare(oper1, oper2) <= 0;
}
stock bool:operator<=(Float:oper1, oper2)
{
return FloatCompare(oper1, float(oper2)) <= 0;
}
stock bool:operator<=(oper1, Float:oper2)
{
return FloatCompare(float(oper1), oper2) <= 0;
}
stock bool:operator!(Float:oper)
{
return (_:oper & ((-1)/2)) == 0; /* -1 = all bits to 1; /2 = remove most significant bit (sign)
works on both 32bit and 64bit systems; no constant required */
}
/**
* Forbidden operators.
*
*/
forward operator%(Float:oper1, Float:oper2);
forward operator%(Float:oper1, oper2);
forward operator%(oper1, Float:oper2);
#define FLOAT_PI 3.1415926535897932384626433832795
/**
* Converts degrees to radians.
*
* @param angle Degrees.
* @return Radians.
*/
stock Float:DegToRad(Float:angle)
{
return (angle*FLOAT_PI)/180;
}
/**
* Converts degrees to radians.
*
* @param angle Radians.
* @return Degrees.
*/
stock Float:RadToDeg(Float:angle)
{
return (angle*180)/FLOAT_PI;
}

489
src/include/functions.inc Normal file
View File

@ -0,0 +1,489 @@
/**
* 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: functions.inc 2360 2008-07-06 00:01:40Z dvander $
*/
#define SP_PARAMFLAG_BYREF (1<<0) /**< Internal use only. */
/**
* Describes the various ways to pass parameters to functions or forwards.
*/
enum ParamType
{
Param_Any = 0, /**< Any data type can be pushed */
Param_Cell = (1<<1), /**< Only basic cells can be pushed */
Param_Float = (2<<1), /**< Only floats can be pushed */
Param_String = (3<<1)|SP_PARAMFLAG_BYREF, /**< Only strings can be pushed */
Param_Array = (4<<1)|SP_PARAMFLAG_BYREF, /**< Only arrays can be pushed */
Param_VarArgs = (5<<1), /**< Same as "..." in plugins, anything can be pushed, but it will always be byref */
Param_CellByRef = (1<<1)|SP_PARAMFLAG_BYREF, /**< Only a cell by reference can be pushed */
Param_FloatByRef = (2<<1)|SP_PARAMFLAG_BYREF /**< Only a float by reference can be pushed */
};
/**
* Defines how a forward iterates through plugin functions.
*/
enum ExecType
{
ET_Ignore = 0, /**< Ignore all return values, return 0 */
ET_Single = 1, /**< Only return the last exec, ignore all others */
ET_Event = 2, /**< Acts as an event with the Actions defined in core.inc, no mid-Stops allowed, returns highest */
ET_Hook = 3 /**< Acts as a hook with the Actions defined in core.inc, mid-Stops allowed, returns highest */
};
/**
* @section Flags that are used with Call_PushArrayEx() and Call_PushStringEx()
*/
#define SM_PARAM_COPYBACK (1<<0) /**< Copy an array/reference back after call */
#define SM_PARAM_STRING_UTF8 (1<<0) /**< String should be UTF-8 handled */
#define SM_PARAM_STRING_COPY (1<<1) /**< String should be copied into the plugin */
#define SM_PARAM_STRING_BINARY (1<<2) /**< Treat the string as a binary string */
/**
* @endsection
*/
/**
* @section Error codes
*/
#define SP_ERROR_NONE 0 /**< No error occurred */
#define SP_ERROR_FILE_FORMAT 1 /**< File format unrecognized */
#define SP_ERROR_DECOMPRESSOR 2 /**< A decompressor was not found */
#define SP_ERROR_HEAPLOW 3 /**< Not enough space left on the heap */
#define SP_ERROR_PARAM 4 /**< Invalid parameter or parameter type */
#define SP_ERROR_INVALID_ADDRESS 5 /**< A memory address was not valid */
#define SP_ERROR_NOT_FOUND 6 /**< The object in question was not found */
#define SP_ERROR_INDEX 7 /**< Invalid index parameter */
#define SP_ERROR_STACKLOW 8 /**< Nnot enough space left on the stack */
#define SP_ERROR_NOTDEBUGGING 9 /**< Debug mode was not on or debug section not found */
#define SP_ERROR_INVALID_INSTRUCTION 10 /**< Invalid instruction was encountered */
#define SP_ERROR_MEMACCESS 11 /**< Invalid memory access */
#define SP_ERROR_STACKMIN 12 /**< Stack went beyond its minimum value */
#define SP_ERROR_HEAPMIN 13 /**< Heap went beyond its minimum value */
#define SP_ERROR_DIVIDE_BY_ZERO 14 /**< Division by zero */
#define SP_ERROR_ARRAY_BOUNDS 15 /**< Array index is out of bounds */
#define SP_ERROR_INSTRUCTION_PARAM 16 /**< Instruction had an invalid parameter */
#define SP_ERROR_STACKLEAK 17 /**< A native leaked an item on the stack */
#define SP_ERROR_HEAPLEAK 18 /**< A native leaked an item on the heap */
#define SP_ERROR_ARRAY_TOO_BIG 19 /**< A dynamic array is too big */
#define SP_ERROR_TRACKER_BOUNDS 20 /**< Tracker stack is out of bounds */
#define SP_ERROR_INVALID_NATIVE 21 /**< Native was pending or invalid */
#define SP_ERROR_PARAMS_MAX 22 /**< Maximum number of parameters reached */
#define SP_ERROR_NATIVE 23 /**< Error originates from a native */
#define SP_ERROR_NOT_RUNNABLE 24 /**< Function or plugin is not runnable */
#define SP_ERROR_ABORTED 25 /**< Function call was aborted */
/**
* @endsection
*/
/**
* Gets a function id from a function name.
*
* @param plugin Handle of the plugin that contains the function.
Pass INVALID_HANDLE to search in the calling plugin.
* @param name Name of the function.
* @return Function id or INVALID_FUNCTION if not found.
* @error Invalid or corrupt plugin handle.
*/
native Function:GetFunctionByName(Handle:plugin, const String:name[]);
/**
* Creates a global forward.
*
* @note The name used to create the forward is used as its public function in all target plugins.
* @note This is ideal for global, static forwards that are never changed.
* @note Global forwards cannot be cloned.
* @note Use CloseHandle() to destroy these.
*
* @param name Name of public function to use in forward.
* @param type Execution type to be used.
* @param ... Variable number of parameter types (up to 32).
* @return Handle to new global forward.
* @error More than 32 paramater types passed.
*/
native Handle:CreateGlobalForward(const String:name[], ExecType:type, ParamType:...);
/**
* Creates a private forward.
*
* @note No functions are automatically added. Use AddToForward() to do this.
* @note Private forwards can be cloned.
* @note Use CloseHandle() to destroy these.
*
* @param type Execution type to be used.
* @param ... Variable number of parameter types (up to 32).
* @return Handle to new private forward.
* @error More than 32 paramater types passed.
*/
native Handle:CreateForward(ExecType:type, ParamType:...);
/**
* Returns the number of functions in a global or private forward's call list.
*
* @param fwd Handle to global or private forward.
* @return Number of functions in forward.
* @error Invalid or corrupt forward handle.
*/
native GetForwardFunctionCount(Handle:fwd);
/**
* Adds a function to a private forward's call list.
*
* @note Cannot be used during an incompleted call.
*
* @param fwd Handle to private forward.
* @param plugin Handle of the plugin that contains the function.
* Pass INVALID_HANDLE to specify the calling plugin.
* @param func Function to add to forward.
* @return True on success, false otherwise.
* @error Invalid or corrupt private forward handle, invalid or corrupt plugin handle, or invalid function.
*/
native bool:AddToForward(Handle:fwd, Handle:plugin, Function:func);
/**
* Removes a function from a private forward's call list.
*
* @note Only removes one instance.
* @note Functions will be removed automatically if their parent plugin is unloaded.
*
* @param fwd Handle to private forward.
* @param plugin Handle of the plugin that contains the function.
* Pass INVALID_HANDLE to specify the calling plugin.
* @param func Function to remove from forward.
* @return True on success, false otherwise.
* @error Invalid or corrupt private forward handle, invalid or corrupt plugin handle, or invalid function.
*/
native bool:RemoveFromForward(Handle:fwd, Handle:plugin, Function:func);
/**
* Removes all instances of a plugin from a private forward's call list.
*
* @note Functions will be removed automatically if their parent plugin is unloaded.
*
* @param fwd Handle to private forward.
* @param plugin Handle of the plugin to remove instances of.
* Pass INVALID_HANDLE to specify the calling plugin.
* @return Number of functions removed from forward.
* @error Invalid or corrupt private forward handle or invalid or corrupt plugin handle.
*/
native RemoveAllFromForward(Handle:fwd, Handle:plugin);
/**
* Starts a call to functions in a forward's call list.
*
* @note Cannot be used during an incompleted call.
*
* @param fwd Handle to global or private forward.
* @noreturn
* @error Invalid or corrupt forward handle or called before another call has completed.
*/
native Call_StartForward(Handle:fwd);
/**
* Starts a call to a function.
*
* @note Cannot be used during an incompleted call.
*
* @param plugin Handle of the plugin that contains the function.
* Pass INVALID_HANDLE to specify the calling plugin.
* @param func Function to call.
* @noreturn
* @error Invalid or corrupt plugin handle, invalid function, or called before another call has completed.
*/
native Call_StartFunction(Handle:plugin, Function:func);
/**
* Pushes a cell onto the current call.
*
* @note Cannot be used before a call has been started.
*
* @param value Cell value to push.
* @noreturn
* @error Called before a call has been started.
*/
native Call_PushCell(any:value);
/**
* Pushes a cell by reference onto the current call.
*
* @note Cannot be used before a call has been started.
*
* @param value Cell reference to push.
* @noreturn
* @error Called before a call has been started.
*/
native Call_PushCellRef(&any:value);
/**
* Pushes a float onto the current call.
*
* @note Cannot be used before a call has been started.
*
* @param value Floating point value to push.
* @noreturn
* @error Called before a call has been started.
*/
native Call_PushFloat(Float:value);
/**
* Pushes a float by reference onto the current call.
*
* @note Cannot be used before a call has been started.
*
* @param value Floating point reference to push.
* @noreturn
* @error Called before a call has been started.
*/
native Call_PushFloatRef(&Float:value);
/**
* Pushes an array onto the current call.
*
* @note Changes to array are not copied back to caller. Use PushArrayEx() to do this.
* @note Cannot be used before a call has been started.
*
* @param value Array to push.
* @param size Size of array.
* @noreturn
* @error Called before a call has been started.
*/
native Call_PushArray(const any:value[], size);
/**
* Pushes an array onto the current call.
*
* @note Cannot be used before a call has been started.
*
* @param value Array to push.
* @param size Size of array.
* @param cpflags Whether or not changes should be copied back to the input array.
* See SP_PARAM_* constants for details.
* @noreturn
* @error Called before a call has been started.
*/
native Call_PushArrayEx(any:value[], size, cpflags);
/**
* Pushes a string onto the current call.
*
* @note Changes to string are not copied back to caller. Use PushStringEx() to do this.
* @note Cannot be used before a call has been started.
*
* @param value String to push.
* @noreturn
* @error Called before a call has been started.
*/
native Call_PushString(const String:value[]);
/**
* Pushes a string onto the current call.
*
* @note Cannot be used before a call has been started.
*
* @param value String to push.
* @param length Length of string buffer.
* @param szflags Flags determining how string should be handled.
* See SP_PARAM_STRING_* constants for details.
* The default (0) is to push ASCII.
* @param cpflags Whether or not changes should be copied back to the input array.
* See SP_PARAM_* constants for details.
* @noreturn
* @error Called before a call has been started.
*/
native Call_PushStringEx(String:value[], length, szflags, cpflags);
/**
* Completes a call to a function or forward's call list.
*
* @note Cannot be used before a call has been started.
*
* @param result Return value of function or forward's call list.
* @return SP_ERROR_NONE on success, any other integer on failure.
* @error Called before a call has been started.
*/
native Call_Finish(&any:result=0);
/**
* Cancels a call to a function or forward's call list.
*
* @note Cannot be used before a call has been started.
*
* @noreturn
* @error Called before a call has been started.
*/
native Call_Cancel();
/**
* Defines a native function.
*
* It is not necessary to validate the parameter count
*
* @param plugin Handle of the calling plugin.
* @param numParams Number of parameters passed to the native.
* @return Value for the native call to return.
*/
functag NativeCall public(Handle:plugin, numParams);
/**
* Creates a dynamic native. This should only be called in AskPluginLoad(), or
* else you risk not having your native shared with other plugins.
*
* @param name Name of the dynamic native; must be unique amongst
* all other registered dynamic natives.
* @param func Function to use as the dynamic native.
* @noreturn
*/
native CreateNative(const String:name[], NativeCall:func);
/**
* Throws an error in the calling plugin of a native, instead of your own plugin.
*
* @param error Error code to use.
* @param fmt Error message format.
* @param ... Format arguments.
*/
native ThrowNativeError(error, const String:fmt[], any:...);
/**
* Retrieves the string length from a native parameter string. This is useful
* fetching the entire string using dynamic arrays.
* @note If this function succeeds, Get/SetNativeString will also succeed.
*
* @param param Parameter number, starting from 1.
* @param length Stores the length of the string.
* @return SP_ERROR_NONE on success, any other integer on failure.
* @error Invalid parameter number or calling from a non-native function.
*/
native GetNativeStringLength(param, &length);
/**
* Retrieves a string from a native parameter.
* @note Output conditions are undefined on failure.
*
* @param param Parameter number, starting from 1.
* @param buffer Buffer to store the string in.
* @param maxlength Maximum length of the buffer.
* @param bytes Optionally store the number of bytes written.
* @return SP_ERROR_NONE on success, any other integer on failure.
* @error Invalid parameter number or calling from a non-native function.
*/
native GetNativeString(param, String:buffer[], maxlength, &bytes=0);
/**
* Sets a string in a native parameter.
* @note Output conditions are undefined on failure.
*
* @param param Parameter number, starting from 1.
* @param source Source string to use.
* @param maxlength Maximum number of bytes to write.
* @param utf8 If false, string will not be written
* with UTF8 safety.
* @param bytes Optionally store the number of bytes written.
* @return SP_ERROR_NONE on success, any other integer on failure.
* @error Invalid parameter number or calling from a non-native function.
*/
native SetNativeString(param, const String:source[], maxlength, bool:utf8=true, &bytes=0);
/**
* Gets a cell from a native parameter.
*
* @param param Parameter number, starting from 1.
* @return Cell value at the parameter number.
* @error Invalid parameter number or calling from a non-native function.
*/
native any:GetNativeCell(param);
/**
* Gets a cell from a native parameter, by reference.
*
* @param param Parameter number, starting from 1.
* @return Cell value at the parameter number.
* @error Invalid parameter number or calling from a non-native function.
*/
native any:GetNativeCellRef(param);
/**
* Sets a cell from a native parameter, by reference.
*
* @param param Parameter number, starting from 1.
* @param value Cell value at the parameter number to set by reference.
* @noreturn
* @error Invalid parameter number or calling from a non-native function.
*/
native SetNativeCellRef(param, any:value);
/**
* Gets an array from a native parameter (always by reference).
*
* @param param Parameter number, starting from 1.
* @param local Local array to copy into.
* @param size Maximum size of local array.
* @return SP_ERROR_NONE on success, anything else on failure.
* @error Invalid parameter number or calling from a non-native function.
*/
native GetNativeArray(param, any:local[], size);
/**
* Copies a local array into a native parameter array (always by reference).
*
* @param param Parameter number, starting from 1.
* @param local Local array to copy from.
* @param size Size of the local array to copy.
* @return SP_ERROR_NONE on success, anything else on failure.
* @error Invalid parameter number or calling from a non-native function.
*/
native SetNativeArray(param, const any:local[], size);
/**
* Formats a string using parameters from a native.
*
* @note All parameter indexes start at 1.
* @note If the input and output buffers overlap, the contents
* of the output buffer at the end is undefined.
*
* @param out_param Output parameter number to write to. If 0, out_string is used.
* @param fmt_param Format parameter number. If 0, fmt_string is used.
* @param vararg_param First variable parameter number.
* @param out_len Output string buffer maximum length (always required).
* @param written Optionally stores the number of bytes written.
* @param out_string Output string buffer to use if out_param is not used.
* @param fmt_string Format string to use if fmt_param is not used.
* @return SP_ERROR_NONE on success, anything else on failure.
*/
native FormatNativeString(out_param,
fmt_param,
vararg_param,
out_len,
&written=0,
String:out_string[]="",
const String:fmt_string[]="");

102
src/include/geoip.inc Normal file
View File

@ -0,0 +1,102 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: geoip.inc 1579 2007-10-15 04:27:56Z dvander $
*/
#if defined _geoip_included
#endinput
#endif
#define _geoip_included
#include <core>
/**
* @section IP addresses can contain ports, the ports will be stripped out.
*/
/**
* Gets the two character country code from an IP address. (US, CA, etc)
*
* @param ip Ip to determine the country code.
* @param ccode Destination string buffer to store the code.
* @return True on success, false if no country found.
*/
native bool:GeoipCode2(const String:ip[], String:ccode[3]);
/**
* Gets the three character country code from an IP address. (USA, CAN, etc)
*
* @param ip Ip to determine the country code.
* @param ccode Destination string buffer to store the code.
* @return True on success, false if no country found.
*/
native bool:GeoipCode3(const String:ip[], String:ccode[4]);
/**
* Gets the full country name. (max length of output string is 45)
*
* @param ip Ip to determine the country code.
* @param ccode Destination string buffer to store the country name.
* @param len Maximum length of output string buffer.
* @return True on success, false if no country found.
*/
native bool:GeoipCountry(const String:ip[], String:name[], maxlength);
/**
* @endsection
*/
/**
* Do not edit below this line!
*/
public Extension:__ext_geoip =
{
name = "GeoIP",
file = "geoip.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_geoip_SetNTVOptional()
{
MarkNativeAsOptional("GeoipCode2");
MarkNativeAsOptional("GeoipCode3");
MarkNativeAsOptional("GeoipCountry");
}
#endif

199
src/include/hacks.inc Normal file
View File

@ -0,0 +1,199 @@
#if defined _hacks_included
#endinput
#endif
#define _hacks_included
#include <core>
// Version: 1.3.0.0
#define Hacks_Continue -54321
enum Hacks_HookType
{
HACKS_HTYPE_SPAWN=0,
HACKS_HTYPE_TRACEATTACK,
HACKS_HTYPE_ONTAKEDAMAGE,
HACKS_HTYPE_EVENT_KILLED,
HACKS_HTYPE_STARTTOUCH,
HACKS_HTYPE_TOUCH,
HACKS_HTYPE_ENDTOUCH,
HACKS_HTYPE_UPDATEONREMOVE,
HACKS_HTYPE_WEAPON_CANUSE,
HACKS_HTYPE_WEAPON_DROP,
HACKS_HTYPE_WEAPON_CANSWITCHTO,
HACKS_HTYPE_COMMITSUICIDE,
HACKS_HTYPE_IMPULSECOMMANDS,
HACKS_HTYPE_PLAYERRUNCOMMAND
};
enum Hacks_CallType
{
HACKS_CTYPE_ENTITY=0,
HACKS_CTYPE_COLLISIONPROP,
HACKS_CTYPE_PHYSICSOBJECT,
HACKS_CTYPE_EVENTQUEUE,
HACKS_CTYPE_GAMERULES
};
enum Hacks_ReturnType
{
HACKS_RTYPE_VOID=0,
HACKS_RTYPE_INT,
HACKS_RTYPE_FLOAT,
HACKS_RTYPE_EDICT,
HACKS_RTYPE_ENTITY
};
enum Hacks_Param
{
HACKS_PARAM_NULL=0,
HACKS_PARAM_INT,
HACKS_PARAM_FLOAT,
HACKS_PARAM_STRING,
HACKS_PARAM_VECTOR, // Pointer
HACKS_PARAM_QANGLE, // Pointer
HACKS_PARAM_EDICT,
HACKS_PARAM_ENTITY,
HACKS_PARAM_PHYSICSOBJECT
};
/**
* Callback for a hooked function.
*
* @param entity Index of the entity that was hooked.
* @param arg1
* @param arg2
* @param arg3
* @param arg4
* @param arg5
* @return Hacks_Continue, other = Supercede the
* function and return the value.
*/
functag Hacks_HookFunc public(entity, arg1, arg2, arg3, arg4, arg5);
/**
* Hooks a virtual function.
*
* @param entity Index of the entity.
* @param type Type of the function, see Hacks_HookType.
* @param handler Your function that will be called on hooking.
* @param post True for post operation, false for pre operation.
* @return HookID, that's needed to unhook.
*/
native Hacks_Hook(entity, Hacks_HookType:type, Hacks_HookFunc:func, bool:post=false);
/**
* Unhooks a virtual function.
*
* @param hookid The returned hookid from Hacks_Hook.
* @noreturn
*/
native Hacks_Unhook(hookid);
/**
* Scans for a function in the memory.
*
* @param name Name of the function (e.g. "CBaseAnimating::Ignite").
* @param signature Signature to scan for (Windows). 2A = wildcard
* (e.g. "56 8B 74 24 0C 83 FE FF 57 8B 7C 24 0C 74 25 8B")
* @param symbol Symbol to scan for (Linux).
* @return CallID, that's needed to call the function.
*/
native Hacks_Find(const String:name[], const String:signature[], const String:symbol[]);
/**
* Calls a previously scanned function.
*
* @param entity Index of the entity.
* @param callid The returned callid from Hacks_Find.
* @param calltype Type to call, see Hacks_CallType.
* @param returntype Return type, see Hacks_ReturnType.
* @param[x] argtype Datatype of argument, see Hacks_Param.
* @param[y] arg Argument for function.
* @return If there was a failure in the function, it will return -1,
* otherwise see Hacks_ReturnType.
*/
native Hacks_Call(entity, callid, Hacks_CallType:calltype, Hacks_ReturnType:returntype, any:...);
/**
* Calls a virtual function by its offset.
*
* @param entity Index of the entity.
* @param windows Windows offset.
* @param linux Linux offset.
* @param calltype Type to call, see Hacks_CallType.
* @param returntype Return type, see Hacks_ReturnType.
* @param[x] argtype Datatype of argument, see Hacks_Param.
* @param[y] arg Argument for function.
* @return If there was a failure in the function, it will return -1,
* otherwise see Hacks_ReturnType.
*/
native Hacks_Call_Offset(entity, windows, linux, Hacks_CallType:calltype, Hacks_ReturnType:returntype, any:...);
/**
* Calls a previously scanned function, but without an entity.
*
* @param callid The returned callid from Hacks_Find.
* @param returntype Return type, see Hacks_ReturnType.
* @param[x] argtype Datatype of argument, see Hacks_Param.
* @param[y] arg Argument for function.
* @return If there was a failure in the function, it will return -1,
* otherwise see Hacks_ReturnType.
*/
native Hacks_Call_NoEntity(callid, Hacks_ReturnType:returntype, any:...);
/**
* Adds a file to be force downloaded (cleared every map change).
*
* @param ... Each argument = One file that will be added.
* @noreturn
*/
native Hacks_AddDownload(const String:...);
/**
* Creates a patch that you can use with Hacks_Patch/Hacks_Unpatch
*
* @param callid The returned callid from Hacks_Find.
* @param windows_bytes New Bytes (eg "C2 08 00")
* @param windows_offset Offset (addr to patch = func_addr + offset)
* @param linux_bytes
* @param linux_offset
* @return PatchID, that's needed to patch/unpatch.
*/
native Hacks_CreatePatch(callid, const String:windows_bytes[], windows_offset, const String:linux_bytes[], linux_offset);
/**
* Writes new bytes to a given address
*
* @param patchid The returned patchid from Hacks_CreatePatch.
* @noreturn
*/
native Hacks_Patch(patchid);
/**
* Writes the original bytes to a given address
*
* @param patchid The returned patchid from Hacks_CreatePatch.
* @noreturn
*/
native Hacks_Unpatch(patchid);
/**
* Do not edit below this line!
*/
public Extension:__ext_hacks =
{
name = "Hacks Extension",
file = "hacks.ext",
#if defined AUTOLOAD_EXTENSIONS
autoload = 1,
#else
autoload = 0,
#endif
#if defined REQUIRE_EXTENSIONS
required = 1,
#else
required = 0,
#endif
};

544
src/include/halflife.inc Normal file
View File

@ -0,0 +1,544 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: halflife.inc 1921 2008-03-02 23:54:38Z dvander $
*/
#if defined _halflife_included
#endinput
#endif
#define _halflife_included
#define SOURCE_SDK_UNKNOWN 0 /**< Could not determine the engine version */
#define SOURCE_SDK_ORIGINAL 10 /**< Original Source engine (still used by "The Ship") */
#define SOURCE_SDK_EPISODE1 20 /**< SDK+Engine released after Episode 1 */
#define SOURCE_SDK_EPISODE2 30 /**< Engine released after Episode 2 (no SDK yet) */
#define MOTDPANEL_TYPE_TEXT 0 /**< Treat msg as plain text */
#define MOTDPANEL_TYPE_INDEX 1 /**< Msg is auto determined by the engine */
#define MOTDPANEL_TYPE_URL 2 /**< Treat msg as an URL link */
#define MOTDPANEL_TYPE_FILE 3 /**< Treat msg as a filename to be openned */
enum DialogType
{
DialogType_Msg = 0, /**< just an on screen message */
DialogType_Menu, /**< an options menu */
DialogType_Text, /**< a richtext dialog */
DialogType_Entry, /**< an entry box */
DialogType_AskConnect /**< ask the client to connect to a specified IP */
};
/**
* Logs a generic message to the HL2 logs.
*
* @param format String format.
* @param ... Format arguments.
* @noreturn
*/
native LogToGame(const String:format[], any:...);
/**
* Sets the seed value for the global Half-Life 2 Random Stream.
*
* @param seed Seed value.
* @noreturn
*/
native SetRandomSeed(seed);
/**
* Returns a random floating point number from the Half-Life 2 Random Stream.
*
* @param fMin Minimum random bound.
* @param fMax Maximum random bound.
* @return A random number between (inclusive) fMin and fMax.
*/
native Float:GetRandomFloat(Float:fMin=0.0, Float:fMax=1.0);
/**
* Returns a random number from the Half-Life 2 Random Stream.
*
* @param nmin Minimum random bound.
* @param nmax Maximum random bound.
* @return A random number between (inclusive) nmin and nmax.
*/
native GetRandomInt(nmin, nmax);
/**
* Returns whether a map is valid or not.
*
* @param Map name, excluding .bsp extension.
* @return True if valid, false otherwise.
*/
native bool:IsMapValid(const String:map[]);
/**
* Returns whether the server is dedicated.
*
* @return True if dedicated, false otherwise.
*/
native bool:IsDedicatedServer();
/**
* Returns a high-precision time value for profiling the engine.
*
* @return A floating point time value.
*/
native Float:GetEngineTime();
/**
* Returns the game time based on the game tick.
*
* @return Game tick time.
*/
native Float:GetGameTime();
/**
* Returns the game description from the mod.
*
* @param buffer Buffer to store the description.
* @param maxlength Maximum size of the buffer.
* @param original If true, retrieves the original game description,
* ignoring any potential hooks from plugins.
* @return Number of bytes written to the buffer (UTF-8 safe).
*/
native GetGameDescription(String:buffer[], maxlength, bool:original=false);
/**
* Returns the name of the game's directory.
*
* @param buffer Buffer to store the directory name.
* @param maxlength Maximum size of the buffer.
*
* return Number of bytes written to the buffer (UTF-8 safe).
*/
native GetGameFolderName(String:buffer[], maxlength);
/**
* Returns the current map name.
*
* @param buffer Buffer to store map name.
* @param maxlength Maximum length of buffer.
* @return Number of bytes written (UTF-8 safe).
*/
native GetCurrentMap(String:buffer[], maxlength);
/**
* Precaches a given model.
*
* @param model Name of the model to precache.
* @param preload If preload is true the file will be precached before level startup.
* @return Returns the model index, 0 for error.
*/
native PrecacheModel(const String:model[], bool:preload=false);
/**
* Precaches a given sentence file.
*
* @param file Name of the sentence file to precache.
* @param preload If preload is true the file will be precached before level startup.
* @return Returns a sentence file index.
*/
native PrecacheSentenceFile(const String:file[], bool:preload=false);
/**
* Precaches a given decal.
*
* @param decal Name of the decal to precache.
* @param preload If preload is true the file will be precached before level startup.
* @return Returns a decal index.
*/
native PrecacheDecal(const String:decal[], bool:preload=false);
/**
* Precaches a given generic file.
*
* @param generic Name of the generic file to precache.
* @param preload If preload is true the file will be precached before level startup.
* @return Returns a generic file index.
*/
native PrecacheGeneric(const String:generic[], bool:preload=false);
/**
* Returns if a given model is precached.
*
* @param model Name of the model to check.
* @return True if precached, false otherwise.
*/
native bool:IsModelPrecached(const String:model[]);
/**
* Returns if a given decal is precached.
*
* @param decal Name of the decal to check.
* @return True if precached, false otherwise.
*/
native bool:IsDecalPrecached(const String:decal[]);
/**
* Returns if a given generic file is precached.
*
* @param decal Name of the generic file to check.
* @return True if precached, false otherwise.
*/
native bool:IsGenericPrecached(const String:generic[]);
/**
* Precaches a given sound.
*
* @param sound Name of the sound to precache.
* @param preload If preload is true the file will be precached before level startup.
* @return True if successfully precached, false otherwise.
*/
native bool:PrecacheSound(const String:sound[], bool:preload=false);
/**
* Returns if a given sound is precached.
*
* @param sound Name of the sound to check.
* @return True if precached, false otherwise.
*/
native bool:IsSoundPrecached(const String:sound[]);
/**
* Creates different types of ingame messages.
*
* @param client Index of the client.
* @param kv KeyValues handle to set the menu keys and options. (Check iserverplugin.h for more information).
* @param type Message type to display ingame.
* @noreturn
* @error Invalid client index, or client not connected.
*/
native CreateDialog(client, Handle:kv, DialogType:type);
/**
* Guesses the SDK version a mod was compiled against. If nothing
* specific is known about the game, the engine version is used instead.
*
* The return values are guaranteed to increase chronologically (that is,
* a later release will have a higher value).
*
* @return SOURCE_SDK version code.
*/
native GuessSDKVersion();
/**
* Prints a message to a specific client in the chat area.
*
* @param client Client index.
* @param format Formatting rules.
* @param ... Variable number of format parameters.
* @noreturn
* @error If the client is not connected an error will be thrown.
*/
native PrintToChat(client, const String:format[], any:...);
/**
* Prints a message to all clients in the chat area.
*
* @param format Formatting rules.
* @param ... Variable number of format parameters.
* @noreturn
*/
stock PrintToChatAll(const String:format[], any:...)
{
new maxClients = GetMaxClients();
decl String:buffer[192];
for (new i = 1; i <= maxClients; i++)
{
if (IsClientInGame(i))
{
SetGlobalTransTarget(i);
VFormat(buffer, sizeof(buffer), format, 2);
PrintToChat(i, "%s", buffer);
}
}
}
/**
* Prints a message to a specific client in the center of the screen.
*
* @param client Client index.
* @param format Formatting rules.
* @param ... Variable number of format parameters.
* @noreturn
* @error If the client is not connected an error will be thrown.
*/
native PrintCenterText(client, const String:format[], any:...);
/**
* Prints a message to all clients in the center of the screen.
*
* @param format Formatting rules.
* @param ... Variable number of format parameters.
* @noreturn
*/
stock PrintCenterTextAll(const String:format[], any:...)
{
new maxClients = GetMaxClients();
decl String:buffer[192];
for (new i = 1; i <= maxClients; i++)
{
if (IsClientInGame(i))
{
SetGlobalTransTarget(i);
VFormat(buffer, sizeof(buffer), format, 2);
PrintCenterText(i, "%s", buffer);
}
}
}
/**
* Prints a message to a specific client with a hint box.
*
* @param client Client index.
* @param format Formatting rules.
* @param ... Variable number of format parameters.
* @noreturn
* @error If the client is not connected an error will be thrown.
*/
native PrintHintText(client, const String:format[], any:...);
/**
* Prints a message to all clients with a hint box.
*
* @param format Formatting rules.
* @param ... Variable number of format parameters.
* @noreturn
*/
stock PrintHintTextToAll(const String:format[], any:...)
{
new maxClients = GetMaxClients();
decl String:buffer[192];
for (new i = 1; i <= maxClients; i++)
{
if (IsClientInGame(i))
{
SetGlobalTransTarget(i);
VFormat(buffer, sizeof(buffer), format, 2);
PrintHintText(i, "%s", buffer);
}
}
}
/**
* Shows a VGUI panel to a specific client.
*
* @param client Client index.
* @param name Panel type name (Check viewport_panel_names.h to see a list of
* some panel names).
* @param Kv KeyValues handle with all the data for the panel setup (Depends
* on the panel type and may be unused).
* @param show True to show the panel, or false to remove it from the client screen.
* @noreturn
* @error If the client is not connected an error will be thrown.
*/
native ShowVGUIPanel(client, const String:name[], Handle:Kv=INVALID_HANDLE, bool:show=true);
/**
* Creates a HUD synchronization object. This object is used to automatically assign and
* re-use channels for a set of messages.
*
* The HUD has a hardcoded number of channels (usually 6) for displaying
* text. You can use any channel for any area of the screen. Text on
* different channels can overlap, but text on the same channel will
* erase the old text first. This overlapping and overwriting gets problematic.
*
* A HUD synchronization object automatically selects channels for you based on
* the following heuristics:
* - If channel X was last used by the object, and hasn't been modified again,
* channel X gets re-used.
* - Otherwise, a new channel is chosen based on the least-recently-used channel.
*
* This ensures that if you display text on a sync object, that the previous text
* displayed on it will always be cleared first. This is because your new text
* will either overwrite the old text on the same channel, or because another
* channel has already erased your text.
*
* Note that messages can still overlap if they are on different synchronization
* objects, or they are displayed to manual channels.
*
* These are particularly useful for displaying repeating or refreshing HUD text, in
* addition to displaying multiple message sets in one area of the screen (for example,
* center-say messages that may pop up randomly that you don't want to overlap each
* other).
*
* @return New HUD synchronization object.
* The Handle can be closed with CloseHandle().
* If HUD text is not supported on this mod, then
* INVALID_HANDLE is returned.
*/
native Handle:CreateHudSynchronizer();
/**
* Sets the HUD parameters for drawing text. These parameters are stored
* globally, although nothing other than this function and SetHudTextParamsEx
* modify them.
*
* You must call this function before drawing text. If you are drawing
* text to multiple clients, you can set the parameters once, since
* they won't be modified. However, as soon as you pass control back
* to other plugins, you must reset the parameters next time you draw.
*
* @param x x coordinate, from 0 to 1. -1.0 is the center.
* @param y y coordinate, from 0 to 1. -1.0 is the center.
* @param holdTime Number of seconds to hold the text.
* @param r Red color value.
* @param g Green color value.
* @param b Blue color value.
* @param a Alpha transparency value.
* @param effect 0/1 causes the text to fade in and fade out.
* 2 causes the text to flash[?].
* @param fxTime Duration of chosen effect (may not apply to all effects).
* @param fadeIn Number of seconds to spend fading in.
* @param fadeOut Number of seconds to spend fading out.
* @noreturn
*/
native SetHudTextParams(Float:x, Float:y, Float:holdTime, r, g, b, a, effect = 0,
Float:fxTime=6.0, Float:fadeIn=0.1, Float:fadeOut=0.2);
/**
* Sets the HUD parameters for drawing text. These parameters are stored
* globally, although nothing other than this function and SetHudTextParams
* modify them.
*
* This is the same as SetHudTextParams(), except it lets you set the alternate
* color for when effects require it.
*
* @param x x coordinate, from 0 to 1. -1.0 is the center.
* @param y y coordinate, from 0 to 1. -1.0 is the center.
* @param holdTime Number of seconds to hold the text.
* @param color1 First color set, array values being [red, green, blue, alpha]
* @param color2 Second color set, array values being [red, green, blue, alpha]
* @param effect 0/1 causes the text to fade in and fade out.
* 2 causes the text to flash[?].
* @param fxTime Duration of chosen effect (may not apply to all effects).
* @param fadeIn Number of seconds to spend fading in.
* @param fadeOut Number of seconds to spend fading out.
* @noreturn
*/
native SetHudTextParamsEx(Float:x, Float:y, Float:holdTime, color1[4],
color2[4]={255,255,255,0}, effect = 0, Float:fxTime=6.0,
Float:fadeIn=0.1, Float:fadeOut=0.2);
/**
* Shows a synchronized HUD message to a client.
*
* As of this writing, only TF, HL2MP, and SourceForts support HUD Text.
*
* @param client Client index to send the message to.
* @param sync Synchronization object.
* @param message Message text or formatting rules.
* @param ... Message formatting parameters.
* @return -1 on failure, anything else on success.
* This function fails if the mod does not support it.
* @error Client not in-game, or sync object not valid.
*/
native ShowSyncHudText(client, Handle:sync, const String:message[], any:...);
/**
* Clears the text on a synchronized HUD channel.
*
* This is not the same as sending "" because it guarantees that it won't
* overwrite text on another channel. For example, consider the scenario:
*
* 1. Your synchronized message goes to channel 3.
* 2. Someone else's non-synchronized message goes to channel 3.
*
* If you were to simply send "" on your synchronized message,
* then someone else's text could be overwritten.
*
* @param client Client index to send the message to.
* @param sync Synchronization object.
* @noreturn
* @error Client not in-game, or sync object not valid.
*/
native ClearSyncHud(client, Handle:sync);
/**
* Shows a HUD message to a client on the given channel.
*
* As of this writing, only TF, HL2MP, and SourceForts support HUD Text.
*
* @param client Client index to send the message to.
* @param channel A channel number.
* If -1, then a channel will automatically be selected
* based on the least-recently-used channel. If the
* channel is any other number, it will be modulo'd with
* the channel count to get a final channel number.
* @param message Message text or formatting rules.
* @param ... Message formatting parameters.
* @return -1 on failure (lack of mod support).
* Any other return value is the channel number that was
* used to render the text.
*/
native ShowHudText(client, channel, const String:message[], any:...);
/**
* Shows a MOTD panel to a specific client.
*
* @param client Client index.
* @param title Title of the panel (printed on the top border of the window).
* @param msg Contents of the panel, it can be treated as an url, filename or plain text
* depending on the type parameter (WARNING: msg has to be 192 bytes maximum!)
* @param type Determines the way to treat the message body of the panel.
* @noreturn
* @error If the client is not connected an error will be thrown.
*/
stock ShowMOTDPanel(client, const String:title[], const String:msg[], type=MOTDPANEL_TYPE_INDEX)
{
decl String:num[3];
new Handle:Kv = CreateKeyValues("data");
IntToString(type, num, sizeof(num));
KvSetString(Kv, "title", title);
KvSetString(Kv, "type", num);
KvSetString(Kv, "msg", msg);
ShowVGUIPanel(client, "info", Kv);
CloseHandle(Kv);
}
/**
* Displays a panel asking the client to connect to a specified IP.
*
* @param client Client index.
* @param time Duration to hold the panel on the client's screen.
* @param ip Destionation IP.
* @noreturn
*/
stock DisplayAskConnectBox(client, Float:time, const String:ip[])
{
new Handle:Kv = CreateKeyValues("data");
KvSetFloat(Kv, "time", time);
KvSetString(Kv, "title", ip);
CreateDialog(client, Kv, DialogType_AskConnect);
CloseHandle(Kv);
}

96
src/include/handles.inc Normal file
View File

@ -0,0 +1,96 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: handles.inc 1771 2007-12-05 15:38:45Z dvander $
*/
#if defined _handles_included
#endinput
#endif
#define _handles_included
/**
* Handle helper macros.
*/
enum Handle
{
INVALID_HANDLE = 0,
};
/**
* Closes a Handle. If the handle has multiple copies open,
* it is not destroyed unless all copies are closed.
*
* @note Closing a Handle has a different meaning for each Handle type. Make
* 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);
/**
* Clones a Handle. When passing handles in between plugins, caching handles
* can result in accidental invalidation when one plugin releases the Handle, or is its owner
* is unloaded from memory. To prevent this, the Handle may be "cloned" with a new owner.
*
* @note Usually, you will be cloning Handles for other plugins. This means that if you clone
* the Handle without specifying the new owner, it will assume the identity of your original calling
* plugin, which is not very useful. You should either specify that the receiving plugin should
* clone the handle on its own, or you should explicitly clone the Handle using the receiving plugin's
* identity Handle.
*
* @param hndl Handle to clone/duplicate.
* @param plugin Optional Handle to another plugin to mark as the new owner.
* If no owner is passed, the owner becomes the calling plugin.
* @return Handle on success, INVALID_HANDLE if not cloneable.
* @error Invalid handles will cause a run time error.
*/
native Handle:CloneHandle(Handle:hndl, Handle:plugin=INVALID_HANDLE);
/**
* Do not use this function. Returns if a Handle and its contents
* are readable, whereas INVALID_HANDLE only checks for the absence
* of a Handle.
*
* This function is intended only for tests where the validity of a
* Handle can absolutely not be known.
*
* Do not use this to check the return values of functions, or to
* check if timers should be closed (except in very rare cases).
* This function is for very specific usage and using it for general
* purpose routines can and will hide very subtle bugs.
*
* @param hndl Handle to test for validity.
* @return True if handle is valid, false otherwise.
*/
#pragma deprecated Do not use this function.
native bool:IsValidHandle(Handle:hndl);

294
src/include/helpers.inc Normal file
View File

@ -0,0 +1,294 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: helpers.inc 1895 2008-02-22 21:01:08Z dvander $
*/
#if defined _helpers_included
#endinput
#endif
#define _helpers_included
/**
* Formats a user's info as log text. This is usually not needed because
* %L can be used to auto-format client information into a string.
*
* @param client Client index.
* @param buffer Buffer for text.
* @param maxlength Maximum length of text.
*/
stock FormatUserLogText(client, String:buffer[], maxlength)
{
decl String:auth[32];
decl String:name[40];
new userid = GetClientUserId(client);
if (!GetClientAuthString(client, auth, sizeof(auth)))
{
strcopy(auth, sizeof(auth), "UNKNOWN");
}
if (!GetClientName(client, name, sizeof(name)))
{
strcopy(name, sizeof(name), "UNKNOWN");
}
/** Currently, no team stuff ... */
Format(buffer, maxlength, "\"%s<%d><%s><>\"", name, userid, auth);
}
/**
* Returns plugin handle from plugin filename.
*
* @param filename Filename of the plugin to search for.
* @return Handle to plugin if found, INVALID_HANDLE otherwise.
*/
stock Handle:FindPluginByFile(const String:filename[])
{
decl String:buffer[256];
new Handle:iter = GetPluginIterator();
new Handle:pl;
while (MorePlugins(iter))
{
pl = ReadPlugin(iter);
GetPluginFilename(pl, buffer, sizeof(buffer));
if (strcmp(buffer, filename, false) == 0)
{
CloseHandle(iter);
return pl;
}
}
CloseHandle(iter);
return INVALID_HANDLE;
}
/**
* @deprecated Use FindTarget() or ProcessTargetString().
*/
#pragma deprecated Use FindTarget() or ProcessTargetString()
stock SearchForClients(const String:pattern[], clients[], maxClients)
{
new maxclients = GetMaxClients();
new 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 (!IsClientInGame(i))
{
continue;
}
GetClientName(i, name, sizeof(name));
if (strcmp(name, pattern, false) == 0)
{
clients[0] = i;
return 1;
}
}
} else {
new client = GetClientOfUserId(input);
if (client)
{
clients[0] = client;
return 1;
}
}
}
decl String:name[65]
for (new i=1; i<=maxclients; i++)
{
if (!IsClientInGame(i))
{
continue;
}
GetClientName(i, name, sizeof(name));
if (StrContains(name, pattern, false) != -1)
{
clients[total++] = i;
if (total >= maxClients)
{
break;
}
}
}
return total;
}
/**
* Wraps ProcessTargetString() and handles producing error messages for
* bad targets.
*
* @param client Client who issued command
* @param target Client's target argument
* @param nobots Optional. Set to true if bots should NOT be targetted
* @param immunity Optional. Set to false to ignore target immunity.
* @return Index of target client, or -1 on error.
*/
stock FindTarget(client, const String:target[], bool:nobots = false, bool:immunity = true)
{
decl String:target_name[MAX_TARGET_LENGTH];
decl target_list[1], target_count, bool:tn_is_ml;
new flags = COMMAND_FILTER_NO_MULTI;
if (nobots)
{
flags |= COMMAND_FILTER_NO_BOTS;
}
if (!immunity)
{
flags |= COMMAND_FILTER_NO_IMMUNITY;
}
if ((target_count = ProcessTargetString(
target,
client,
target_list,
1,
flags,
target_name,
sizeof(target_name),
tn_is_ml)) > 0)
{
return target_list[0];
}
else
{
ReplyToTargetError(client, target_count);
return -1;
}
}
/**
* This function is no longer supported. It has been replaced with ReadMapList(),
* which uses a more unified caching and configuration mechanism. This function also
* has a bug where if the cvar contents changes, the fileTime change won't be recognized.
*
* Loads a specified array with maps. The maps will be either loaded from mapcyclefile, or if supplied
* a cvar containing a file name. If the file in the cvar is bad, it will use mapcyclefile. The fileTime
* parameter is used to store a timestamp of the file. If specified, the file will only be reloaded if it
* has changed.
*
* @param array Valid array handle, should be created with CreateArray(33) or larger.
* @param fileTime Variable containing the "last changed" time of the file. Used to avoid needless reloading.
* @param fileCvar CVAR set to the file to be loaded. Optional.
* @return Number of maps loaded or 0 if in error.
*/
#pragma deprecated Use ReadMapList() instead.
stock LoadMaps(Handle:array, &fileTime = 0, Handle:fileCvar = INVALID_HANDLE)
{
decl String:mapPath[256], String:mapFile[64];
new bool:fileFound = false;
if (fileCvar != INVALID_HANDLE)
{
GetConVarString(fileCvar, mapFile, 64);
BuildPath(Path_SM, mapPath, sizeof(mapPath), mapFile);
fileFound = FileExists(mapPath);
}
if (!fileFound)
{
new Handle:mapCycleFile = FindConVar("mapcyclefile");
GetConVarString(mapCycleFile, mapPath, sizeof(mapPath));
fileFound = FileExists(mapPath);
}
if (!fileFound)
{
LogError("Failed to find a file to load maps from. No maps loaded.");
ClearArray(array);
return 0;
}
// If the file hasn't changed, there's no reason to reload
// all of the maps.
new newTime = GetFileTime(mapPath, FileTime_LastChange);
if (fileTime == newTime)
{
return GetArraySize(array);
}
fileTime = newTime;
ClearArray(array);
new Handle:file = OpenFile(mapPath, "rt");
if (file == INVALID_HANDLE)
{
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)))
{
TrimString(buffer);
if ((len = StrContains(buffer, ".bsp", false)) != -1)
{
buffer[len] = '\0';
}
if (buffer[0] == '\0' || !IsValidConVarChar(buffer[0]) || !IsMapValid(buffer))
{
continue;
}
if (FindStringInArray(array, buffer) != -1)
{
continue;
}
PushArrayString(array, buffer);
}
CloseHandle(file);
return GetArraySize(array);
}

429
src/include/keyvalues.inc Normal file
View File

@ -0,0 +1,429 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: keyvalues.inc 1740 2007-12-01 00:37:47Z faluco $
*/
#if defined _keyvalues_included
#endinput
#endif
#define _keyvalues_included
/**
* KeyValue data value types
*/
enum KvDataTypes
{
KvData_None = 0, /**< Type could not be identified, or no type */
KvData_String, /**< String value */
KvData_Int, /**< Integer value */
KvData_Float, /**< Floating point value */
KvData_Ptr, /**< Pointer value (sometimes called "long") */
KvData_WString, /**< Wide string value */
KvData_Color, /**< Color value */
KvData_UInt64, /**< Large integer value */
/* --- */
KvData_NUMTYPES,
};
/**
* Creates a new KeyValues structure. The Handle must always be closed.
*
* @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.
* @return A Handle to a new KeyValues structure.
*/
native Handle:CreateKeyValues(const String:name[], const String:firstkey[]="", const String:firstValue[]="");
/**
* 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.
* @noreturn
* @error Invalid Handle.
*/
native KvSetString(Handle:kv, const String:key[], const String:value[]);
/**
* Sets an integer value of a KeyValues key.
*
* @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);
/**
* Sets a large integer value of a KeyValues key.
*
* @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]);
/**
* Sets a floating point value of a KeyValues key.
*
* @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);
/**
* Sets a set of color values of a KeyValues key.
*
* @param kv KeyValues Handle.
* @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.
* @noreturn
* @error Invalid Handle.
*/
native KvSetColor(Handle:kv, const String:key[], r, g, b, a=0);
/**
* Sets a vector value of a KeyValues key.
*
* @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]);
/**
* Retrieves a string value from a KeyValues key.
*
* @param kv KeyValues Handle.
* @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.
* @noreturn
* @error Invalid Handle.
*/
native KvGetString(Handle:kv, const String:key[], String:value[], maxlength, const String:defvalue[]="");
/**
* Retrieves an integer value from a KeyValues key.
*
* @param kv KeyValues Handle.
* @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.
* @error Invalid Handle.
*/
native KvGetNum(Handle:kv, const String:key[], defvalue=0);
/**
* Retrieves a floating point value from a KeyValues key.
*
* @param kv KeyValues Handle.
* @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.
* @error Invalid Handle.
*/
native Float:KvGetFloat(Handle:kv, const String:key[], Float:defvalue=0.0);
/**
* Retrieves a set of color values from a KeyValues key.
*
* @param kv KeyValues Handle.
* @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.
* @noreturn
* @error Invalid Handle.
*/
native KvGetColor(Handle:kv, const String:key[], &r, &g, &b, &a);
/**
* Retrieves a large integer value from a KeyValues key.
*
* @param kv KeyValues Handle.
* @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});
/**
* Retrieves a vector value from a KeyValues key.
*
* @param kv KeyValues Handle.
* @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});
/**
* Sets the current position in the KeyValues tree to the given key.
*
* @param kv KeyValues Handle.
* @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.
*/
native bool:KvJumpToKey(Handle:kv, const String:key[], bool:create=false);
/**
* Sets the current position in the KeyValues tree to the given key.
*
* @param kv KeyValues Handle.
* @param id KeyValues id.
* @return True if the key exists, false if it does not.
*/
native bool:KvJumpToKeySymbol(Handle:kv, id);
/**
* Sets the current position in the KeyValues tree to the first sub key.
* This native adds to the internal traversal stack.
*
* @param kv KeyValues Handle.
* @param keyOnly If false, non-keys will be traversed (values).
* @return True on success, false if there was no first sub key.
* @error Invalid Handle.
*/
native bool:KvGotoFirstSubKey(Handle:kv, 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
* KvGoBack() is not needed for each successive call to this function.
*
* @param kv KeyValues Handle.
* @param keyOnly If false, non-keys will be traversed (values).
* @return True on success, false if there was no next sub key.
* @error Invalid Handle.
*/
native bool:KvGotoNextKey(Handle:kv, 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.
* @noreturn
* @error Invalid Handle.
*/
native KvSavePosition(Handle:kv);
/**
* Removes the given key from the current position.
*
* @param kv KeyValues Handle.
* @param key Name of the key.
* @return True on success, false if key did not exist.
* @error Invalid Handle.
*/
native bool:KvDeleteKey(Handle:kv, const String: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.
* @error Invalid Handle.
*/
native KvDeleteThis(Handle:kv);
/**
* 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.
*
* @param kv KeyValues Handle.
* @return True on success, false if there is no higher node.
* @error Invalid Handle.
*/
native bool:KvGoBack(Handle:kv);
/**
* 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.
* @noreturn
* @error Invalid Handle.
*/
native KvRewind(Handle:kv);
/**
* Retrieves the current section name.
*
* @param kv KeyValues Handle.
* @param section Buffer to store the section name.
* @param maxlength Maximum length of the name buffer.
* @return True on success, false on failure.
* @error Invalid Handle.
*/
native bool:KvGetSectionName(Handle:kv, String:section[], 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[]);
/**
* Returns the data type at a key.
*
* @param kv KeyValues Handle.
* @param key Key name.
* @return KvDataType value of the key.
* @error Invalid Handle.
*/
native KvDataTypes:KvGetDataType(Handle:kv, const String:key[]);
/**
* Converts a KeyValues tree to a file. The tree is dumped
* from the current position.
*
* @param kv KeyValues Handle.
* @param file File to dump write to.
* @return True on success, false otherwise.
* @error Invalid Handle.
*/
native bool:KeyValuesToFile(Handle:kv, const String:file[]);
/**
* Converts a file to a KeyValues tree. The file is read into
* the current position of the tree.
*
* @param kv KeyValues Handle.
* @param file File to read from.
* @return True on success, false otherwise.
* @error Invalid Handle.
*/
native bool:FileToKeyValues(Handle:kv, const String:file[]);
/**
* 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 kv KeyValues Handle.
* @param useEscapes Whether or not to read escape sequences.
* @noreturn
* @error Invalid Handle.
*/
native KvSetEscapeSequences(Handle:kv, 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.
*
* @param kv KeyValues Handle.
* @return Number of non-root nodes in the jump stack.
* @error Invalid Handle.
*/
native KvNodesInStack(Handle:kv);
/**
* Makes a new copy of all subkeys in the origin KeyValues to
* the destination KeyValues.
* NOTE: All KeyValues are processed from the current location not the root one.
*
* @param origin Origin KeyValues Handle.
* @param dest Destination KeyValues Handlee.
* @noreturn
* @error Invalid Handle.
*/
native KvCopySubkeys(Handle:origin, Handle:dest);
/**
* Finds a KeyValues name by id.
*
* @param kv KeyValues Handle.
* @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.
* @error Invalid Handle.
*/
native bool:KvFindKeyById(Handle:kv, id, String:name[], maxlength);
/**
* Finds a KeyValues id inside a KeyValues tree.
*
* @param kv KeyValues Handle.
* @param key Key name.
* @param id Id of the found KeyValue.
* @return True on success, false if key not found.
* @error Invalid Handle.
*/
native bool:KvGetNameSymbol(Handle:kv, const String:key[], &id);
/**
* Retrieves the current section id.
*
* @param kv KeyValues Handle.
* @param id Id of the current section.
* @return True on success, false on failure.
* @error Invalid Handle.
*/
native bool:KvGetSectionSymbol(Handle:kv, &id);

96
src/include/lang.inc Normal file
View File

@ -0,0 +1,96 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: lang.inc 1336 2007-08-15 06:19:30Z damagedsoul $
*/
#if defined _lang_included
#endinput
#endif
#define _lang_included
#define LANG_SERVER 0 /**< Translate using the server's language */
/**
* Loads a translation file for the plugin calling this native.
* If no extension is specified, .txt is assumed.
*
* @param path Translation file.
* @noreturn
*/
native LoadTranslations(const String:file[]);
/**
* Sets the global language target. This is useful for creating functions
* that will be compatible with the %t format specifier. Note that invalid
* indexes can be specified but the error will occur during translation,
* not during this function call.
*
* @param client Client index or LANG_SERVER.
* @noreturn
*/
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.
* @error Invalid client index or client not in game.
*/
native GetClientLanguage(client);
/**
* Retrieves the server's language.
*
* @return Language number server is using.
*/
native GetServerLanguage();
/**
* Returns the number of languages known in languages.cfg.
*
* @return Language count.
*/
native GetLanguageCount();
/**
* Retrieves info about a given language number.
*
* @param language Language number.
* @param code Language code buffer (2-3 characters usually).
* @param codeLen Maximum length of the language code buffer.
* @param name Language name buffer.
* @param nameLen Maximum length of the language name buffer.
* @noreturn
* @error Invalid language number.
*/
native GetLanguageInfo(language, String:code[]="", codeLen=0, String:name[]="", nameLen=0);

153
src/include/logging.inc Normal file
View File

@ -0,0 +1,153 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: logging.inc 1920 2008-03-02 19:08:27Z dvander $
*/
#if defined _sm_logging_included
#endinput
#endif
#define _sm_logging_included
/**
* Logs a plugin message to the SourceMod logs. The log message will be
* prefixed by the plugin's logtag (filename).
*
* @param format String format.
* @param ... Format arguments.
* @noreturn
*/
native LogMessage(const String:format[], any:...);
/**
* Logs a message to the SourceMod logs without any plugin logtag. This is
* useful for re-routing messages from other plugins, for example, messages
* from LogAction().
*
* @param format String format.
* @param ... Format arguments.
* @noreturn
*/
native LogMessageEx(const String:format[], any:...);
/**
* Logs a message to any file. The log message will be in the normal
* SourceMod format, with the plugin logtag prepended.
*
* @param file File to write the log message in.
* @param format String format.
* @param ... Format arguments.
* @noreturn
* @error File could not be opened/written.
*/
native LogToFile(const String:file[], const String:format[], any:...);
/**
* Same as LogToFile(), except no plugin logtag is prepended.
*
* @param file File to write the log message in.
* @param format String format.
* @param ... Format arguments.
* @noreturn
* @error File could not be opened/written.
*/
native LogToFileEx(const String:file[], const String:format[], any:...);
/**
* Logs an action from a command or event whereby interception and routing may
* be important. This is intended to be a logging version of ShowActivity().
*
* @param client Client performing the action, 0 for server, or -1 if not
* applicable.
* @param target Client being targetted, or -1 if not applicable.
* @param message Message format.
* @param ... Message formatting parameters.
* @noreturn
*/
native LogAction(client, target, const String:message[], any:...);
/**
* Logs a plugin error message to the SourceMod logs.
*
* @param format String format.
* @param ... Format arguments.
* @noreturn
*/
native LogError(const String:format[], any:...);
/**
* Called when an action is going to be logged.
*
* @param source Handle to the object logging the action, or INVALID_HANDLE
* if Core is logging the action.
* @param ident Type of object logging the action (plugin, ext, or core).
* @param client Client the action is from; 0 for server, -1 if not applicable.
* @param target Client the action is targetting, or -1 if not applicable.
* @param message Message that is being logged.
* @return Plugin_Continue will cause Core to defaulty log the message.
* Plugin_Handled will stop Core from logging the message.
* Plugin_Stop is the same as Handled, but prevents any other
* plugins from handling the message.
*/
forward Action:OnLogAction(Handle:source,
Identity:ident,
client,
target,
const String:message[]);
/**
* Called when a game log message is received.
*
* Any Log*() functions called within this callback will not recursively
* pass through. That is, they will log directly, bypassing this callback.
*
* Note that this does not capture log messages from the engine. It only
* captures log messages being sent from the game/mod itself.
*
* @param message Message contents.
* @return Plugin_Handled or Plugin_Stop will prevent the message
* from being written to the log file.
*/
functag GameLogHook Action:public(const String:message[]);
/**
* Adds a game log hook.
*
* @param hook Hook function.
* @noreturn
*/
native AddGameLogHook(GameLogHook:hook);
/**
* Removes a game log hook.
*
* @param hook Hook function.
* @noreturn
*/
native RemoveGameLogHook(GameLogHook:hook);

62
src/include/market.inc Normal file
View File

@ -0,0 +1,62 @@
/**
* ====================
* Market
* File: market.inc
* Version: 1.2
* Author: Greyscale
* ====================
*/
/**
* Used to send the market to a client
* @param client Client index
* @param title Title of the market menu
* @param rebuy Text to display for the "Rebuy" option
* @noreturn
*/
native Market_Send(client, const String:title[], const String:rebuy[]);
/**
* Used to send the market to a client
* @param weapondid ID of the weapon whose info will be returned
* @param display The display name of the weapon
* @param weapon The entity name of the weapon
* @param price The price of the weapon
* @return True if weaponid exists, false if not
*/
native bool:Market_GetWeaponIDInfo(const String:weaponid[], String:display[], String:weapon[], &price);
/**
* Called when a player makes a selection from the menu
* @param client Client index
* @param weaponid Returns the ID of the weapon selected ("rebuy" is returned when player selected rebuy)
* @return True to allow purchase, false to block
*/
forward bool:Market_OnWeaponSelected(client, String:weaponid[]);
/**
* Called after a player makes a selection from the menu
* @param client Client index
* @param allowed True if selection was allowed and false if it was blocked
* noreturn
*/
forward Market_PostOnWeaponSelected(client, &bool:allowed);
public SharedPlugin:__pl_market =
{
name = "market",
file = "market.smx",
#if defined REQUIRE_PLUGIN
required = 1,
#else
required = 0,
#endif
};
public __pl_market_SetNTVOptional()
{
MarkNativeAsOptional("Market_Send");
MarkNativeAsOptional("Market_GetWeaponIDInfo");
}

787
src/include/menus.inc Normal file
View File

@ -0,0 +1,787 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: menus.inc 1777 2007-12-06 12:26:59Z dvander $
*/
#if defined _menus_included
#endinput
#endif
#define _menus_included
/**
* Low-level drawing style of the menu.
*/
enum MenuStyle
{
MenuStyle_Default = 0, /**< The "default" menu style for the mod */
MenuStyle_Valve = 1, /**< The Valve provided menu style (Used on HL2DM) */
MenuStyle_Radio = 2, /**< The simpler menu style commonly used on CS:S */
};
/**
* Different actions for the menu "pump" callback
*/
enum MenuAction
{
MenuAction_Start = (1<<0), /**< A menu has been started (nothing passed) */
MenuAction_Display = (1<<1), /**< A menu is about to be displayed (param1=client, param2=MenuPanel Handle) */
MenuAction_Select = (1<<2), /**< An item was selected (param1=client, param2=item) */
MenuAction_Cancel = (1<<3), /**< The menu was cancelled (param1=client, param2=reason) */
MenuAction_End = (1<<4), /**< A menu display has fully ended.
param1 is the MenuEnd reason, and if it's MenuEnd_Cancelled, then
param2 is the MenuCancel reason from MenuAction_Cancel.
*/
MenuAction_VoteEnd = (1<<5), /**< (VOTE ONLY): A vote sequence has succeeded (param1=chosen item)
This is not called if SetVoteResultCallback has been used on the menu. */
MenuAction_VoteStart = (1<<6), /**< (VOTE ONLY): A vote sequence has started (nothing passed) */
MenuAction_VoteCancel = (1<<7), /**< (VOTE ONLY): A vote sequence has been cancelled (param1=reason) */
MenuAction_DrawItem = (1<<8), /**< An item is being drawn; return the new style (param1=client, param2=item) */
MenuAction_DisplayItem = (1<<9),/**< Item text is being drawn to the display (param1=client, param2=item)
To change the text, use RedrawMenuItem().
If you do so, return its return value. Otherwise, return 0.
*/
};
/** Default menu actions */
#define MENU_ACTIONS_DEFAULT MenuAction_Select|MenuAction_Cancel|MenuAction_End
/** All menu actions */
#define MENU_ACTIONS_ALL MenuAction:0xFFFFFFFF
#define MENU_NO_PAGINATION 0 /**< Menu should not be paginated (10 items max) */
#define MENU_TIME_FOREVER 0 /**< Menu should be displayed as long as possible */
#define ITEMDRAW_DEFAULT (0) /**< Item should be drawn normally */
#define ITEMDRAW_DISABLED (1<<0) /**< Item is drawn but not selectable */
#define ITEMDRAW_RAWLINE (1<<1) /**< Item should be a raw line, without a slot */
#define ITEMDRAW_NOTEXT (1<<2) /**< No text should be drawn */
#define ITEMDRAW_SPACER (1<<3) /**< Item should be drawn as a spacer, if possible */
#define ITEMDRAW_IGNORE ((1<<1)|(1<<2)) /**< Item should be completely ignored (rawline + notext) */
#define ITEMDRAW_CONTROL (1<<4) /**< Item is control text (back/next/exit) */
#define MENUFLAG_BUTTON_EXIT (1<<0) /**< Menu has an "exit" button (default if paginated) */
#define MENUFLAG_BUTTON_EXITBACK (1<<1) /**< Menu has an "exit back" button */
#define MENUFLAG_NO_SOUND (1<<2) /**< Menu will not have any select sounds */
#define VOTEINFO_CLIENT_INDEX 0 /**< Client index */
#define VOTEINFO_CLIENT_ITEM 1 /**< Item the client selected, or -1 for none */
#define VOTEINFO_ITEM_INDEX 0 /**< Item index */
#define VOTEINFO_ITEM_VOTES 1 /**< Number of votes for the item */
/**
* Reasons a menu can be cancelled (MenuAction_Cancel).
*/
enum
{
MenuCancel_Disconnected = -1, /**< Client dropped from the server */
MenuCancel_Interrupted = -2, /**< Client was interrupted with another menu */
MenuCancel_Exit = -3, /**< Client exited via "exit" */
MenuCancel_NoDisplay = -4, /**< Menu could not be displayed to the client */
MenuCancel_Timeout = -5, /**< Menu timed out */
MenuCancel_ExitBack = -6, /**< Client selected "exit back" on a paginated menu */
};
/**
* Reasons a vote can be cancelled (MenuAction_VoteCancel).
*/
enum
{
VoteCancel_Generic = -1, /**< Vote was generically cancelled. */
VoteCancel_NoVotes = -2, /**< Vote did not receive any votes. */
};
/**
* Reasons a menu ended (MenuAction_End).
*/
enum
{
MenuEnd_Selected = 0, /**< Menu item was selected */
MenuEnd_VotingDone = -1, /**< Voting finished */
MenuEnd_VotingCancelled = -2, /**< Voting was cancelled */
MenuEnd_Cancelled = -3, /**< Menu was cancelled (reason in param2) */
MenuEnd_Exit = -4, /**< Menu was cleanly exited via "exit" */
MenuEnd_ExitBack = -5, /**< Menu was cleanly exited via "back" */
};
/**
* Describes a menu's source
*/
enum MenuSource
{
MenuSource_None = 0, /**< No menu is being displayed */
MenuSource_External = 1, /**< External menu */
MenuSource_Normal = 2, /**< A basic menu is being displayed */
MenuSource_RawPanel = 3, /**< A display is active, but it is not tied to a menu */
};
/**
* Called when a menu action is completed.
*
* @param menu The menu being acted upon.
* @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 MenuHandler public(Handle:menu, MenuAction:action, param1, param2);
/**
* 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.
* @return A new menu Handle.
*/
native Handle:CreateMenu(MenuHandler:handler, MenuAction:actions=MENU_ACTIONS_DEFAULT);
/**
* Displays a menu to a client.
*
* @param menu Menu Handle.
* @param client Client index.
* @param time Maximum time to leave menu on the screen.
* @return True on success, false on failure.
* @error Invalid Handle or client not in game.
*/
native bool:DisplayMenu(Handle:menu, client, time);
/**
* Displays a menu to a client, starting from the given item.
*
* @param menu Menu Handle.
* @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 Invalid Handle or client not in game.
*/
native bool:DisplayMenuAtItem(Handle:menu, client, first_item, time);
/**
* Appends a new item to the end of a menu.
*
* @param menu Menu Handle.
* @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 Handle or item limit reached.
*/
native AddMenuItem(Handle:menu,
const String:info[],
const String:display[],
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 menu Menu Handle.
* @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 Handle or menu position.
*/
native bool:InsertMenuItem(Handle:menu,
position,
const String:info[],
const String:display[],
style=ITEMDRAW_DEFAULT);
/**
* Removes an item from the menu.
*
* @param menu Menu Handle.
* @param position Position, starting from 0.
* @return True on success, false on failure.
* @error Invalid Handle or menu position.
*/
native bool:RemoveMenuItem(Handle:menu, position);
/**
* Removes all items from a menu.
*
* @param menu Menu Handle.
* @noreturn
* @error Invalid Handle or menu position.
*/
native RemoveAllMenuItems(Handle:menu);
/**
* Retrieves information about a menu item.
*
* @param menu Menu Handle.
* @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.
* @error Invalid Handle.
*/
native bool:GetMenuItem(Handle:menu,
position,
String:infoBuf[],
infoBufLen,
&style=0,
String:dispBuf[]="",
dispBufLen=0);
/**
* Returns the first item on the page of a currently selected menu.
*
* This is only valid inside a MenuAction_Select callback.
*
* @return First item number on the page the client was viewing
* before selecting the item in the callback. This can
* be used to re-display the menu from the original
* position.
* @error Not called from inside a MenuAction_Select callback.
*/
native GetMenuSelectionPosition();
/**
* Returns the number of items in a menu.
*
* @param menu Menu Handle.
* @return Number of items in the menu.
* @error Invalid Handle.
*/
native GetMenuItemCount(Handle:menu);
/**
* Sets whether the menu should be paginated or not.
*
* If itemsPerPage 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.
*
* @param menu Handle to the menu.
* @param itemsPerPage Number of items per page, or MENU_NO_PAGINATION.
* @return True on success, false if pagination is too high or
* low.
* @error Invalid Handle.
*/
native bool:SetMenuPagination(Handle:menu, itemsPerPage);
/**
* Returns a menu's pagination setting.
*
* @param menu Handle to the menu.
* @return Pagination setting.
* @error Invalid Handle.
*/
native GetMenuPagination(Handle:menu);
/**
* Returns a menu's MenuStyle Handle. The Handle
* is global and cannot be freed.
*
* @param menu Handle to the menu.
* @return Handle to the menu's draw style.
* @error Invalid Handle.
*/
native Handle:GetMenuStyle(Handle:menu);
/**
* Sets the menu's default title/instruction message.
*
* @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:...);
/**
* 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.
* @error Invalid Handle/
*/
native GetMenuTitle(Handle:menu, String:buffer[], maxlength);
/**
* Creates a raw MenuPanel based off the menu's style.
* The Handle must be freed with CloseHandle().
*
* @return A new MenuPanel Handle.
* @error Invalid Handle.
*/
native Handle:CreatePanelFromMenu(Handle:menu);
/**
* Returns whether or not the menu has an exit button.
* By default, menus have an exit button.
*
* @param menu Menu Handle.
* @return True if the menu has an exit button; false otherwise.
* @error Invalid Handle.
*/
native bool:GetMenuExitButton(Handle:menu);
/**
* Sets whether or not the menu has an exit button. By default, paginated menus
* have an exit button.
*
* If a menu's pagination is changed to MENU_NO_PAGINATION, and the pagination
* was previously a different value, then the Exit button status is changed to
* false. It must be explicitly re-enabled afterwards.
*
* If a non-paginated menu has an exit button, then at most 9 items will be
* displayed.
*
* @param menu Menu Handle.
* @param button True to enable the button, false to remove it.
* @return True if allowed; false on failure.
* @error Invalid Handle.
*/
native bool:SetMenuExitButton(Handle:menu, bool:button);
/**
* Returns 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.
*
* @param menu Menu Handle.
* @return True if the menu has an exit back button; false otherwise.
* @error Invalid Handle.
*/
native bool:GetMenuExitBackButton(Handle:menu);
/**
* Sets 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.
*
* @param menu Menu Handle.
* @param button True to enable the button, false to remove it.
* @error Invalid Handle.
*/
native SetMenuExitBackButton(Handle:menu, bool:button);
/**
* 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.
*
* @param menu Menu Handle.
* @noreturn
* @error Invalid Handle.
*/
native CancelMenu(Handle:menu);
/**
* Retrieves a menu's option flags.
*
* @param menu Menu Handle.
* @return A bitstring of MENUFLAG bits.
* @error Invalid Handle.
*/
native GetMenuOptionFlags(Handle:menu);
/**
* Sets a menu's option flags.
*
* If a certain bit is not supported, it will be stripped before being set.
* See SetMenuExitButton() for information on Exit buttons.
* See SetMenuExitBackButton() for information on Exit Back buttons.
*
* @param menu Menu Handle.
* @param flags A new bitstring of MENUFLAG bits.
* @noreturn
* @error Invalid Handle.
*/
native SetMenuOptionFlags(Handle:menu, flags);
/**
* Returns whether a vote is in progress.
*
* @param menu Deprecated; no longer used.
* @return True if a vote is in progress, false otherwise.
*/
native bool:IsVoteInProgress(Handle:menu=INVALID_HANDLE);
/**
* Cancels the vote in progress.
*
* @noreturn
* @error If no vote is in progress.
*/
native CancelVote();
/**
* 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 menu Menu Handle.
* @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.
* @return True on success, false if this menu already has a vote session
* in progress.
* @error Invalid Handle, or a vote is already in progress.
*/
native bool:VoteMenu(Handle:menu, clients[], numClients, time);
/**
* Sends a vote menu to all clients. See VoteMenu() for more information.
*
* @param menu Menu Handle.
* @param time Maximum time to leave menu on the screen.
* @return True on success, false if this menu already has a vote session
* in progress.
* @error Invalid Handle.
*/
stock VoteMenuToAll(Handle:menu, time)
{
new num = GetMaxClients();
new total;
decl players[num];
for (new i=1; i<=num; i++)
{
if (!IsClientInGame(i))
{
continue;
}
players[total++] = i;
}
return VoteMenu(menu, players, total, time);
}
/**
* Callback for when a vote has ended and results are available.
*
* @param menu The menu being voted on.
* @param num_votes Number of votes tallied in total.
* @param num_clients Number of clients who could vote.
* @param client_info Array of clients. Use VOTEINFO_CLIENT_ defines.
* @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 VoteHandler public(Handle:menu,
num_votes,
num_clients,
const client_info[][2],
num_items,
const item_info[][2]);
/**
* Sets an advanced vote handling callback. If this callback is set,
* MenuAction_VoteEnd will not be called.
*
* @param menu Menu Handle.
* @param callback Callback function.
* @noreturn
* @error Invalid Handle or callback.
*/
native SetVoteResultCallback(Handle:menu, VoteHandler:callback);
/**
* Returns the number of seconds you should "wait" before displaying
* a publicly invocable menu. This number is the time remaining until
* (last_vote + sm_vote_delay).
*
* @return Number of seconds to wait, or 0 for none.
*/
native CheckVoteDelay();
/**
* Returns a style's global Handle.
*
* @param style Menu Style.
* @return A Handle, or INVALID_HANDLE if not found or unusable.
*/
native Handle:GetMenuStyleHandle(MenuStyle:style);
/**
* Creates a MenuPanel from a MenuStyle. Panels are used for drawing raw
* menus without any extra helper functions. The Handle must be closed
* with CloseHandle().
*
* @param hStyle MenuStyle Handle, or INVALID_HANDLE to use the default style.
* @return A new MenuPanel Handle.
* @error Invalid Handle other than INVALID_HANDLE.
*/
native Handle:CreatePanel(Handle:hStyle=INVALID_HANDLE);
/**
* Creates a Menu from a MenuStyle. The Handle must be closed with
* CloseHandle().
*
* @parma hStyle MenuStyle Handle, or INVALID_HANDLE to use 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.
* @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);
/**
* Returns whether a client is viewing a menu.
*
* @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.
*/
native MenuSource:GetClientMenu(client, Handle:hStyle=INVALID_HANDLE);
/**
* Cancels a menu on a client. This will only affect non-external menus.
*
* @param hstyle MenuStyle Handle, or INVALID_HANDLE to use the default style.
* @param client Client index.
* @param autoIgnore If true, no menus can be re-drawn on the client during
* the cancellation process.
* @return True if a menu was cancelled, false otherwise.
*/
native bool:CancelClientMenu(client, bool:autoIgnore=false, Handle:hStyle=INVALID_HANDLE);
/**
* Returns a style's maximum items per page.
*
* @param hStyle MenuStyle Handle, or INVALID_HANDLE to use the default style.
* @return Maximum items per page.
* @error Invalid Handle other than INVALID_HANDLE.
*/
native GetMaxPageItems(Handle:hStyle=INVALID_HANDLE);
/**
* Returns a MenuPanel's parent style.
*
* @param panel A MenuPanel Handle.
* @return The MenuStyle Handle that created the panel.
* @error Invalid Handle.
*/
native Handle:GetPanelStyle(Handle:panel);
/**
* Sets the panel's title.
*
* @param panel A MenuPanel Handle.
* @param title 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);
/**
* Draws an item on a panel. If the item takes up a slot, the position
* is returned.
*
* @param panel A MenuPanel Handle.
* @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.
* @error Invalid Handle.
*/
native DrawPanelItem(Handle:panel, const String:text[], style=ITEMDRAW_DEFAULT);
/**
* Draws a raw line of text on a panel, without any markup other than a newline.
*
* @param panel A MenuPanel Handle, or INVALID_HANDLE if inside a
* MenuAction_DisplayItem callback.
* @param text Display text to use.
* @return True on success, false if raw lines are not supported.
* @error Invalid Handle.
*/
native DrawPanelText(Handle:panel, const String:text[]);
/**
* Returns whether or not the given drawing flags are supported by
* the menu style.
*
* @param panel A MenuPanel Handle.
* @param style ITEMDRAW style flags.
* @return True if item is drawable, false otherwise.
* @error Invalid Handle.
*/
native CanPanelDrawFlags(Handle:panel, 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.
*/
native bool:SetPanelKeys(Handle:panel, keys);
/**
* Sends a panel to a client. Unlike full menus, the handler
* function will only receive the following actions, both of
* which will have INVALID_HANDLE 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 panel A MenuPanel Handle.
* @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.
* @error Invalid Handle.
*/
native bool:SendPanelToClient(Handle:panel, client, MenuHandler:handler, time);
/**
* @brief 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).
*
* @param panel A MenuPanel Handle.
* @return Number of characters that the menu can still hold,
* or -1 if there is no known limit.
* @error Invalid Handle.
*/
native GetPanelTextRemaining(Handle:panel);
/**
* @brief Returns the current key position.
*
* @param panel A MenuPanel Handle.
* @return Current key position starting at 1.
* @error Invalid Handle.
*/
native GetPanelCurrentKey(Handle:panel);
/**
* @brief Sets the next key position. This cannot be used
* to traverse backwards.
*
* @param panel A MenuPanel Handle.
* @param key Key that is greater or equal to
* GetPanelCurrentKey().
* @return True on success, false otherwise.
* @error Invalid Handle.
*/
native bool:SetPanelCurrentKey(Handle:panel, key);
/**
* @brief Redraws menu text from inside a MenuAction_DisplayItem callback.
*
* @param text Menu text to draw.
* @return Item position; must be returned via the callback.
*/
native RedrawMenuItem(const String:text[]);
/**
* This function is provided for legacy code only. Some older plugins may use
* network messages instead of the panel API. This function wraps the panel
* API for eased portability into the SourceMod menu system.
*
* This function is only usable with the Radio Menu style. You do not need to
* split up your menu into multiple packets; SourceMod will break the string
* up internally.
*
* @param client Client index.
* @param str Full menu string as would be passed over the network.
* @param time Time to hold the menu for.
* @param keys Selectable key bitstring.
* @param handler Optional handler function, with the same rules as
* SendPanelToClient().
* @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);
/**
* Retrieves voting information from MenuAction_VoteEnd.
*
* @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)
{
winningVotes = param2 & 0xFFFF;
totalVotes = param2 >> 16;
}
/**
* Quick stock to determine whether voting is allowed. This doesn't let you
* fine-tune a reason for not voting, so it's not recommended for lazily
* telling clients that voting isn't allowed.
*
* @return True if voting is allowed, false if voting is in progress
* or the cooldown is active.
*/
stock bool:IsNewVoteAllowed()
{
if (IsVoteInProgress() || CheckVoteDelay() != 0)
{
return false;
}
return true;
}

77
src/include/profiler.inc Normal file
View File

@ -0,0 +1,77 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: profiler.inc 1336 2007-08-15 06:19:30Z damagedsoul $
*/
#if defined _profiler_included
#endinput
#endif
#define _profiler_included
/**
* ONLY AVAILABLE ON WINDOWS RIGHT NOW K.
*/
/**
* Creates a new profile object. The Handle must be freed
* using CloseHandle().
*
* @return Handle to the profiler object.
*/
native Handle:CreateProfiler();
/**
* Starts profiling.
*
* @param prof Profiling object.
* @noreturn
* @error Invalid Handle.
*/
native StartProfiling(Handle:prof);
/**
* Stops profiling.
*
* @param prof Profiling object.
* @noreturn
* @error Invalid Handle or profiling was never started.
*/
native StopProfiling(Handle:prof);
/**
* Returns the amount of high-precision time in seconds
* that passed during the profiler's last start/stop
* cycle.
*
* @param prof Profiling object.
* @return Time elapsed in seconds.
* @error Invalid Handle.
*/
native Float:GetProfilerTime(Handle:prof);

173
src/include/regex.inc Normal file
View File

@ -0,0 +1,173 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: regex.inc 2086 2008-04-19 10:34:56Z pred $
*/
#if defined _regex_included
#endinput
#endif
#define _regex_included
/**
* @section Flags for compiling regex expressions. These come directly from the
* pcre library and can be used in MatchRegex and CompileRegex.
*/
#define PCRE_CASELESS 0x00000001 /* Ignore Case */
#define PCRE_MULTILINE 0x00000002 /* Multilines (affects ^ and $ so that they match the start/end of a line rather than matching the start/end of the string). */
#define PCRE_DOTALL 0x00000004 /* Single line (affects . so that it matches any character, even new line characters). */
#define PCRE_EXTENDED 0x00000008 /* Pattern extension (ignore whitespace and # comments). */
#define PCRE_UNGREEDY 0x00000200 /* Invert greediness of quantifiers */
#define PCRE_UTF8 0x00000800 /* Use UTF-8 Chars */
#define PCRE_NO_UTF8_CHECK 0x00002000 /* Do not check the pattern for UTF-8 validity (only relevant if PCRE_UTF8 is set) */
/**
* Regex expression error codes.
*/
enum RegexError
{
REGEX_ERROR_NONE = 0, /* No error */
REGEX_ERROR_NOMATCH = -1, /* No match was found */
REGEX_ERROR_NULL = -2,
REGEX_ERROR_BADOPTION = -3,
REGEX_ERROR_BADMAGIC = -4,
REGEX_ERROR_UNKNOWN_OPCODE = -5,
REGEX_ERROR_NOMEMORY = -6,
REGEX_ERROR_NOSUBSTRING = -7,
REGEX_ERROR_MATCHLIMIT = -8,
REGEX_ERROR_CALLOUT = -9, /* Never used by PCRE itself */
REGEX_ERROR_BADUTF8 = -10,
REGEX_ERROR_BADUTF8_OFFSET = -11,
REGEX_ERROR_PARTIAL = -12,
REGEX_ERROR_BADPARTIAL = -13,
REGEX_ERROR_INTERNAL = -14,
REGEX_ERROR_BADCOUNT = -15,
REGEX_ERROR_DFA_UITEM = -16,
REGEX_ERROR_DFA_UCOND = -17,
REGEX_ERROR_DFA_UMLIMIT = -18,
REGEX_ERROR_DFA_WSSIZE = -19,
REGEX_ERROR_DFA_RECURSE = -20,
REGEX_ERROR_RECURSIONLIMIT = -21,
REGEX_ERROR_NULLWSLIMIT = -22, /* No longer actually used */
REGEX_ERROR_BADNEWLINE = -23
};
/**
* Precompile a regular expression. Use this if you intend on using the
* same expression multiple times. Pass the regex handle returned here to
* MatchRegex to check for matches.
*
* @param pattern The regular expression pattern.
* @param flags General flags for the regular expression.
* @param error Error message encountered, if applicable.
* @param maxLen Maximum string length of the error buffer.
* @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);
/**
* Matches a string against a pre-compiled regular expression pattern.
*
* @param str The string to check.
* @param regex Regex Handle from CompileRegex()
* @param ret Error code, if applicable.
* @return Number of substrings found or -1 on failure.
*
* @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);
/**
* Returns a matched substring from a regex handle.
* Substring ids start at 0 and end at substrings-1, where substrings is the number returned
* by MatchRegex
*
* @param regex The regex handle to extract data from.
* @param str_id The index of the expression to get - starts at 0, and ends at substrings - 1.
* @param buffer The buffer to set to the matching substring.
* @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);
/**
* Matches a string against a regular expression pattern.
*
* @note If you intend on using the same regular expression pattern
* multiple times, consider using CompileRegex and MatchRegex
* instead of making this function reparse the expression each time.
*
* @param str The string to check.
* @param pattern The regular expression pattern.
* @param flags General flags for the regular expression.
* @param error Error message, if applicable.
* @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)
{
new Handle:regex = CompileRegex(pattern, flags, error, maxLen);
if (regex == INVALID_HANDLE)
{
return -1;
}
new substrings = MatchRegex(regex, str);
CloseHandle(regex);
return substrings;
}
/**
* @endsection
*/
/**
* Do not edit below this line!
*/
public Extension:__ext_regex =
{
name = "Regex Extension",
file = "regex.ext",
#if defined AUTOLOAD_EXTENSIONS
autoload = 1,
#else
autoload = 0,
#endif
#if defined REQUIRE_EXTENSIONS
required = 1,
#else
required = 0,
#endif
};

212
src/include/sdktools.inc Normal file
View File

@ -0,0 +1,212 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: sdktools.inc 1990 2008-04-06 05:40:11Z dvander $
*/
#if defined _sdktools_included
#endinput
#endif
#define _sdktools_included
#include <core>
#include <sdktools_engine>
#include <sdktools_functions>
#if !defined SDKTOOLS_DISABLE_SOUNDAPI
#include <sdktools_sound>
#endif
#include <sdktools_stringtables>
#include <sdktools_trace>
#include <sdktools_tempents>
#include <sdktools_tempents_stocks>
#include <sdktools_voice>
#include <sdktools_entinput>
#include <sdktools_entoutput>
enum SDKCallType
{
SDKCall_Static, /**< Static call */
SDKCall_Entity, /**< CBaseEntity call */
SDKCall_Player, /**< CBasePlayer call */
SDKCall_GameRules, /**< CGameRules call */
SDKCall_EntityList, /**< CGlobalEntityList call */
};
enum SDKLibrary
{
SDKLibrary_Server, /**< server.dll/server_i486.so */
SDKLibrary_Engine, /**< engine.dll/engine_*.so */
};
enum SDKFuncConfSource
{
SDKConf_Virtual = 0, /**< Read a virtual index from the Offsets section */
SDKConf_Signature = 1, /**< Read a signature from the Signatures section */
};
enum SDKType
{
SDKType_CBaseEntity, /**< CBaseEntity (always as pointer) */
SDKType_CBasePlayer, /**< CBasePlayer (always as pointer) */
SDKType_Vector, /**< Vector (pointer, byval, or byref) */
SDKType_QAngle, /**< QAngles (pointer, byval, or byref) */
SDKType_PlainOldData, /**< Integer/generic data <=32bit (any) */
SDKType_Float, /**< Float (any) */
SDKType_Edict, /**< edict_t (always as pointer) */
SDKType_String, /**< NULL-terminated string (always as pointer) */
SDKType_Bool, /**< Boolean (any) */
};
enum SDKPassMethod
{
SDKPass_Pointer, /**< Pass as a pointer */
SDKPass_Plain, /**< Pass as plain data */
SDKPass_ByValue, /**< Pass an object by value */
SDKPass_ByRef, /**< Pass an object by reference */
};
#define VDECODE_FLAG_ALLOWNULL (1<<0) /**< Allow NULL for pointers */
#define VDECODE_FLAG_ALLOWNOTINGAME (1<<1) /**< Allow players not in game */
#define VDECODE_FLAG_ALLOWWORLD (1<<2) /**< Allow World entity */
#define VDECODE_FLAG_BYREF (1<<3) /**< Floats/ints by reference */
#define VENCODE_FLAG_COPYBACK (1<<0) /**< Copy back data once done */
/**
* Starts the preparation of an SDK call.
*
* @param type Type of function call this will be.
* @noreturn
*/
native StartPrepSDKCall(SDKCallType:type);
/**
* Sets the virtual index of the SDK call if it is virtual.
*
* @param vtblidx Virtual table index.
* @noreturn
*/
native PrepSDKCall_SetVirtual(vtblidx);
/**
* Finds an address in a library and sets it as the address to use for the SDK call.
*
* @param lib Library to use.
* @param signature Binary data to search for in the library. If it starts with '@',
* the bytes parameter is ignored and the signature is interpreted
* as a symbol lookup in the library.
* @param bytes Number of bytes in the binary search string.
* @return True on success, false if nothing was found.
*/
native bool:PrepSDKCall_SetSignature(SDKLibrary:lib, const String:signature[], bytes);
/**
* Finds an address or virtual function index in a GameConfig file and sets it as
* the calling information for the SDK call.
*
* @param gameconf GameConfig Handle, or INVALID_HANDLE to use sdktools.games.txt.
* @param source Whether to look in Offsets or Signatures.
* @param name Name of the property to find.
* @return True on success, false if nothing was found.
*/
native bool:PrepSDKCall_SetFromConf(Handle:gameconf, SDKFuncConfSource:source, const String:name[]);
/**
* Sets the return information of an SDK call. Do not call this if there is no return data.
* This must be called if there is a return value (i.e. it is not necessarily safe to ignore
* the data).
*
* @param type Data type to convert to/from.
* @param pass How the data is passed in C++.
* @param decflags Flags on decoding from the plugin to C++.
* @param encflags Flags on encoding from C++ to the plugin.
* @noreturn
*/
native PrepSDKCall_SetReturnInfo(SDKType:type, SDKPassMethod:pass, decflags=0, encflags=0);
/**
* Adds a parameter to the calling convention. This should be called in normal ascending order.
*
* @param type Data type to convert to/from.
* @param pass How the data is passed in C++.
* @param decflags Flags on decoding from the plugin to C++.
* @param encflags Flags on encoding from C++ to the plugin.
* @noreturn
*/
native PrepSDKCall_AddParameter(SDKType:type, SDKPassMethod:pass, decflags=0, encflags=0);
/**
* Finalizes an SDK call preparation and returns the resultant Handle.
*
* @return A new SDKCall Handle on success, or INVALID_HANDLE on failure.
*/
native Handle:EndPrepSDKCall();
/**
* Calls an SDK function with the given parameters.
*
* If the call type is Entity or Player, the index MUST ALWAYS be the FIRST parameter passed.
* If the call type is GameRules, then nothing special needs to be passed.
* If the return value is a Vector or QAngles, the SECOND parameter must be a Float[3].
* If the return value is a string, the THIRD parameter must be a String buffer, and the
* FOURTH parameter must be the maximum length.
* All parameters must be passed after the above is followed. Failure to follow these
* rules will result in crashes or wildly unexpected behavior!
*
* If the return value is a float or integer, the return value will be this value.
* If the return value is a CBaseEntity, CBasePlayer, or edict, the return value will
* always be the entity index, or -1 for NULL.
*
* @param call SDKCall Handle.
* @param ... Call Parameters.
* @return Simple return value, if any.
* @error Invalid Handle or internal decoding error.
*/
native any:SDKCall(Handle:call, any:...);
#include <sdktools_stocks>
/**
* Do not edit below this line!
*/
public Extension:__ext_sdktools =
{
name = "SDKTools",
file = "sdktools.ext",
#if defined AUTOLOAD_EXTENSIONS
autoload = 1,
#else
autoload = 0,
#endif
#if defined REQUIRE_EXTENSIONS
required = 1,
#else
required = 0,
#endif
};

View File

@ -0,0 +1,69 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: sdktools_engine.inc 1336 2007-08-15 06:19:30Z damagedsoul $
*/
#if defined _sdktools_engine_included
#endinput
#endif
#define _sdktools_engine_included
#define MAX_LIGHTSTYLES 64
/**
* Sets a client's "viewing entity."
*
* @param client Client index.
* @param entity Entity index.
* @noreturn
* @error Invalid client or entity, lack of mod support, or client not in
* game.
*/
native SetClientViewEntity(client, entity);
/**
* Sets a light style.
*
* @param style Light style (from 0 to MAX_LIGHTSTYLES-1)
* @param value Light value string (see world.cpp/light.cpp in dlls)
* @noreturn
* @error Light style index is out of range.
*/
native SetLightStyle(style, const String:value[]);
/**
* Returns the client's eye position.
*
* @param client Player's index.
* @param pos Destination vector to store the client's eye position.
* @noreturn
* @error Invalid client index, client not in game, or no mod support.
*/
native GetClientEyePosition(client, Float:pos[3]);

View File

@ -0,0 +1,116 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: sdktools_entinput.inc 1504 2007-09-28 19:56:19Z faluco $
*/
#if defined _sdktools_entinput_included
#endinput
#endif
#define _sdktools_entinput_included
/**
* Invokes a named input method on an entity.
*
* After completion (successful or not), the current global variant is re-initalized.
*
* @param dest Destination entity index.
* @param input Input action.
* @param activator Entity index which initiated the sequence of actions (-1 for a NULL entity).
* @param caller Entity index from which this event is sent (-1 for a NULL entity).
* @param outputid Unknown.
* @return True if successful otherwise false.
* @error Invalid entity index or no mod support.
*/
native bool:AcceptEntityInput(dest, const String:input[], activator=-1, caller=-1, outputid=0);
/**
* Sets a bool value in the global variant object.
*
* @param val Input value.
* @noreturn
*/
native SetVariantBool(bool:val);
/**
* Sets a string in the global variant object.
*
* @param str Input string.
* @noreturn
*/
native SetVariantString(const String:str[]);
/**
* Sets an integer value in the global variant object.
*
* @param val Input value.
* @noreturn
*/
native SetVariantInt(val);
/**
* Sets a floating point value in the global variant object.
*
* @param val Input value.
* @noreturn
*/
native SetVariantFloat(Float:val);
/**
* Sets a 3D vector in the global variant object.
*
* @param vec Input vector.
* @noreturn
*/
native SetVariantVector3D(const Float:vec[3]);
/**
* Sets a 3D position vector in the global variant object.
*
* @param vec Input position vector.
* @noreturn
*/
native SetVariantPosVector3D(const Float:vec[3]);
/**
* Sets a color in the global variant object.
*
* @param color Input color.
* @noreturn
*/
native SetVariantColor(const color[4]);
/**
* Sets an entity in the global variant object.
*
* @param Entity index.
* @noreturn
* @error Invalid entity index.
*/
native SetVariantEntity(entity);

View File

@ -0,0 +1,91 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: sdktools_entoutput.inc 1990 2008-04-06 05:40:11Z dvander $
*/
#if defined _sdktools_entoutput_included
#endinput
#endif
#define _sdktools_entoutput_included
/**
* Called when an entity output is fired.
*
* @param output Name of the output that fired.
* @param caller Entity index of the caller.
* @param activator Entity index of the activator.
* @param delay Delay in seconds? before the event gets fired.
*/
functag EntityOutput public(const String:output[], caller, activator, Float:delay);
/**
* Add an entity output hook on a entity classname
*
* @param classname The classname to hook.
* @param output The output name to hook.
* @param callback An EntityOutput function pointer.
* @noreturn
* @error Entity Outputs disabled.
*/
native HookEntityOutput(const String:classname[], const String:output[], EntityOutput:callback);
/**
* Remove an entity output hook.
* @param classname The classname to hook.
* @param output The output name to hook.
* @param callback An EntityOutput function pointer.
* @return True on success, false if no valid hook was found.
* @error Entity Outputs disabled.
*/
native bool:UnhookEntityOutput(const String:classname[], const String:output[], EntityOutput:callback);
/**
* Add an entity output hook on a single entity instance
*
* @param entity The entity on which to add a hook.
* @param output The output name to hook.
* @param callback An EntityOutput function pointer.
* @param once Only fire this hook once and then remove itself.
* @noreturn
* @error Entity Outputs disabled or Invalid Entity index.
*/
native HookSingleEntityOutput(entity, const String:output[], EntityOutput:callback , bool:once=false);
/**
* Remove a single entity output hook.
*
* @param entity The entity on which to remove the hook.
* @param output The output name to hook.
* @param callback An EntityOutput function pointer.
* @return True on success, false if no valid hook was found.
* @error Entity Outputs disabled or Invalid Entity index.
*/
native bool:UnhookSingleEntityOutput(entity, const String:output[], EntityOutput:callback);

View File

@ -0,0 +1,310 @@
/**
* 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: sdktools_functions.inc 2069 2008-04-16 23:29:37Z dvander $
*/
#if defined _sdktools_functions_included
#endinput
#endif
#define _sdktools_functions_included
/**
* Removes a player's item.
*
* @param client Client index.
* @param item CBaseCombatWeapon entity index.
* @return True on success, false otherwise.
* @error Invalid client or entity, lack of mod support, or client not in
* game.
*/
native bool:RemovePlayerItem(client, item);
/**
* Gives a named item to a player.
*
* @param client Client index.
* @param item Item classname (such as weapon_ak47).
* @param iSubType Unknown.
* @return Entity index on success, or -1 on failure.
* @error Invalid client or client not in game, or lack of mod support.
*/
native GivePlayerItem(client, const String:item[], iSubType=0);
/**
* Returns the weapon in a player's slot.
*
* @param client Client index.
* @param slot Slot index (mod specific).
* @return Entity index on success, -1 if no weapon existed.
* @error Invalid client or client not in game, or lack of mod support.
*/
native GetPlayerWeaponSlot(client, slot);
/**
* Ignites an entity on fire.
*
* @param entity Entity index.
* @param time Number of seconds to set on fire.
* @param npc True to only affect NPCs.
* @param size Unknown.
* @param level Unknown.
* @noreturn
* @error Invalid entity or client not in game, or lack of mod support.
*/
native IgniteEntity(entity, Float:time, bool:npc=false, Float:size=0.0, bool:level=false);
/**
* Extinguishes a player that is on fire.
*
* @param entity Entity index.
* @noreturn
* @error Invalid entity or client not in game, or lack of mod support.
*/
native ExtinguishEntity(client);
/**
* Teleports an entity.
*
* @param entity Client index.
* @param origin New origin, or NULL_VECTOR for no change.
* @param angles New angles, or NULL_VECTOR for no change.
* @param velocity New velocity, or NULL_VECTOR for no change.
* @noreturn
* @error Invalid entity or client not in game, or lack of mod support.
*/
native TeleportEntity(entity, const Float:origin[3], const Float:angles[3], const Float:velocity[3]);
/**
* Forces a player to commit suicide.
*
* @param client Client index.
* @noreturn
* @error Invalid client or client not in game, or lack of mod support.
*/
native ForcePlayerSuicide(client);
/**
* Slaps a player in a random direction.
*
* @param client Client index.
* @param health Health to subtract.
* @param sound False to disable the sound effects.
* @noreturn
* @error Invalid client or client not in game, or lack of mod support.
*/
native SlapPlayer(client, health=5, bool:sound=true);
/**
* Searches for an entity by classname.
*
* @param startEnt The entity index after which to begin searching from.
* Use -1 to start from the first entity.
* @param classname Classname of the entity to find.
* @return Entity index >= 0 if found, -1 otherwise.
* @error Lack of mod support.
*/
native FindEntityByClassname(startEnt, const String:classname[]);
/**
* Returns the client's eye angles.
*
* @param client Player's index.
* @param ang Destination vector to store the client's eye angles.
* @return True on success, false on failure.
* @error Invalid client index, client not in game, or no mod support.
*/
native bool:GetClientEyeAngles(client, Float:ang[3]);
/**
* Creates an entity by string name, but does not spawn it (see DispatchSpawn).
* If ForceEdictIndex is not -1, then it will use the edict by that index. If the index is
* invalid or there is already an edict using that index, it will error out.
*
* @param classname Entity classname.
* @param ForceEdictIndex Edict index used by the created entity.
* @return Entity index on success, or -1 on failure.
* @error Invalid edict index, or no mod support.
*/
native CreateEntityByName(const String:classname[], ForceEdictIndex=-1);
/**
* Spawns an entity into the game.
*
* @param entity Entity index of the created entity.
* @return True on success, false otherwise.
* @error Invalid entity index, or no mod support.
*/
native bool:DispatchSpawn(entity);
/**
* Dispatches a KeyValue into given entity using a string value.
*
* @param entity Destination entity index.
* @param keyName Name of the key.
* @param value String value.
* @return True on success, false otherwise.
* @error Invalid entity index, or no mod support.
*/
native bool:DispatchKeyValue(entity, const String:keyName[], const String:value[]);
/**
* Dispatches a KeyValue into given entity using a floating point value.
*
* @param entity Destination entity index.
* @param keyName Name of the key.
* @param value Floating point value.
* @return True on success, false otherwise.
* @error Invalid entity index, or no mod support.
*/
native bool:DispatchKeyValueFloat(entity, const String:keyName[], Float:value);
/**
* Dispatches a KeyValue into given entity using a vector value.
*
* @param entity Destination entity index.
* @param keyName Name of the key.
* @param vec Vector value.
* @return True on success, false otherwise.
* @error Invalid entity index, or no mod support.
*/
native bool:DispatchKeyValueVector(entity, const String:keyName[], const Float:vector[3]);
/**
* Returns the entity a client is aiming at.
*
* @param client Client performing the aiming.
* @param only_clients True to exclude all entities but clients.
* @return Entity index being aimed at.
* -1 if no entity is being aimed at.
* -2 if the function is not supported.
* @error Invalid client index or client not in game.
*/
native GetClientAimTarget(client, bool:only_clients=true);
/**
* Returns the total number of teams in a game.
* Note: This native should not be called before OnMapStart.
*
* @return Total number of teams.
*/
native GetTeamCount();
/**
* Retrieves the team name based on a team index.
* Note: This native should not be called before OnMapStart.
*
* @param index Team index.
* @param name Buffer to store string in.
* @param maxlength Maximum length of string buffer.
* @noreturn
* @error Invalid team index.
*/
native GetTeamName(index, String:name[], maxlength);
/**
* Returns the score of a team based on a team index.
* Note: This native should not be called before OnMapStart.
*
* @param index Team index.
* @return Score.
* @error Invalid team index.
*/
native GetTeamScore(index);
/**
* Sets the score of a team based on a team index.
* Note: This native should not be called before OnMapStart.
*
* @param index Team index.
* @param value New score value.
* @return Score.
* @error Invalid team index.
*/
native SetTeamScore(index, value);
/**
* Retrieves the number of players in a certain team.
* Note: This native should not be called before OnMapStart.
*
* @param index Team index.
* @return Number of players in the team.
* @error Invalid team index.
*/
native GetTeamClientCount(index);
/**
* Sets the model to a given entity.
*
* @param entity Entity index.
* @param model Model name.
* @noreturn
* @error Invalid entity index, or no mod support.
*/
native SetEntityModel(entity, const String:model[]);
/**
* Retrieves the decal file name associated to a given client.
*
* @param client Player's index.
* @param hex Buffer to store the logo filename.
* @param maxlength Maximum length of string buffer.
* @return True on success, otherwise false.
* @error Invalid client or client not in game.
*/
native bool:GetPlayerDecalFile(client, String:hex[], maxlength);
/**
* Returns the average server network traffic in bytes/sec.
*
* @param in Buffer to store the input traffic velocity.
* @param out Buffer to store the output traffic velocity.
* @noreturn
*/
native GetServerNetStats(&Float:in, &Float:out);
/**
* Equip's a player's weapon.
*
* @param client Client index.
* @param item CBaseCombatWeapon entity index.
* @noreturn
* @error Invalid client or entity, lack of mod support, or client not in
* game.
*/
native EquipPlayerWeapon(client, weapon);
/**
* Activates an entity (CBaseAnimating::Activate)
*
* @param entity Entity index.
* @noreturn
* @error Invalid entity or lack of mod support.
*/
native ActivateEntity(entity);

View File

@ -0,0 +1,442 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: sdktools_sound.inc 1934 2008-03-12 05:21:56Z dvander $
*/
#if defined _sdktools_sound_included
#endinput
#endif
#define _sdktools_sound_included
/**
* Sound should be from the target client.
*/
#define SOUND_FROM_PLAYER -2
/**
* Sound should be from the listen server player.
*/
#define SOUND_FROM_LOCAL_PLAYER -1
/**
* Sound is from the world.
*/
#define SOUND_FROM_WORLD 0
/**
* Sound channels.
*/
enum
{
SNDCHAN_REPLACE = -1, /**< Unknown */
SNDCHAN_AUTO = 0, /**< Auto */
SNDCHAN_WEAPON = 1, /**< Weapons */
SNDCHAN_VOICE = 2, /**< Voices */
SNDCHAN_ITEM = 3, /**< Items */
SNDCHAN_BODY = 4, /**< Player? */
SNDCHAN_STREAM = 5, /**< "Stream channel from the static or dynamic area" */
SNDCHAN_STATIC = 6, /**< "Stream channel from the static area" */
SNDCHAN_VOICE_BASE = 7, /**< "Channel for network voice data" */
SNDCHAN_USER_BASE = 135 /**< Anything >= this is allocated to game code */
};
/**
* Sound flags for the sound emitter system.
*/
enum
{
SND_NOFLAGS= 0, /**< Nothing */
SND_CHANGEVOL = 1, /**< Change sound volume */
SND_CHANGEPITCH = 2, /**< Change sound pitch */
SND_STOP = 3, /**< Stop the sound */
SND_SPAWNING = 4, /**< Used in some cases for ambients */
SND_DELAY = 5, /**< Sound has an initial delay */
SND_STOPLOOPING = 6, /**< Stop looping all sounds on the entity */
SND_SPEAKER = 7, /**< Being played by a mic through a speaker */
SND_SHOULDPAUSE = 8, /**< Pause if game is paused */
};
/**
* Various predefined sound levels in dB.
*/
enum
{
SNDLEVEL_NONE = 0, /**< None */
SNDLEVEL_RUSTLE = 20, /**< Rustling leaves */
SNDLEVEL_WHISPER = 25, /**< Whispering */
SNDLEVEL_LIBRARY = 30, /**< In a library */
SNDLEVEL_FRIDGE = 45, /**< Refridgerator */
SNDLEVEL_HOME = 50, /**< Average home (3.9 attn) */
SNDLEVEL_CONVO = 60, /**< Normal conversation (2.0 attn) */
SNDLEVEL_DRYER = 60, /**< Clothes dryer */
SNDLEVEL_DISHWASHER = 65, /**< Dishwasher/washing machine (1.5 attn) */
SNDLEVEL_CAR = 70, /**< Car or vacuum cleaner (1.0 attn) */
SNDLEVEL_NORMAL = 75, /**< Normal sound level */
SNDLEVEL_TRAFFIC = 75, /**< Busy traffic (0.8 attn) */
SNDLEVEL_MINIBIKE = 80, /**< Mini-bike, alarm clock (0.7 attn) */
SNDLEVEL_SCREAMING = 90, /**< Screaming child (0.5 attn) */
SNDLEVEL_TRAIN = 100, /**< Subway train, pneumatic drill (0.4 attn) */
SNDLEVEL_HELICOPTER = 105, /**< Helicopter */
SNDLEVEL_SNOWMOBILE = 110, /**< Snow mobile */
SNDLEVEL_AIRCRAFT = 120, /**< Auto horn, aircraft */
SNDLEVEL_RAIDSIREN = 130, /**< Air raid siren */
SNDLEVEL_GUNFIRE = 140, /**< Gunshot, jet engine (0.27 attn) */
SNDLEVEL_ROCKET = 180, /**< Rocket launching (0.2 attn) */
};
#define SNDVOL_NORMAL 1.0 /**< Normal volume */
#define SNDPITCH_NORMAL 100 /**< Normal pitch */
#define SNDPITCH_LOW 95 /**< A low pitch */
#define SNDPITCH_HIGH 120 /**< A high pitch */
#define SNDATTN_NONE 0.0 /**< No attenuation */
#define SNDATTN_NORMAL 0.8 /**< Normal attenuation */
#define SNDATTN_STATIC 1.25 /**< Static attenuation? */
#define SNDATTN_RICOCHET 1.5 /**< Ricochet effect */
#define SNDATTN_IDLE 2.0 /**< Idle attenuation? */
/**
* Prefetches a sound.
*
* @param name Sound file name relative to the "sounds" folder.
* @noreturn
*/
native PrefetchSound(const String:nane[]);
/**
* This function is not known to work, and may crash. You should
* not use it. It is provided for backwards compatibility only.
*
* @param name Sound file name relative to the "sounds" folder.
* @return Duration in seconds.
*/
#pragma deprecated Does not work, may crash.
native Float:GetSoundDuration(const String:name[]);
/**
* Emits an ambient sound.
*
* @param name Sound file name relative to the "sounds" folder.
* @param pos Origin of sound.
* @param entity Entity index to associate sound with.
* @param level Sound level (from 0 to 255).
* @param flags Sound flags.
* @param vol Volume (from 0.0 to 1.0).
* @param pitch Pitch (from 0 to 255).
* @param delay Play delay.
* @noreturn
*/
native EmitAmbientSound(const String:name[],
const Float:pos[3],
entity = SOUND_FROM_WORLD,
level = SNDLEVEL_NORMAL,
flags = SND_NOFLAGS,
Float:vol = SNDVOL_NORMAL,
pitch = SNDPITCH_NORMAL,
Float:delay = 0.0);
/**
* Fades a client's volume level toward silence or a given percentage.
*
* @param client Client index.
* @param percent Fade percentage.
* @param outtime Fade out time, in seconds.
* @param holdtime Hold time, in seconds.
* @param intime Fade in time, in seconds.
* @noreturn
* @error Invalid client index or client not in game.
*/
native FadeClientVolume(client, Float:percent, Float:outtime, Float:holdtime, Float:intime);
/**
* Stops a sound.
*
* @param entity Entity index.
* @param channel Channel number.
* @param name Sound file name relative to the "sounds" folder.
* @noreturn
*/
native StopSound(entity, channel, const String:name[]);
/**
* Emits a sound to a list of clients.
*
* @param clients Array of client indexes.
* @param numClients Number of clients in the array.
* @param sample Sound file name relative to the "sounds" folder.
* @param entity Entity to emit from.
* @param channel Channel to emit with.
* @param level Sound level.
* @param flags Sound flags.
* @param volume Sound volume.
* @param pitch Sound pitch.
* @param speakerentity Unknown.
* @param origin Sound origin.
* @param dir Sound direction.
* @param updatePos Unknown (updates positions?)
* @param soundtime Alternate time to play sound for.
* @param ... Optional list of Float[3] arrays to specify additional origins.
* @noreturn
* @error Invalid client index.
*/
native EmitSound(const clients[],
numClients,
const String:sample[],
entity = SOUND_FROM_PLAYER,
channel = SNDCHAN_AUTO,
level = SNDLEVEL_NORMAL,
flags = SND_NOFLAGS,
Float:volume = SNDVOL_NORMAL,
pitch = SNDPITCH_NORMAL,
speakerentity = -1,
const Float:origin[3] = NULL_VECTOR,
const Float:dir[3] = NULL_VECTOR,
bool:updatePos = true,
Float:soundtime = 0.0,
any:...);
/**
* Emits a sentence to a list of clients.
*
* @param clients Array of client indexes.
* @param numClients Number of clients in the array.
* @param sentence Sentence index (from PrecacheSenteFile).
* @param entity Entity to emit from.
* @param channel Channel to emit with.
* @param level Sound level.
* @param flags Sound flags.
* @param volume Sound volume.
* @param pitch Sound pitch.
* @param speakerentity Unknown.
* @param origin Sound origin.
* @param dir Sound direction.
* @param updatePos Unknown (updates positions?)
* @param soundtime Alternate time to play sound for.
* @param ... Optional list of Float[3] arrays to specify additional origins.
* @noreturn
* @error Invalid client index.
*/
native EmitSentence(const clients[],
numClients,
sentence,
entity,
channel = SNDCHAN_AUTO,
level = SNDLEVEL_NORMAL,
flags = SND_NOFLAGS,
Float:volume = SNDVOL_NORMAL,
pitch = SNDPITCH_NORMAL,
speakerentity = -1,
const Float:origin[3] = NULL_VECTOR,
const Float:dir[3] = NULL_VECTOR,
bool:updatePos = true,
Float:soundtime = 0.0,
any:...);
/**
* Called when an ambient sound is about to be emitted to one or more clients.
*
* NOTICE: all parameters can be overwritten to modify the default behavior.
*
* @param sample Sound file name relative to the "sounds" folder.
* @param entity Entity index associated to the sound.
* @param volume Volume (from 0.0 to 1.0).
* @param level Sound level (from 0 to 255).
* @param pitch Pitch (from 0 to 255).
* @param pos Origin of sound.
* @param flags Sound flags.
* @param delay Play delay.
* @return Plugin_Continue to allow the sound to be played, Plugin_Stop to block it,
* Plugin_Changed when any parameter has been modified.
*/
functag AmbientSHook Action:public(String:sample[PLATFORM_MAX_PATH], &entity, &Float:volume, &level, &pitch, Float:pos[3], &flags, &Float:delay);
/**
* Called when a sound is going to be emitted to one or more clients.
* NOTICE: all params can be overwritten to modify the default behaviour.
*
* @param clients Array of client indexes.
* @param numClients Number of clients in the array (modify this value if you add/remove elements from the client array).
* @param sample Sound file name relative to the "sounds" folder.
* @param entity Entity emitting the sound.
* @param channel Channel emitting the sound.
* @param volume Sound volume.
* @param level Sound level.
* @param pitch Sound pitch.
* @param flags Sound flags.
* @return Plugin_Continue to allow the sound to be played, Plugin_Stop to block it,
* Plugin_Changed when any parameter has been modified.
*/
functag NormalSHook Action:public(clients[64], &numClients, String:sample[PLATFORM_MAX_PATH], &entity, &channel, &Float:volume, &level, &pitch, &flags);
/**
* Hooks all played ambient sounds.
*
* @param hook Function to use as a hook.
* @noreturn
* @error Invalid function hook.
*/
native AddAmbientSoundHook(AmbientSHook:hook);
/**
* Hooks all played normal sounds.
*
* @param hook Function to use as a hook.
* @noreturn
* @error Invalid function hook.
*/
native AddNormalSoundHook(NormalSHook:hook);
/**
* Unhooks all played ambient sounds.
*
* @param hook Function used for the hook.
* @noreturn
* @error Invalid function hook.
*/
native RemoveAmbientSoundHook(AmbientSHook:hook);
/**
* Unhooks all played normal sounds.
*
* @param hook Function used for the hook.
* @noreturn
* @error Invalid function hook.
*/
native RemoveNormalSoundHook(NormalSHook:hook);
/**
* Wrapper to emit sound to one client.
*
* @param client Client index.
* @param sample Sound file name relative to the "sounds" folder.
* @param entity Entity to emit from.
* @param channel Channel to emit with.
* @param level Sound level.
* @param flags Sound flags.
* @param volume Sound volume.
* @param pitch Sound pitch.
* @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 EmitSoundToClient(client,
const String:sample[],
entity = SOUND_FROM_PLAYER,
channel = SNDCHAN_AUTO,
level = SNDLEVEL_NORMAL,
flags = SND_NOFLAGS,
Float:volume = SNDVOL_NORMAL,
pitch = SNDPITCH_NORMAL,
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;
EmitSound(clients, 1, sample, entity, channel,
level, flags, volume, pitch, speakerentity,
origin, dir, updatePos, soundtime);
}
/**
* Wrapper to emit sound to all clients.
*
* @param sample Sound file name relative to the "sounds" folder.
* @param entity Entity to emit from.
* @param channel Channel to emit with.
* @param level Sound level.
* @param flags Sound flags.
* @param volume Sound volume.
* @param pitch Sound pitch.
* @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 EmitSoundToAll(const String:sample[],
entity = SOUND_FROM_PLAYER,
channel = SNDCHAN_AUTO,
level = SNDLEVEL_NORMAL,
flags = SND_NOFLAGS,
Float:volume = SNDVOL_NORMAL,
pitch = SNDPITCH_NORMAL,
speakerentity = -1,
const Float:origin[3] = NULL_VECTOR,
const Float:dir[3] = NULL_VECTOR,
bool:updatePos = true,
Float:soundtime = 0.0)
{
new maxClients = GetMaxClients();
new clients[maxClients];
new total = 0;
for (new i=1; i<=maxClients; i++)
{
if (IsClientInGame(i))
{
clients[total++] = i;
}
}
if (!total)
{
return;
}
EmitSound(clients, total, sample, entity, channel,
level, flags, volume, pitch, speakerentity,
origin, dir, updatePos, soundtime);
}
/**
* Converts an attenuation value to a sound level.
* This function is from the HL2SDK.
*
* @param attn Attenuation value.
* @return Integer sound level.
*/
stock ATTN_TO_SNDLEVEL(Float:attn)
{
if (attn > 0.0)
{
return RoundFloat(50.0 + (20.0 / attn));
}
return 0;
}

View File

@ -0,0 +1,76 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: sdktools_stocks.inc 1622 2007-10-21 00:16:46Z dvander $
*/
#if defined _sdktools_stocks_included
#endinput
#endif
#define _sdktools_stocks_included
/**
* Given a partial team name, attempts to find a matching team.
*
* The search is performed case insensitively and only against the
* first N characters of the team names, where N is the number of
* characters in the search pattern.
*
* @param name Partial or full team name.
* @return A valid team index on success.
* -1 if no team matched.
* -2 if more than one team matched.
*/
stock FindTeamByName(const String:name[])
{
new name_len = strlen(name);
new num_teams = GetTeamCount();
decl String:team_name[32];
new found_team = -1
for (new i = 0; i < num_teams; i++)
{
GetTeamName(i, team_name, sizeof(team_name));
if (strncmp(team_name, name, name_len) == 0)
{
if (found_team >= 0)
{
return -2;
}
else
{
found_team = i;
}
}
}
return found_team;
}

View File

@ -0,0 +1,180 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: sdktools_stringtables.inc 1336 2007-08-15 06:19:30Z damagedsoul $
*/
#if defined _sdktools_stringtables_included
#endinput
#endif
#define _sdktools_stringtables_included
#define INVALID_STRING_TABLE -1 /**< An invalid string table index */
#define INVALID_STRING_INDEX -1 /**< An invalid string index in a table */
/**
* Searches for a string table.
*
* @param name Name of string table to find.
* @return A string table index number if found, INVALID_STRING_TABLE otherwise.
*/
native FindStringTable(const String:name[]);
/**
* Returns the number of string tables that currently exist.
*
* @return Number of string tables that currently exist.
*/
native GetNumStringTables();
/**
* Returns the number of strings that currently exist in a given string table.
*
* @param tableidx A string table index.
* @return Number of strings that currently exist.
* @error Invalid string table index.
*/
native GetStringTableNumStrings(tableidx);
/**
* Returns the maximum number of strings that are allowed in a given string table.
*
* @param tableidx A string table index.
* @return Maximum number of strings allowed.
* @error Invalid string table index.
*/
native GetStringTableMaxStrings(tableidx);
/**
* Retrieves the name of a string table.
*
* @param tableidx A string table index.
* @param name Buffer to store the name of the string table.
* @param maxlength Maximum length of string buffer.
* @return Number of bytes written to the buffer (UTF-8 safe).
* @error Invalid string table index.
*/
native GetStringTableName(tableidx, String:name[], maxlength);
/**
* Searches for the index of a given string in a string table.
*
* @param tableidx A string table index.
* @param string String to find.
* @return String index if found, INVALID_STRING_INDEX otherwise.
* @error Invalid string table index.
*/
native FindStringIndex(tableidx, const String:str[]);
/**
* Retrieves the string at a given index of a string table.
*
* @param tableidx A string table index.
* @param stringidx A string index.
* @param name Buffer to store the string value.
* @param maxlength Maximum length of string buffer.
* @return Number of bytes written to the buffer (UTF-8 safe).
* @error Invalid string table index or string index.
*/
native ReadStringTable(tableidx, stringIdx, String:str[], maxlength);
/**
* Returns the length of the user data associated with a given string index.
*
* @param tableidx A string table index.
* @param stringidx A string index.
* @return Length of user data. This will be 0 if there is no user data.
* @error Invalid string table index or string index.
*/
native GetStringTableDataLength(tableidx, stringidx);
/**
* Retrieves the user data associated with a given string index.
*
* @param tableidx A string table index.
* @param stringidx A string index.
* @param userdata Buffer to store the user data. This will be set to "" if there is no user data.
* @param maxlength Maximum length of string buffer.
* @return Number of bytes written to the buffer (UTF-8 safe).
* @error Invalid string table index or string index.
*/
native GetStringTableData(tableidx, stringIdx, String:userdata[], maxlength);
/**
* Sets the user data associated with a given string index.
*
* @param tableidx A string table index.
* @param stringidx A string index.
* @param userdata User data string that will be set.
* @param length Length of user data string. This should include the null terminator.
* @return Number of bytes written to the buffer (UTF-8 safe).
* @error Invalid string table index or string index.
*/
native SetStringTableData(tableidx, stringIdx, const String:userdata[], length);
/**
* Adds a string to a given string table.
*
* @param tableidx A string table index.
* @param string String to add.
* @param userdata An optional user data string.
* @param length Length of user data string. This should include the null terminator.
* If set to -1, then user data will be not be altered if the specified string
* already exists in the string table.
*/
native AddToStringTable(tableidx, const String:str[], const String:userdata[]="", length=-1);
/**
* Locks or unlocks the network string tables.
*
* @param lock Determines whether network string tables should be locked.
* True means the tables should be locked for writing; false means unlocked.
* @return Previous lock state.
*/
native bool:LockStringTables(bool:lock);
/**
* Adds a file to the downloadables network string table.
* This forces a client to download the file if they do not already have it.
*
* @param filename File that will be added to downloadables table.
*/
stock AddFileToDownloadsTable(const String:filename[])
{
static table = INVALID_STRING_TABLE;
if (table == INVALID_STRING_TABLE)
{
table = FindStringTable("downloadables");
}
new bool:save = LockStringTables(false);
AddToStringTable(table, filename);
LockStringTables(save);
}

View File

@ -0,0 +1,229 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: sdktools_tempents.inc 1336 2007-08-15 06:19:30Z damagedsoul $
*/
#if defined _sdktools_tempents_included
#endinput
#endif
#define _sdktools_tempents_included
/**
* Called when a temp entity is going to be sent.
*
* @param te_name TE name.
* @param Players Array containing target player indexes.
* @param numClients Number of players in the array.
* @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 TEHook Action:public(const String:te_name[], const Players[], numClients, Float:delay);
/**
* Hooks a temp entity.
*
* @param te_name TE name to hook.
* @param hook Function to use as a hook.
* @noreturn
* @error Temp Entity name not available or invalid function hook.
*/
native AddTempEntHook(const String:te_name[], TEHook:hook);
/**
* Removes a temp entity hook.
*
* @param te_name TE name to unhook.
* @param hook Function used for the hook.
* @noreturn
* @error Temp Entity name not available or invalid function hook.
*/
native RemoveTempEntHook(const String:te_name[], TEHook:hook);
/**
* Starts a temp entity transmission.
*
* @param te_name TE name.
* @noreturn
* @error Temp Entity name not available.
*/
native TE_Start(const String:te_name[]);
/**
* Checks if a certain TE property exists.
*
* @param prop Property to use.
* @return True if the property exists, otherwise false.
*/
native bool:TE_IsValidProp(const String:prop[]);
/**
* Sets an integer value in the current temp entity.
*
* @param prop Property to use.
* @param value Integer value to set.
* @noreturn
* @error Property not found.
*/
native TE_WriteNum(const String:prop[], value);
/**
* Reads an integer value in the current temp entity.
*
* @param prop Property to use.
* @return Property value.
* @error Property not found.
*/
native TE_ReadNum(const String:prop[]);
/**
* Sets a floating point number in the current temp entity.
*
* @param prop Property to use.
* @param value Floating point number to set.
* @noreturn
* @error Property not found.
*/
native TE_WriteFloat(const String:prop[], Float:value);
/**
* Reads a floating point number in the current temp entity.
*
* @param prop Property to use.
* @noreturn Property value.
* @error Property not found.
*/
native Float:TE_ReadFloat(const String:prop[]);
/**
* Sets a vector in the current temp entity.
*
* @param prop Property to use.
* @param vector Vector to set.
* @noreturn
* @error Property not found.
*/
native TE_WriteVector(const String:prop[], const Float:vector[3]);
/**
* Reads a vector in the current temp entity.
*
* @param prop Property to use.
* @param vector Vector to read.
* @noreturn
* @error Property not found.
*/
native TE_ReadVector(const String:prop[], Float:vector[3]);
/**
* Sets a QAngle in the current temp entity.
*
* @param prop Property to use.
* @param angles Angles to set.
* @return True on success, otherwise false.
* @error Property not found.
*/
native TE_WriteAngles(const String:prop[], const Float:angles[3]);
/**
* Sets an array of floats in the current temp entity.
*
* @param prop Property to use.
* @param array Array of values to copy.
* @param arraySize Number of values to copy.
* @return True on success, otherwise false.
* @error Property not found.
*/
native TE_WriteFloatArray(const String:prop[], const Float:array[], arraySize);
/**
* Sends the current temp entity to one or more clients.
*
* @param clients Array containing player indexes to broadcast to.
* @param numClients Number of players in the array.
* @param delay Delay in seconds to send the TE.
* @noreturn
* @error Invalid client index or client not in game.
*/
native TE_Send(clients[], numClients, Float:delay=0.0);
/**
* Sets an encoded entity index in the current temp entity.
* (This is usually used for m_nStartEntity and m_nEndEntity).
*
* @param prop Property to use.
* @param value Value to set.
* @noreturn
* @error Property not found.
*/
stock TE_WriteEncodedEnt(const String:prop[], value)
{
new encvalue = (value & 0x0FFF) | ((1 & 0xF)<<12);
return TE_WriteNum(prop, encvalue);
}
/**
* Broadcasts the current temp entity to all clients.
* @note See TE_Start().
*
* @param delay Delay in seconds to send the TE.
* @noreturn
*/
stock TE_SendToAll(Float:delay=0.0)
{
new maxClients = GetMaxClients();
new total = 0;
new clients[maxClients];
for (new i=1; i<=maxClients; i++)
{
if (IsClientInGame(i))
{
clients[total++] = i;
}
}
return TE_Send(clients, total, delay);
}
/**
* Sends the current TE to only a client.
* @note See TE_Start().
*
* @param client Client to send to.
* @param delay Delay in seconds to send the TE.
* @noreturn
* @error Invalid client index or client not in game.
*/
stock TE_SendToClient(client, Float:delay=0.0)
{
new players[1];
players[0] = client;
return TE_Send(players, 1, delay);
}

View File

@ -0,0 +1,458 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: sdktools_tempents_stocks.inc 1336 2007-08-15 06:19:30Z damagedsoul $
*/
#if defined _te_stocks_included
#endinput
#endif
#define _te_stocks_included
/**
* @section TE Explosion flags.
*/
#define TE_EXPLFLAG_NONE 0x0 /**< all flags clear makes default Half-Life explosion */
#define TE_EXPLFLAG_NOADDITIVE 0x1 /**< sprite will be drawn opaque (ensure that the sprite you send is a non-additive sprite) */
#define TE_EXPLFLAG_NODLIGHTS 0x2 /**< do not render dynamic lights */
#define TE_EXPLFLAG_NOSOUND 0x4 /**< do not play client explosion sound */
#define TE_EXPLFLAG_NOPARTICLES 0x8 /**< do not draw particles */
#define TE_EXPLFLAG_DRAWALPHA 0x10 /**< sprite will be drawn alpha */
#define TE_EXPLFLAG_ROTATE 0x20 /**< rotate the sprite randomly */
#define TE_EXPLFLAG_NOFIREBALL 0x40 /**< do not draw a fireball */
#define TE_EXPLFLAG_NOFIREBALLSMOKE 0x80 /**< do not draw smoke with the fireball */
/**
* @endsection
*/
/**
* @section TE Beam flags.
*/
#define FBEAM_STARTENTITY 0x00000001
#define FBEAM_ENDENTITY 0x00000002
#define FBEAM_FADEIN 0x00000004
#define FBEAM_FADEOUT 0x00000008
#define FBEAM_SINENOISE 0x00000010
#define FBEAM_SOLID 0x00000020
#define FBEAM_SHADEIN 0x00000040
#define FBEAM_SHADEOUT 0x00000080
#define FBEAM_ONLYNOISEONCE 0x00000100 /**< Only calculate our noise once */
#define FBEAM_NOTILE 0x00000200
#define FBEAM_USE_HITBOXES 0x00000400 /**< Attachment indices represent hitbox indices instead when this is set. */
#define FBEAM_STARTVISIBLE 0x00000800 /**< Has this client actually seen this beam's start entity yet? */
#define FBEAM_ENDVISIBLE 0x00001000 /**< Has this client actually seen this beam's end entity yet? */
#define FBEAM_ISACTIVE 0x00002000
#define FBEAM_FOREVER 0x00004000
#define FBEAM_HALOBEAM 0x00008000 /**< When drawing a beam with a halo, don't ignore the segments and endwidth */
/**
* @endsection
*/
/**
* Sets up a sparks effect.
*
* @param pos Position of the sparks.
* @param dir Direction of the sparks.
* @param Magnitude Sparks size.
* @param TrailLength Trail lenght of the sparks.
* @noreturn
*/
stock TE_SetupSparks(const Float:pos[3], const Float:dir[3], Magnitude, TrailLength)
{
TE_Start("Sparks");
TE_WriteVector("m_vecOrigin[0]", pos);
TE_WriteVector("m_vecDir", dir);
TE_WriteNum("m_nMagnitude", Magnitude);
TE_WriteNum("m_nTrailLength", TrailLength);
}
/**
* Sets up a smoke effect.
*
* @param pos Position of the smoke.
* @param Model Precached model index.
* @param Scale Scale of the smoke.
* @param Framerate Frame rate of the smoke.
* @noreturn
*/
stock TE_SetupSmoke(const Float:pos[3], Model, Float:Scale, FrameRate)
{
TE_Start("Smoke");
TE_WriteVector("m_vecOrigin", pos);
TE_WriteNum("m_nModelIndex", Model);
TE_WriteFloat("m_fScale", Scale);
TE_WriteNum("m_nFrameRate", FrameRate);
}
/**
* Sets up a dust cloud effect.
*
* @param pos Position of the dust.
* @param dir Direction of the dust.
* @param Size Dust cloud size.
* @param Speed Dust cloud speed.
* @noreturn
*/
stock TE_SetupDust(const Float:pos[3], const Float:dir[3], Float:Size, Float:Speed)
{
TE_Start("Dust");
TE_WriteVector("m_vecOrigin[0]", pos);
TE_WriteVector("m_vecDirection", dir);
TE_WriteFloat("m_flSize", Size);
TE_WriteFloat("m_flSpeed", Speed);
}
/**
* Sets up a muzzle flash effect.
*
* @param pos Position of the muzzle flash.
* @param angles Rotation angles of the muzzle flash.
* @param Scale Scale of the muzzle flash.
* @param Type Muzzle flash type to render (Mod specific).
* @noreturn
*/
stock TE_SetupMuzzleFlash(const Float:pos[3], const Float:angles[3], Float:Scale, Type)
{
TE_Start("MuzzleFlash");
TE_WriteVector("m_vecOrigin", pos);
TE_WriteVector("m_vecAngles", angles);
TE_WriteFloat("m_flScale", Scale);
TE_WriteNum("m_nType", Type);
}
/**
* Sets up a metal sparks effect.
*
* @param pos Position of the metal sparks.
* @param dir Direction of the metal sparks.
* @noreturn
*/
stock TE_SetupMetalSparks(const Float:pos[3], const Float:dir[3])
{
TE_Start("Metal Sparks");
TE_WriteVector("m_vecPos", pos);
TE_WriteVector("m_vecDir", dir);
}
/**
* Sets up an energy splash effect.
*
* @param pos Position of the energy splash.
* @param dir Direction of the energy splash.
* @param Explosive Makes the effect explosive.
* @noreturn
*/
stock TE_SetupEnergySplash(const Float:pos[3], const Float:dir[3], bool:Explosive)
{
TE_Start("Energy Splash");
TE_WriteVector("m_vecPos", pos);
TE_WriteVector("m_vecDir", dir);
TE_WriteNum("m_bExplosive", Explosive);
}
/**
* Sets up an armor ricochet effect.
*
* @param pos Position of the armor ricochet.
* @param dir Directon of the armor ricochet.
* @noreturn
*/
stock TE_SetupArmorRicochet(const Float:pos[3], const Float:dir[3])
{
TE_Start("Armor Ricochet");
TE_WriteVector("m_vecPos", pos);
TE_WriteVector("m_vecDir", dir);
}
/**
* Sets up a glowing sprite effect.
*
* @param pos Position of the sprite.
* @param Model Precached model index.
* @param Life Time duration of the sprite.
* @param Size Sprite size.
* @param Brightness Sprite brightness.
* @noreturn
*/
stock TE_SetupGlowSprite(const Float:pos[3], Model, Float:Life, Float:Size, Brightness)
{
TE_Start("GlowSprite");
TE_WriteVector("m_vecOrigin", pos);
TE_WriteNum("m_nModelIndex", Model);
TE_WriteFloat("m_fScale", Size);
TE_WriteFloat("m_fLife", Life);
TE_WriteNum("m_nBrightness", Brightness);
}
/**
* Sets up a explosion effect.
*
* @param pos Explosion position.
* @param Model Precached model index.
* @param Scale Explosion scale.
* @param Framerate Explosion frame rate.
* @param Flags Explosion flags.
* @param Radius Explosion radius.
* @param Magnitude Explosion size.
* @param normal Normal vector to the explosion.
* @param MaterialType Exploded material type.
* @noreturn
*/
stock TE_SetupExplosion(const Float:pos[3], Model, Float:Scale, Framerate, Flags, Radius, Magnitude, const Float:normal[3]={0.0, 0.0, 1.0}, MaterialType='C')
{
TE_Start("Explosion");
TE_WriteVector("m_vecOrigin[0]", pos);
TE_WriteVector("m_vecNormal", normal);
TE_WriteNum("m_nModelIndex", Model);
TE_WriteFloat("m_fScale", Scale);
TE_WriteNum("m_nFrameRate", Framerate);
TE_WriteNum("m_nFlags", Flags);
TE_WriteNum("m_nRadius", Radius);
TE_WriteNum("m_nMagnitude", Magnitude);
TE_WriteNum("m_chMaterialType", MaterialType);
}
/**
* Sets up a blood sprite effect.
*
* @param pos Position of the sprite.
* @param dir Sprite direction.
* @param color Color array (r, g, b, a).
* @param Size Sprite size.
* @param SprayModel Precached model index.
* @param BloodDropModel Precached model index.
* @noreturn
*/
stock TE_SetupBloodSprite(const Float:pos[3], const Float:dir[3], const color[4], Size, SprayModel, BloodDropModel)
{
TE_Start("Blood Sprite");
TE_WriteVector("m_vecOrigin", pos);
TE_WriteVector("m_vecDirection", dir);
TE_WriteNum("r", color[0]);
TE_WriteNum("g", color[1]);
TE_WriteNum("b", color[2]);
TE_WriteNum("a", color[3]);
TE_WriteNum("m_nSize", Size);
TE_WriteNum("m_nSprayModel", SprayModel);
TE_WriteNum("m_nDropModel", BloodDropModel);
}
/**
* Sets up a beam ring point effect.
*
* @param center Center position of the ring.
* @param Start_Radius Initial ring radius.
* @param End_Radius Final ring radius.
* @param ModelIndex Precached model index.
* @param HaloIndex Precached model index.
* @param StartFrame Initital frame to render.
* @param FrameRate Ring frame rate.
* @param Life Time duration of the ring.
* @param Width Beam width.
* @param Amplitude Beam amplitude.
* @param color Color array (r, g, b, a).
* @param Speed Speed of the beam.
* @param Flags Beam flags.
* @noreturn
*/
stock TE_SetupBeamRingPoint(const Float:center[3], Float:Start_Radius, Float:End_Radius, ModelIndex, HaloIndex, StartFrame,
FrameRate, Float:Life, Float:Width, Float:Amplitude, const Color[4], Speed, Flags)
{
TE_Start("BeamRingPoint");
TE_WriteVector("m_vecCenter", center);
TE_WriteFloat("m_flStartRadius", Start_Radius);
TE_WriteFloat("m_flEndRadius", End_Radius);
TE_WriteNum("m_nModelIndex", ModelIndex);
TE_WriteNum("m_nHaloIndex", HaloIndex);
TE_WriteNum("m_nStartFrame", StartFrame);
TE_WriteNum("m_nFrameRate", FrameRate);
TE_WriteFloat("m_fLife", Life);
TE_WriteFloat("m_fWidth", Width);
TE_WriteFloat("m_fEndWidth", Width);
TE_WriteFloat("m_fAmplitude", Amplitude);
TE_WriteNum("r", Color[0]);
TE_WriteNum("g", Color[1]);
TE_WriteNum("b", Color[2]);
TE_WriteNum("a", Color[3]);
TE_WriteNum("m_nSpeed", Speed);
TE_WriteNum("m_nFlags", Flags);
TE_WriteNum("m_nFadeLength", 0);
}
/**
* Sets up a point to point beam effect.
*
* @param start Start position of the beam.
* @param end End position of the beam.
* @param ModelIndex Precached model index.
* @param HaloIndex Precached model index.
* @param StartFrame Initital frame to render.
* @param FrameRate Beam frame rate.
* @param Life Time duration of the beam.
* @param Width Initial beam width.
* @param EndWidth Final beam width.
* @param FadeLength Beam fade time duration.
* @param Amplitude Beam amplitude.
* @param color Color array (r, g, b, a).
* @param Speed Speed of the beam.
* @noreturn
*/
stock TE_SetupBeamPoints(const Float:start[3], const Float:end[3], ModelIndex, HaloIndex, StartFrame, FrameRate, Float:Life,
Float:Width, Float:EndWidth, FadeLength, Float:Amplitude, const Color[4], Speed)
{
TE_Start("BeamPoints");
TE_WriteVector("m_vecStartPoint", start);
TE_WriteVector("m_vecEndPoint", end);
TE_WriteNum("m_nModelIndex", ModelIndex);
TE_WriteNum("m_nHaloIndex", HaloIndex);
TE_WriteNum("m_nStartFrame", StartFrame);
TE_WriteNum("m_nFrameRate", FrameRate);
TE_WriteFloat("m_fLife", Life);
TE_WriteFloat("m_fWidth", Width);
TE_WriteFloat("m_fEndWidth", EndWidth);
TE_WriteFloat("m_fAmplitude", Amplitude);
TE_WriteNum("r", Color[0]);
TE_WriteNum("g", Color[1]);
TE_WriteNum("b", Color[2]);
TE_WriteNum("a", Color[3]);
TE_WriteNum("m_nSpeed", Speed);
TE_WriteNum("m_nFadeLength", FadeLength);
}
/**
* Sets up an entity to entity laser effect.
*
* @param StartEntity Entity index from where the beam starts.
* @param EndEntity Entity index from where the beam ends.
* @param ModelIndex Precached model index.
* @param HaloIndex Precached model index.
* @param StartFrame Initital frame to render.
* @param FrameRate Beam frame rate.
* @param Life Time duration of the beam.
* @param Width Initial beam width.
* @param EndWidth Final beam width.
* @param FadeLength Beam fade time duration.
* @param Amplitude Beam amplitude.
* @param color Color array (r, g, b, a).
* @param Speed Speed of the beam.
* @noreturn
*/
stock TE_SetupBeamLaser(StartEntity, EndEntity, ModelIndex, HaloIndex, StartFrame, FrameRate, Float:Life,
Float:Width, Float:EndWidth, FadeLength, Float:Amplitude, const Color[4], Speed)
{
TE_Start("BeamLaser");
TE_WriteEncodedEnt("m_nStartEntity", StartEntity);
TE_WriteEncodedEnt("m_nEndEntity", EndEntity);
TE_WriteNum("m_nModelIndex", ModelIndex);
TE_WriteNum("m_nHaloIndex", HaloIndex);
TE_WriteNum("m_nStartFrame", StartFrame);
TE_WriteNum("m_nFrameRate", FrameRate);
TE_WriteFloat("m_fLife", Life);
TE_WriteFloat("m_fWidth", Width);
TE_WriteFloat("m_fEndWidth", EndWidth);
TE_WriteFloat("m_fAmplitude", Amplitude);
TE_WriteNum("r", Color[0]);
TE_WriteNum("g", Color[1]);
TE_WriteNum("b", Color[2]);
TE_WriteNum("a", Color[3]);
TE_WriteNum("m_nSpeed", Speed);
TE_WriteNum("m_nFadeLength", FadeLength);
}
/**
* Sets up a beam ring effect.
*
* @param StartEntity Entity index from where the ring starts.
* @param EndEntity Entity index from where the ring ends.
* @param ModelIndex Precached model index.
* @param HaloIndex Precached model index.
* @param StartFrame Initital frame to render.
* @param FrameRate Ring frame rate.
* @param Life Time duration of the ring.
* @param Width Beam width.
* @param Amplitude Beam amplitude.
* @param color Color array (r, g, b, a).
* @param Speed Speed of the beam.
* @param Flags Beam flags.
* @noreturn
*/
stock TE_SetupBeamRing(StartEntity, EndEntity, ModelIndex, HaloIndex, StartFrame, FrameRate, Float:Life, Float:Width, Float:Amplitude, const Color[4], Speed, Flags)
{
TE_Start("BeamRing");
TE_WriteEncodedEnt("m_nStartEntity", StartEntity);
TE_WriteEncodedEnt("m_nEndEntity", EndEntity);
TE_WriteNum("m_nModelIndex", ModelIndex);
TE_WriteNum("m_nHaloIndex", HaloIndex);
TE_WriteNum("m_nStartFrame", StartFrame);
TE_WriteNum("m_nFrameRate", FrameRate);
TE_WriteFloat("m_fLife", Life);
TE_WriteFloat("m_fWidth", Width);
TE_WriteFloat("m_fEndWidth", Width);
TE_WriteFloat("m_fAmplitude", Amplitude);
TE_WriteNum("r", Color[0]);
TE_WriteNum("g", Color[1]);
TE_WriteNum("b", Color[2]);
TE_WriteNum("a", Color[3]);
TE_WriteNum("m_nSpeed", Speed);
TE_WriteNum("m_nFadeLength", 0);
TE_WriteNum("m_nFlags", Flags);
}
/**
* Sets up a follow beam effect.
*
* @param EntIndex Entity index from where the beam starts.
* @param ModelIndex Precached model index.
* @param HaloIndex Precached model index.
* @param Life Time duration of the beam.
* @param Width Initial beam width.
* @param EndWidth Final beam width.
* @param FadeLength Beam fade time duration.
* @param color Color array (r, g, b, a).
* @noreturn
*/
stock TE_SetupBeamFollow(EntIndex, ModelIndex, HaloIndex, Float:Life, Float:Width, Float:EndWidth, FadeLength, const Color[4])
{
TE_Start("BeamFollow");
TE_WriteEncodedEnt("m_iEntIndex", EntIndex);
TE_WriteNum("m_nModelIndex", ModelIndex);
TE_WriteNum("m_nHaloIndex", HaloIndex);
TE_WriteNum("m_nStartFrame", 0);
TE_WriteNum("m_nFrameRate", 0);
TE_WriteFloat("m_fLife", Life);
TE_WriteFloat("m_fWidth", Width);
TE_WriteFloat("m_fEndWidth", EndWidth);
TE_WriteNum("m_nFadeLength", FadeLength);
TE_WriteNum("r", Color[0]);
TE_WriteNum("g", Color[1]);
TE_WriteNum("b", Color[2]);
TE_WriteNum("a", Color[3]);
}

View File

@ -0,0 +1,367 @@
/**
* 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: sdktools_trace.inc 2208 2008-05-29 03:50:36Z dvander $
*/
#if defined _sdktools_trace_included
#endinput
#endif
#define _sdktools_trace_included
#define CONTENTS_EMPTY 0 /**< No contents. */
#define CONTENTS_SOLID 0x1 /**< an eye is never valid in a solid . */
#define CONTENTS_WINDOW 0x2 /**< translucent, but not watery (glass). */
#define CONTENTS_AUX 0x4
#define CONTENTS_GRATE 0x8 /**< alpha-tested "grate" textures. Bullets/sight pass through, but solids don't. */
#define CONTENTS_SLIME 0x10
#define CONTENTS_WATER 0x20
#define CONTENTS_MIST 0x40
#define CONTENTS_OPAQUE 0x80 /**< things that cannot be seen through (may be non-solid though). */
#define LAST_VISIBLE_CONTENTS 0x80
#define ALL_VISIBLE_CONTENTS (LAST_VISIBLE_CONTENTS | (LAST_VISIBLE_CONTENTS-1))
#define CONTENTS_TESTFOGVOLUME 0x100
#define CONTENTS_UNUSED5 0x200
#define CONTENTS_UNUSED6 0x4000
#define CONTENTS_TEAM1 0x800 /**< per team contents used to differentiate collisions. */
#define CONTENTS_TEAM2 0x1000 /**< between players and objects on different teams. */
#define CONTENTS_IGNORE_NODRAW_OPAQUE 0x2000 /**< ignore CONTENTS_OPAQUE on surfaces that have SURF_NODRAW. */
#define CONTENTS_MOVEABLE 0x4000 /**< hits entities which are MOVETYPE_PUSH (doors, plats, etc) */
#define CONTENTS_AREAPORTAL 0x8000 /**< remaining contents are non-visible, and don't eat brushes. */
#define CONTENTS_PLAYERCLIP 0x10000
#define CONTENTS_MONSTERCLIP 0x20000
/**
* @section currents can be added to any other contents, and may be mixed
*/
#define CONTENTS_CURRENT_0 0x40000
#define CONTENTS_CURRENT_90 0x80000
#define CONTENTS_CURRENT_180 0x100000
#define CONTENTS_CURRENT_270 0x200000
#define CONTENTS_CURRENT_UP 0x400000
#define CONTENTS_CURRENT_DOWN 0x800000
/**
* @endsection
*/
#define CONTENTS_ORIGIN 0x1000000 /**< removed before bsping an entity. */
#define CONTENTS_MONSTER 0x2000000 /**< should never be on a brush, only in game. */
#define CONTENTS_DEBRIS 0x4000000
#define CONTENTS_DETAIL 0x8000000 /**< brushes to be added after vis leafs. */
#define CONTENTS_TRANSLUCENT 0x10000000 /**< auto set if any surface has trans. */
#define CONTENTS_LADDER 0x20000000
#define CONTENTS_HITBOX 0x40000000 /**< use accurate hitboxes on trace. */
/**
* @section Trace masks.
*/
#define MASK_ALL (0xFFFFFFFF)
#define MASK_SOLID (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_MONSTER|CONTENTS_GRATE) /**< everything that is normally solid */
#define MASK_PLAYERSOLID (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_PLAYERCLIP|CONTENTS_WINDOW|CONTENTS_MONSTER|CONTENTS_GRATE) /**< everything that blocks player movement */
#define MASK_NPCSOLID (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_MONSTERCLIP|CONTENTS_WINDOW|CONTENTS_MONSTER|CONTENTS_GRATE) /**< blocks npc movement */
#define MASK_WATER (CONTENTS_WATER|CONTENTS_MOVEABLE|CONTENTS_SLIME) /**< water physics in these contents */
#define MASK_OPAQUE (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_OPAQUE) /**< everything that blocks line of sight for AI, lighting, etc */
#define MASK_OPAQUE_AND_NPCS (MASK_OPAQUE|CONTENTS_MONSTER) /**< everything that blocks line of sight for AI, lighting, etc, but with monsters added. */
#define MASK_VISIBLE (MASK_OPAQUE|CONTENTS_IGNORE_NODRAW_OPAQUE) /**< everything that blocks line of sight for players */
#define MASK_VISIBLE_AND_NPCS (MASK_OPAQUE_AND_NPCS|CONTENTS_IGNORE_NODRAW_OPAQUE) /**< everything that blocks line of sight for players, but with monsters added. */
#define MASK_SHOT (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_MONSTER|CONTENTS_WINDOW|CONTENTS_DEBRIS|CONTENTS_HITBOX) /**< bullets see these as solid */
#define MASK_SHOT_HULL (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_MONSTER|CONTENTS_WINDOW|CONTENTS_DEBRIS|CONTENTS_GRATE) /**< non-raycasted weapons see this as solid (includes grates) */
#define MASK_SHOT_PORTAL (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW) /**< hits solids (not grates) and passes through everything else */
#define MASK_SOLID_BRUSHONLY (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_GRATE) /**< everything normally solid, except monsters (world+brush only) */
#define MASK_PLAYERSOLID_BRUSHONLY (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_PLAYERCLIP|CONTENTS_GRATE) /**< everything normally solid for player movement, except monsters (world+brush only) */
#define MASK_NPCSOLID_BRUSHONLY (CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_MONSTERCLIP|CONTENTS_GRATE) /**< everything normally solid for npc movement, except monsters (world+brush only) */
#define MASK_NPCWORLDSTATIC (CONTENTS_SOLID|CONTENTS_WINDOW|CONTENTS_MONSTERCLIP|CONTENTS_GRATE) /**< just the world, used for route rebuilding */
#define MASK_SPLITAREAPORTAL (CONTENTS_WATER|CONTENTS_SLIME) /**< These are things that can split areaportals */
/**
* @endsection
*/
enum RayType
{
RayType_EndPoint, /**< The trace ray will go from the start position to the end position. */
RayType_Infinite /**< The trace ray will go from the start position to infinity using a direction vector. */
};
funcenum TraceEntityFilter
{
/**
* Called on entity filtering.
*
* @param entity Entity index.
* @param contentsMask Contents Mask.
* @return True to allow the current entity to be hit, otherwise false.
*/
bool:public(entity, contentsMask),
/**
* Called on entity filtering.
*
* @param entity Entity index.
* @param contentsMask Contents Mask.
* @param data Data value, if used.
* @return True to allow the current entity to be hit, otherwise false.
*/
bool:public(entity, contentsMask, any:data),
};
/**
* Get the contents mask and the entity index at the given position.
*
* @param pos World position to test.
* @param entindex Entity index found at the given position (by reference).
* @return Contents mask.
*/
native TR_GetPointContents(const Float:pos[3], &entindex=-1);
/**
* Get the point contents testing only the given entity index.
*
* @param entindex Entity index to test.
* @param pos World position.
* @return Contents mask.
*/
native TR_GetPointContentsEnt(entindex, const Float:pos[3]);
/**
* Starts up a new trace ray using a global trace result.
*
* @param pos Starting position of the ray.
* @param vec Depending on RayType, it will be used as the
* ending point, or the direction angle.
* @param flags Trace flags.
* @param rtype Method to calculate the ray direction.
* @noreturn
*/
native TR_TraceRay(const Float:pos[3],
const Float:vec[3],
flags,
RayType:rtype);
/**
* Starts up a new trace hull using a global trace result.
*
* @param pos Starting position of the ray.
* @param vec Ending position of the ray.
* @param mins Hull minimum size.
* @param maxs Hull maximum size.
* @param flags Trace flags.
* @noreturn
*/
native TR_TraceHull(const Float:pos[3],
const Float:vec[3],
const Float:mins[3],
const Float:maxs[3],
flags);
/**
* Starts up a new trace ray using a global trace result and a customized
* trace ray filter.
*
* Calling TR_Trace*Filter or TR_Trace*FilterEx from inside a filter
* function is currently not allowed and may not work.
*
* @param pos Starting position of the ray.
* @param vec Depending on RayType, it will be used as the ending
* point, or the direction angle.
* @param flags Trace flags.
* @param rtype Method to calculate the ray direction.
* @param filter Function to use as a filter.
* @param data Arbitrary data value to pass through to the filter
* function.
* @noreturn
*/
native TR_TraceRayFilter(const Float:pos[3],
const Float:vec[3],
flags,
RayType:rtype,
TraceEntityFilter:filter,
any:data=0);
/**
* Starts up a new trace hull using a global trace result and a customized
* trace ray filter.
*
* Calling TR_Trace*Filter or TR_Trace*FilterEx from inside a filter
* function is currently not allowed and may not work.
*
* @param pos Starting position of the ray.
* @param vec Depending on RayType, it will be used as the ending
* point, or the direction angle.
* @param mins Hull minimum size.
* @param maxs Hull maximum size.
* @param flags Trace flags.
* @param filter Function to use as a filter.
* @param data Arbitrary data value to pass through to the filter
* function.
* @noreturn
*/
native TR_TraceHullFilter(const Float:pos[3],
const Float:vec[3],
const Float:mins[3],
const Float:maxs[3],
flags,
TraceEntityFilter:filter,
any:data=0);
/**
* Starts up a new trace ray using a new trace result.
*
* @param pos Starting position of the ray.
* @param vec Depending on RayType, it will be used as the ending
* point, or the direction angle.
* @param flags Trace flags.
* @param rtype Method to calculate the ray direction.
* @return Ray trace handle, which must be closed via CloseHandle().
*/
native Handle:TR_TraceRayEx(const Float:pos[3],
const Float:vec[3],
flags,
RayType:rtype);
/**
* Starts up a new trace hull using a new trace result.
*
* @param pos Starting position of the ray.
* @param vec Ending position of the ray.
* @param mins Hull minimum size.
* @param maxs Hull maximum size.
* @param flags Trace flags.
* @return Ray trace handle, which must be closed via CloseHandle().
*/
native Handle:TR_TraceHullEx(const Float:pos[3],
const Float:vec[3],
const Float:mins[3],
const Float:maxs[3],
flags);
/**
* Starts up a new trace ray using a new trace result and a customized
* trace ray filter.
*
* Calling TR_Trace*Filter or TR_TraceRay*Ex from inside a filter
* function is currently not allowed and may not work.
*
* @param pos Starting position of the ray.
* @param vec Depending on RayType, it will be used as the ending
* point, or the direction angle.
* @param flags Trace flags.
* @param rtype Method to calculate the ray direction.
* @param filter Function to use as a filter.
* @param data Arbitrary data value to pass through to the filter function.
* @return Ray trace handle, which must be closed via CloseHandle().
*/
native Handle:TR_TraceRayFilterEx(const Float:pos[3],
const Float:vec[3],
flags,
RayType:rtype,
TraceEntityFilter:filter,
any:data=0);
/**
* Starts up a new trace hull using a new trace result and a customized
* trace ray filter.
*
* Calling TR_Trace*Filter or TR_Trace*FilterEx from inside a filter
* function is currently not allowed and may not work.
*
* @param pos Starting position of the ray.
* @param vec Ending position of the ray.
* @param mins Hull minimum size.
* @param maxs Hull maximum size.
* @param flags Trace flags.
* @param filter Function to use as a filter.
* @param data Arbitrary data value to pass through to the filter function.
* @return Ray trace handle, which must be closed via CloseHandle().
*/
native Handle:TR_TraceHullFilterEx(const Float:pos[3],
const Float:vec[3],
const Float:mins[3],
const Float:maxs[3],
flags,
TraceEntityFilter:filter,
any:data=0);
/**
* Returns the time fraction from a trace result (1.0 means no collision).
*
* @param hndl A trace Handle, or INVALID_HANDLE to use a global trace result.
* @return Time fraction value of the trace.
* @error Invalid Handle.
*/
native Float:TR_GetFraction(Handle:hndl=INVALID_HANDLE);
/**
* Returns the collision position of a trace result.
*
* @param pos Vector buffer to store data in.
* @param hndl A trace Handle, or INVALID_HANDLE to use a global trace result.
* @noreturn
* @error Invalid Handle.
*/
native TR_GetEndPosition(Float:pos[3], Handle:hndl=INVALID_HANDLE);
/**
* Returns the entity index that collided with the trace.
*
* @param hndl A trace Handle, or INVALID_HANDLE to use a global trace result.
* @return Entity index or -1 for no collision.
* @error Invalid Handle.
*/
native TR_GetEntityIndex(Handle:hndl=INVALID_HANDLE);
/**
* Returns if there was any kind of collision along the trace ray.
*
* @param hndl A trace Handle, or INVALID_HANDLE to use a global trace result.
* @return True if any collision found, otherwise false.
* @error Invalid Handle.
*/
native bool:TR_DidHit(Handle:hndl=INVALID_HANDLE);
/**
* Returns in which body hit group the trace collided if any.
*
* @param hndl A trace Handle, or INVALID_HANDLE to use a global trace result.
* @return Body hit group.
* @error Invalid Handle.
*/
native TR_GetHitGroup(Handle:hndl=INVALID_HANDLE);
/**
* Find the normal vector to the collison plane of a trace.
*
* @param hndl A trace Handle, or INVALID_HANDLE to use a global trace result.
* @param normal Vector buffer to store the vector normal to the collision plane
* @noreturn
* @error Invalid Handle
*/
native TR_GetPlaneNormal(Handle:hndl, Float:normal[3]);

View File

@ -0,0 +1,92 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: sdktools_voice.inc 2163 2008-05-21 03:31:27Z dvander $
*/
#if defined _sdktools_voice_included
#endinput
#endif
#define _sdktools_voice_included
/**
* @section voice flags.
*/
#define VOICE_NORMAL 0 /**< Allow the client to listen and speak normally. */
#define VOICE_MUTED 1 /**< Mutes the client from speaking to everyone. */
#define VOICE_SPEAKALL 2 /**< Allow the client to speak to everyone. */
#define VOICE_LISTENALL 4 /**< Allow the client to listen to everyone. */
#define VOICE_TEAM 8 /**< Allow the client to always speak to team, even when dead. */
#define VOICE_LISTENTEAM 16 /**< Allow the client to always hear teammates, including dead ones. */
#define LISTEN_DEFAULT 0 /**< Default action (flags or game) is taken */
#define LISTEN_NO 1 /**< Receiver cannot hear sender */
#define LISTEN_YES 2 /**< Receiver can hear sender */
/**
* @endsection
*/
/**
* Set the client listening flags.
*
* @param client The client index
* @param flags The voice flags
* @noreturn
*/
native SetClientListeningFlags(client, flags);
/**
* Retrieve the client current listening flags.
*
* @param client The client index
* @return The current voice flags
*/
native GetClientListeningFlags(client);
/**
* Set the receiver's ability to listen to the sender.
*
* @param receiver The listener client index.
* @param sender The sender client index.
* @param control A LISTEN_ constant describing the voice relationship.
* @noreturn
* @error If either client index is invalid or not connected.
*/
native bool:SetClientListening(receiver, sender, control);
/**
* Retrieves if a receiver can listen to the sender.
*
* @param receiver The listener client index.
* @param sender The sender client index.
* @return A LISTEN_ constant describing the voice relationship.
* @error If either client index is invalid or not connected.
*/
native bool:GetClientListening(receiver, sender);

176
src/include/sorting.inc Normal file
View File

@ -0,0 +1,176 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: sorting.inc 1923 2008-03-03 06:28:41Z pred $
*/
#if defined _sorting_included
#endinput
#endif
#define _sorting_included
/**
* Contains sorting orders.
*/
enum SortOrder
{
Sort_Ascending = 0, /**< Ascending order */
Sort_Descending = 1, /**< Descending order */
Sort_Random = 2 /**< Random order */
};
/**
* Data types for ADT Array Sorts
*/
enum SortType
{
Sort_Integer = 0,
Sort_Float,
Sort_String,
};
/**
* Sorts an array of integers.
*
* @param array Array of integers to sort in-place.
* @param array_size Size of the array.
* @param order Sorting order to use.
* @noreturn
*/
native SortIntegers(array[], array_size, SortOrder:order = Sort_Ascending);
/**
* Sorts an array of float point numbers.
*
* @param array Array of floating point numbers to sort in-place.
* @param array_size Size of the array.
* @param order Sorting order to use.
* @noreturn
*/
native SortFloats(Float:array[], array_size, SortOrder:order = Sort_Ascending);
/**
* Sorts an array of strings.
*
* @param array Array of strings to sort in-place.
* @param array_size Size of the array.
* @param order Sorting order to use.
* @noreturn
*/
native SortStrings(String:array[][], num_strings, SortOrder:order = Sort_Ascending);
/**
* Sort comparison function for 1D array elements.
* @note You may need to use explicit tags in order to use data properly.
*
* @param elem1 First element to compare.
* @param elem2 Second element to compare.
* @param array Array that is being sorted (order is undefined).
* @param hndl Handle optionally passed in while sorting.
* @return -1 if first should go before second
* 0 if first is equal to second
* 1 if first should go after second
*/
functag SortFunc1D public(elem1, elem2, const array[], Handle:hndl);
/**
* Sorts a custom 1D array. You must pass in a comparison function.
*
* @param array Array to sort.
* @param array_size Size of the array to sort.
* @param sortfunc Sort function.
* @param hndl Optional Handle to pass through the comparison calls.
* @noreturn
*/
native SortCustom1D(array[], array_size, SortFunc1D:sortfunc, Handle:hndl=INVALID_HANDLE);
/**
* Sort comparison function for 2D array elements (sub-arrays).
* @note You may need to use explicit tags in order to use data properly.
*
* @param elem1 First array to compare.
* @param elem2 Second array to compare.
* @param array Array that is being sorted (order is undefined).
* @param hndl Handle optionally passed in while sorting.
* @return -1 if first should go before second
* 0 if first is equal to second
* 1 if first should go after second
*/
funcenum SortFunc2D
{
public(array[], array[], const array[][], Handle:hndl),
public(String:array[], String:array[], const String:array[][], Handle:hndl),
};
/**
* Sorts a custom 2D array. You must pass in a comparison function.
*
* @param array Array to sort.
* @param array_size Size of the major array to sort (first index, outermost).
* @param sortfunc Sort comparison function to use.
* @param hndl Optional Handle to pass through the comparison calls.
* @noreturn
*/
native SortCustom2D(array[][], array_size, SortFunc2D:sortfunc, Handle:hndl=INVALID_HANDLE);
/**
* Sort an ADT Array. Specify the type as Integer, Float, or String.
*
* @param array Array Handle to sort
* @param order Sort order to use, same as other sorts.
* @param type Data type stored in the ADT Array
* @noreturn
*/
native SortADTArray(Handle:array, SortOrder:order, SortType:type);
/**
* Sort comparison function for ADT Array elements. Function provides you with
* indexes currently being sorted, use ADT Array functions to retrieve the
* index values and compare.
*
* @param index1 First index to compare.
* @param index2 Second index to compare.
* @param array Array that is being sorted (order is undefined).
* @param hndl Handle optionally passed in while sorting.
* @return -1 if first should go before second
* 0 if first is equal to second
* 1 if first should go after second
*/
functag SortFuncADTArray public(index1, index2, Handle:array, Handle:hndl);
/**
* Custom sorts an ADT Array. You must pass in a comparison function.
*
* @param array Array Handle to sort
* @param sortfunc Sort comparision function to use
* @param hndl Optional Handle to pass through the comparison calls.
* @noreturn
*/
native SortADTArrayCustom(Handle:array, SortFuncADTArray:sortfunc, Handle:hndl=INVALID_HANDLE);

View File

@ -0,0 +1,31 @@
#if defined _sourcebans_included
#endinput
#endif
#define _sourcebans_included
public SharedPlugin:__pl_sourcebans =
{
name = "SourceBans",
file = "sourcebans.smx",
required = 0
};
public __pl_sourcebans_SetNTVOptional()
{
MarkNativeAsOptional("SBBanPlayer");
}
/*********************************************************
* Ban Player from server
*
* @param client The client index of the admin who is banning the client
* @param target The client index of the player to ban
* @param time The time to ban the player for (in minutes, 0 = permanent)
* @param reason The reason to ban the player from the server
* @noreturn
*********************************************************/
native SBBanPlayer(client, target, time, String:reason[]);
//Yarr!

554
src/include/sourcemod.inc Normal file
View File

@ -0,0 +1,554 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: sourcemod.inc 2212 2008-05-29 03:55:31Z dvander $
*/
#if defined _sourcemod_included
#endinput
#endif
#define _sourcemod_included
/**
* Plugin public information.
*/
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 */
};
#include <core>
#include <float>
#include <vector>
#include <string>
#include <handles>
#include <functions>
#include <files>
#include <logging>
#include <timers>
#include <admin>
#include <dbi>
#include <lang>
#include <sorting>
#include <textparse>
#include <clients>
#include <console>
#include <events>
#include <bitbuffer>
#include <usermessages>
#include <keyvalues>
#include <menus>
#include <halflife>
#include <adt>
#include <banning>
#include <commandfilters>
/**
* 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
* paired with OnPluginEnd().
*
* If any run-time error is thrown during this callback, the plugin will be marked
* as failed.
*
* It is not necessary to close any handles or remove hooks in this function.
* SourceMod guarantees that plugin shutdown automatically and correctly releases
* all resources.
*
* @noreturn
*/
forward OnPluginStart();
/**
* Called before OnPluginStart, in case the plugin wants to check for load failure.
* This is called even if the plugin type is "private." Any natives from modules are
* not available at this point. Thus, this forward should only be used for explicit
* pre-emptive things, such as adding dynamic natives, or setting certain types of load filters.
*
* @note It is not safe to call externally resolved natives until OnPluginStart().
* @note Any sort of RTE in this function will cause the plugin to fail loading.
* @note You MUST remember to return SOMETHING here. The act of not returning is
* equivalent to returning 0 (false). If you forgot to return, it will
* cause your plugin to not load with a very strange error message.
*
* @param myself Handle to the plugin.
* @param late Whether or not the plugin was loaded "late" (after map load).
* @param error Error message buffer in case load failed.
* @param err_max Maximum number of characters for error message buffer.
* @return True if load success, false otherwise.
*/
forward bool:AskPluginLoad(Handle:myself, bool:late, String:error[], err_max);
/**
* Called when the plugin is about to be unloaded.
*
* @noreturn
*/
forward OnPluginEnd();
/**
* Called when the plugin's pause status is changing.
*
* @param pause True if the plugin is being paused, false otherwise.
* @noreturn
*/
forward 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();
/**
* Called when the map is loaded.
*
* @note This used to be OnServerLoad(), which is now deprecated.
* Plugins still using the old forward will work.
*/
forward OnMapStart();
/**
* Called right before a map ends.
*/
forward OnMapEnd();
/**
* Called when the map has loaded, servercfgfile (server.cfg) has been
* executed, and all plugin configs are done executing. This is the best
* place to initialize plugin functions which are based on cvar data.
*
* @note This will always be called once and only once per map. It will be
* called after OnMapStart().
*
* @noreturn
*/
forward OnConfigsExecuted();
/**
* This is called once, right after OnMapStart() but any time before
* OnConfigsExecuted(). It is called after the "exec sourcemod.cfg"
* command and all AutoExecConfig() exec commands have been added to
* the ServerCommand() buffer.
*
* If you need to load per-map settings that override default values,
* adding commands to the ServerCommand() buffer here will guarantee
* that they're set before OnConfigsExecuted().
*
* Unlike OnMapStart() and OnConfigsExecuted(), this is not called on
* late loads that occur after OnMapStart().
*
* @noreturn
*/
forward OnAutoConfigsBuffered();
/**
* @deprecated Use OnConfigsExecuted() instead.
*/
#pragma deprecated Use OnConfigsExecuted() instead
forward 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();
/**
* Returns the calling plugin's Handle.
*
* @return Handle of the calling plugin.
*/
native Handle:GetMyHandle();
/**
* Returns an iterator that can be used to search through plugins.
*
* @return Handle to iterate with. Must be closed via
* CloseHandle().
* @error Invalid Handle.
*/
native Handle:GetPluginIterator();
/**
* Returns whether there are more plugins available in the iterator.
*
* @param iter Handle to the plugin iterator.
* @return True on more plugins, false otherwise.
* @error Invalid Handle.
*/
native bool:MorePlugins(Handle:iter);
/**
* Returns the current plugin in the iterator and advances the iterator.
*
* @param iter Handle to the plugin iterator.
* @return Current plugin the iterator is at, before
* the iterator is advanced.
* @error Invalid Handle.
*/
native Handle:ReadPlugin(Handle:iter);
/**
* Returns a plugin's status.
*
* @param plugin Plugin Handle (INVALID_HANDLE uses the calling plugin).
* @return Status code for the plugin.
* @error Invalid Handle.
*/
native PluginStatus:GetPluginStatus(Handle:plugin);
/**
* Retrieves a plugin's file name relative to the plugins folder.
*
* @param plugin Plugin Handle (INVALID_HANDLE uses the calling plugin).
* @param buffer Buffer to the store the file name.
* @param maxlength Maximum length of the name buffer.
* @noreturn
* @error Invalid Handle.
*/
native GetPluginFilename(Handle:plugin, String:buffer[], maxlength);
/**
* Retrieves whether or not a plugin is being debugged.
*
* @param plugin Plugin Handle (INVALID_HANDLE uses the calling plugin).
* @return True if being debugged, false otherwise.
* @error Invalid Handle.
*/
native bool:IsPluginDebugging(Handle:hndl);
/**
* Retrieves a plugin's public info.
*
* @param plugin Plugin Handle (INVALID_HANDLE uses the calling plugin).
* @param info Plugin info property to retrieve.
* @param buffer Buffer to store info in.
* @param maxlength Maximum length of buffer.
* @return True on success, false if property is not available.
* @error Invalid Handle.
*/
native bool:GetPluginInfo(Handle:plugin, PluginInfo:info, String:buffer[], maxlength);
/**
* Finds a plugin by its order in the list from the "plugins list" server
* "sm" command. You should not use this function to loop through all plugins,
* use the iterator instead. Looping through all plugins using this native
* is O(n^2), whereas using the iterator is O(n).
*
* @param order_num Number of the plugin as it appears in "sm plugins list".
* @return Plugin Handle on success, INVALID_HANDLE if no plugin
* matches the given number.
*/
native Handle:FindPluginByNumber(order_num);
/**
* Causes the plugin to enter a failed state. An error will be thrown and
* the plugin will be paused until it is unloaded or reloaded.
*
* For backwards compatibility, if no extra arguments are passed, no
* formatting is applied. If one or more additional arguments is passed,
* the string is formatted using Format(). If any errors are encountered
* during formatting, both the format specifier string and an additional
* error message are written.
*
* This function does not return, and no further code in the plugin is
* executed.
*
* @param string Format specifier string.
* @param ... Formatting arguments.
* @noreturn
* @error Always throws SP_ERROR_ABORT.
*/
native SetFailState(const String:string[], any:...);
/**
* Aborts the current callback and throws an error. This function
* does not return in that no code is executed following it.
*
* @param format String format.
* @param ... Format arguments.
* @noreturn
* @error Always!
*/
native ThrowError(const String:fmt[], any:...);
/**
* Gets the system time as a unix timestamp.
*
* @param bigStamp Optional array to store the 64bit timestamp in.
* @return 32bit timestamp (number of seconds since unix epoch).
*/
native GetTime(bigStamp[2]={0,0});
/**
* Produces a date and/or time string value for a timestamp.
*
* See this URL for valid parameters:
* http://cplusplus.com/reference/clibrary/ctime/strftime.html
*
* @param buffer Destination string buffer.
* @param maxlength Maximum length of output string buffer.
* @param format Formatting rules (passing NULL_STRING will use the rules defined in sm_datetime_format).
* @param stamp Optional time stamp.
* @noreturn
* @error Buffer too small or invalid time format.
*/
native FormatTime(String:buffer[], maxlength, const String:format[], stamp=-1);
/**
* Loads a game config file.
*
* @param file File to load. The path must be relative to the 'gamedata' folder under the config folder
* and the extension should be omitted.
* @return A handle to the game config file or INVALID_HANDLE in failure.
*/
native Handle:LoadGameConfigFile(const String:file[]);
/**
* Returns an offset value.
*
* @param gc Game config handle.
* @param key Key to retrieve from the offset section.
* @return An offset, or -1 on failure.
*/
native GameConfGetOffset(Handle:gc, const String:key[]);
/**
* Gets the value of a key from the "Keys" section.
*
* @param gc Game config handle.
* @param key Key to retrieve from the Keys section.
* @param buffer Destination string buffer.
* @param maxlen Maximum length of output string buffer.
* @return True if key existed, false otherwise.
*/
native bool:GameConfGetKeyValue(Handle:gc, const String:key[], String:buffer[], maxlen);
/**
* Returns the operating system's "tick count," which is a number of
* milliseconds since the operating system loaded. This can be used
* for basic benchmarks.
*
* @return Tick count in milliseconds.
*/
native GetSysTickCount();
/**
* Specifies that the given config file should be executed after plugin load.
* OnConfigsExecuted() will not be called until the config file has executed,
* but it will be called if the execution fails.
*
* @param autoCreate If true, and the config file does not exist, such a config
* file will be automatically created and populated with
* information from the plugin's registered cvars.
* @param name Name of the config file, excluding the .cfg extension.
* If empty, <plugin.filename.cfg> is assumed.
* @param folder Folder under cfg/ to use. By default this is "sourcemod."
* @noreturn
*/
native AutoExecConfig(bool:autoCreate=true, const String:name[]="", const String:folder[]="sourcemod");
/**
* Sets a native as optional, such that if it is unloaded, removed,
* or otherwise non-existent, the plugin will still work. Calling
* removed natives results in a run-time error.
*
* @param name Native name.
* @noreturn
*/
native MarkNativeAsOptional(const String:name[]);
/**
* Registers a library name for identifying as a dependency to
* other plugins.
*
* @param name Library name.
* @noreturn
*/
native RegPluginLibrary(const String:name[]);
/**
* Returns whether a library exists. This function should be considered
* expensive; it should only be called on plugin to determine availability
* of resources. Use OnLibraryAdded()/OnLibraryRemoved() to detect changes
* in optional resources.
*
* @param name Library name of a plugin or extension.
* @return True if exists, false otherwise.
*/
native bool:LibraryExists(const String:name[]);
/**
* Returns the status of an extension, by filename.
*
* @param name Extension name (like "sdktools.ext").
* @param error Optional error message buffer.
* @param maxlength Length of optional error message buffer.
* @return -2 if the extension was not found.
* -1 if the extension was found but failed to load.
* 0 if the extension loaded but reported an error.
* 1 if the extension is running without error.
*/
native GetExtensionFileStatus(const String:name[], String:error[]="", maxlength=0);
/**
* Called after a library is added that the current plugin references
* optionally. A library is either a plugin name or extension name, as
* exposed via its include file.
*
* @param name Library name.
*/
forward OnLibraryAdded(const String:name[]);
/**
* Called right before a library is removed that the current plugin references
* optionally. A library is either a plugin name or extension name, as
* exposed via its include file.
*
* @param name Library name.
*/
forward 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. */
#define MAPLIST_FLAG_NO_DEFAULT (1<<2) /**< Do not read "default" or "mapcyclefile" on failure. */
/**
* Loads a map list to an ADT Array.
*
* A map list is a list of maps from a file. SourceMod allows easy configuration of
* maplists through addons/sourcemod/configs/maplists.cfg. Each entry is given a
* name and a file (for example, "rtv" => "rtv.cfg"), or a name and a redirection
* (for example, "rtv" => "default"). This native will read a map list entry,
* cache the file, and return the list of maps it holds.
*
* Serial change numbers are used to identify if a map list has changed. Thus, if
* you pass a serial change number and it's equal to what SourceMod currently knows
* about the map list, then SourceMod won't reparse the file.
*
* If the maps end up being read from the maps folder (MAPLIST_FLAG_MAPSFOLDER), they
* are automatically sorted in alphabetical, ascending order.
*
* Arrays created by this function are temporary and must be freed via CloseHandle().
* Modifying arrays created by this function will not affect future return values or
* or the contents of arrays returned to other plugins.
*
* @param array Array to store the map list. If INVALID_HANDLE, a new blank
* array will be created. The blocksize should be at least 16;
* otherwise results may be truncated. Items are added to the array
* as strings. The array is never checked for duplicates, and it is
* not read beforehand. Only the serial number is used to detect
* changes.
* @param serial Serial number to identify last known map list change. If -1, the
* the value will not be checked. If the map list has since changed,
* the serial is updated (even if -1 was passed). If there is an error
* finding a valid maplist, then the serial is set to -1.
* @param str Config name, or "default" for the default map list. Config names
* should be somewhat descriptive. For example, the admin menu uses
* a config name of "admin menu". The list names can be configured
* by users in addons/sourcemod/configs/maplists.cfg.
* @param flags MAPLIST_FLAG flags.
* @return On failure:
* INVALID_HANDLE is returned, the serial is set to -1, and the input
* array (if any) is left unchanged.
* On no change:
INVALID_HANDLE is returned, the serial is unchanged, and the input
array (if any) is left unchanged.
* On success:
* A valid array Handle is returned, containing at least one map string.
* If an array was passed, the return value is equal to the passed Array
* Handle. If the passed array was not cleared, it will have grown by at
* least one item. The serial number is updated to a positive number.
* @error Invalid array Handle that is not INVALID_HANDLE.
*/
native Handle:ReadMapList(Handle:array=INVALID_HANDLE,
&serial=-1,
const String:str[]="default",
flags=MAPLIST_FLAG_CLEARARRAY);
/**
* Makes a compatibility binding for map lists. For example, if a function previously used
* "clam.cfg" for map lists, this function will insert a "fake" binding to "clam.cfg" that
* will be overridden if it's in the maplists.cfg file.
*
* @param name Configuration name that would be used with ReadMapList().
* @param file Default file to use.
* @noreturn
*/
native SetMapListCompatBind(const String:name[], const String:file[]);
/**
* Called when a client has sent chat text. This must return either true or
* false to indicate that a client is or is not spamming the server.
*
* The return value is a hint only. Core or another plugin may decide
* otherwise.
*
* @param client Client index. The server (0) will never be passed.
* @return True if client is spamming the server, false otherwise.
*/
forward bool:OnClientFloodCheck(client);
/**
* Called after a client's flood check has been computed. This can be used
* by antiflood algorithms to decay/increase flooding weights.
*
* Since the result from "OnClientFloodCheck" isn't guaranteed to be the
* final result, it is generally a good idea to use this to play with other
* algorithms nicely.
*
* @param client Client index. The server (0) will never be passed.
* @param blocked True if client flooded last "say", false otherwise.
* @noreturn
*/
forward OnClientFloodResult(client, bool:blocked);
#include <helpers>
#include <entity>
#include <entity_prop_stocks>

557
src/include/string.inc Normal file
View File

@ -0,0 +1,557 @@
/**
* 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: string.inc 2206 2008-05-29 03:46:42Z dvander $
*/
#if defined _string_included
#endinput
#endif
#define _string_included
/**
* @global Unless otherwise noted, all string functions which take in a
* writable buffer and maximum length should have the null terminator INCLUDED
* in the length. This means that this is valid:
* strcopy(string, sizeof(string), ...)
*/
/**
* Calculates the length of a string.
*
* @param str String to check.
* @return Number of valid character bytes in the string.
*/
native strlen(const String:str[]);
/**
* Tests whether a string is found inside another string.
*
* @param str String to search in.
* @param substr Substring to find inside the original string.
* @param caseSensitive If true (default), search is case sensitive.
* If false, search is case insensitive.
* @return -1 on failure (no match found). Any other value
* indicates a position in the string where the match starts.
*/
native StrContains(const String:str[], const String:substr[], bool:caseSensitive=true);
/**
* Compares two strings lexographically.
*
* @param str1 First string (left).
* @param str2 Second string (right).
* @param caseSensitive If true (default), comparison is case sensitive.
* If false, comparison is case insensitive.
* @return -1 if str1 < str2
* 0 if str1 == str2
* 1 if str1 > str2
*/
native strcmp(const String:str1[], const String:str2[], bool:caseSensitive=true);
/**
* Compares two strings parts lexographically.
*
* @param str1 First string (left).
* @param str2 Second string (right).
* @param num Number of characters to compare.
* @param caseSensitive If true (default), comparison is case sensitive.
* If false, comparison is case insensitive.
* @return -1 if str1 < str2
* 0 if str1 == str2
* 1 if str1 > str2
*/
native strncmp(const String:str1[], const String:str2[], num, bool:caseSensitive=true);
/**
* Backwards compatible stock - StrCompare is now strcmp
* @deprecated Renamed to strcmp
*/
#pragma deprecated Use strcmp() instead
stock StrCompare(const String:str1[], const String:str2[], bool:caseSensitive=true)
{
return strcmp(str1, str2, caseSensitive);
}
/**
* Returns whether two strings are equal.
*
* @param str1 First string (left).
* @param str2 Second string (right).
* @param caseSensitive If true (default), comparison is case sensitive.
* If false, comparison is case insensitive.
* @return True if equal, false otherwise.
*/
stock bool:StrEqual(const String:str1[], const String:str2[], bool:caseSensitive=true)
{
return (strcmp(str1, str2, caseSensitive) == 0);
}
/**
* Copies one string to another string.
* @note If the destination buffer is too small to hold the source string, the
* destination will be truncated.
*
* @param dest Destination string buffer to copy to.
* @param destlen Destination buffer length (includes null terminator).
* @param source Source string buffer to copy from.
* @return Number of cells written.
*/
native strcopy(String:dest[], destLen, const String:source[]);
/**
* Backwards compatibility stock - use strcopy
* @deprecated Renamed to strcopy
*/
#pragma deprecated Use strcopy() instead
stock StrCopy(String:dest[], destLen, const String:source[])
{
return strcopy(dest, destLen, source);
}
/**
* Formats a string according to the SourceMod format rules (see documentation).
*
* @param buffer Destination string buffer.
* @param maxlength Maximum length of output string buffer.
* @param format Formatting rules.
* @param ... Variable number of format parameters.
* @return Number of cells written.
*/
native Format(String:buffer[], maxlength, const String:format[], any:...);
/**
* Formats a string according to the SourceMod format rules (see documentation).
* @note This is the same as Format(), except none of the input buffers can
* overlap the same memory as the output buffer. Since this security
* check is removed, it is slightly faster.
*
* @param buffer Destination string buffer.
* @param maxlength Maximum length of output string buffer.
* @param format Formatting rules.
* @param ... Variable number of format parameters.
* @return Number of cells written.
*/
native FormatEx(String:buffer[], maxlength, const String:format[], any:...);
/**
* Formats a string according to the SourceMod format rules (see documentation).
* @note This is the same as Format(), except it grabs parameters from a
* parent parameter stack, rather than a local. This is useful for
* implementing your own variable argument functions.
*
* @param buffer Destination string buffer.
* @param maxlength Maximum length of output string buffer.
* @param format Formatting rules.
* @param varpos Argument number which contains the '...' symbol.
* Note: Arguments start at 1.
* @return Number of bytes written.
*/
native VFormat(String:buffer[], maxlength, const String:format[], varpos);
/**
* Converts a string to an integer.
*
* @param str String to convert.
* @param nBase Numerical base to use. 10 is default.
* @return Integer conversion of string, or 0 on failure.
*/
native StringToInt(const String:str[], nBase=10);
/**
* Converts a string to an integer with some more options.
*
* @param str String to convert.
* @param result Variable to store the result in.
* @param nBase Numerical base to use. 10 is default.
* @return Number of characters consumed.
*/
native StringToIntEx(const String:str[], &result, nBase=10);
/**
* Converts an integer to a string.
*
* @param num Integer to convert.
* @param str Buffer to store string in.
* @param maxlength Maximum length of string buffer.
* @return Number of cells written to buffer.
*/
native IntToString(num, String:str[], maxlength);
/**
* Converts a string to a floating point number.
*
* @param str String to convert to a foat.
* @return Floating point result, or 0.0 on error.
*/
native Float:StringToFloat(const String:str[]);
/**
* Converts a string to a floating point number with some more options.
*
* @param str String to convert to a foat.
* @param result Variable to store result in.
* @return Number of characters consumed.
*/
native StringToFloatEx(const String:str[], &Float:result);
/**
* Converts a floating point number to a string.
*
* @param num Floating point number to convert.
* @param str Buffer to store string in.
* @param maxlength Maximum length of string buffer.
* @return Number of cells written to buffer.
*/
native FloatToString(Float:num, String:str[], maxlength);
/**
* Finds the first "argument" in a string; either a set of space
* terminated characters, or a fully quoted string. After the
* argument is found, whitespace is read until the next portion
* of the string is reached. If nothing remains, -1 is returned.
* Otherwise, the index to the first character is returned.
*
* @param source Source input string.
* @param arg Stores argument read from string.
* @param argLen Maximum length of argument buffer.
* @return Index to next piece of string, or -1 if none.
*/
native BreakString(const String:source[], String:arg[], argLen);
/**
* Backwards compatibility stock - use BreakString
* @deprecated Renamed to BreakString.
*/
#pragma deprecated Use BreakString() instead
stock StrBreak(const String:source[], String:arg[], argLen)
{
return BreakString(source, arg, argLen);
}
/**
* Removes whitespace characters from the beginning and end of a string.
*
* @param str The string to trim.
* @return Number of bytes written (UTF-8 safe).
*/
native TrimString(String:str[]);
/**
* Returns text in a string up until a certain character sequence is reached.
*
* @param source Source input string.
* @param split A string which specifies a search point to break at.
* @param part Buffer to store string part.
* @param partLen Maximum length of the string part buffer.
* @return -1 if no match was found; otherwise, an index into source
* marking the first index after the searched text. The
* index is always relative to the start of the input string.
*/
native SplitString(const String:source[], const String:split[], String:part[], partLen);
/**
* Given a string, replaces all occurrences of a search string with a
* replacement string.
*
* @param text String to perform search and replacements on.
* @param maxlength Maximum length of the string buffer.
* @param search String to search for.
* @param replace String to replace the search string with.
* @return Number of replacements that were performed.
*/
native ReplaceString(String:text[], maxlength, const String:search[], const String:replace[]);
/**
* Given a string, replaces the first occurrence of a search string with a
* replacement string.
*
* @param text String to perform search and replacements on.
* @param maxlength Maximum length of the string buffer.
* @param search String to search for.
* @param replace String to replace the search string with.
* @param searchLen If higher than -1, its value will be used instead of
* a strlen() call on the search parameter.
* @param replaceLen If higher than -1, its value will be used instead of
* a strlen() call on the replace parameter.
* @return Index into the buffer (relative to the start) from where
* the last replacement ended, or -1 if no replacements were
* made.
*/
native ReplaceStringEx(String:text[], maxlength, const String:search[], const String:replace[], searchLen=-1, replaceLen=-1);
/**
* Returns the number of bytes a character is using. This is
* for multi-byte characters (UTF-8). For normal ASCII characters,
* this will return 1.
*
* @param source Source input string.
* @return Number of bytes the current character uses.
*/
native GetCharBytes(const String:source[]);
/**
* Returns whether a character is an ASCII alphabet character.
*
* @note Multi-byte characters will always return false.
*
* @param char Character to test.
* @return True if character is alphabetical, otherwise false.
*/
native bool:IsCharAlpha(chr);
/**
* Returns whether a character is numeric.
*
* @note Multi-byte characters will always return false.
*
* @param char Character to test.
* @return True if character is numeric, otherwise false.
*/
native bool:IsCharNumeric(chr);
/**
* Returns whether a character is whitespace.
*
* @note Multi-byte characters will always return false.
*
* @param char Character to test.
* @return True if character is whitespace, otherwise false.
*/
native bool:IsCharSpace(chr);
/**
* Returns if a character is multi-byte or not.
*
* @param char Character to test.
* @return 0 for a normal 7-bit ASCII character,
* otherwise number of bytes in multi-byte character.
*/
native IsCharMB(chr);
/**
* Returns whether an alphabetic character is uppercase.
*
* @note Multi-byte characters will always return false.
*
* @param char Character to test.
* @return True if character is uppercase, otherwise false.
*/
native bool:IsCharUpper(chr);
/**
* Returns whether an alphabetic character is lowercase.
*
* @note Multi-byte characters will always return false.
*
* @param char Character to test.
* @return True if character is lowercase, otherwise false.
*/
native bool:IsCharLower(chr);
/**
* Strips a quote pair off a string if it exists. That is, the following
* replace rule is applied once: $"(.*)"^ -> $\1^
*
* Note that the leading and trailing quotes will only be removed if both
* exist. Otherwise, the string is left unmodified. This function should
* be considered O(k) (all characters get shifted down).
*
* @param text String to modify (in place).
* @return True if string was modified, false if there was no
* set of quotes.
*/
native bool:StripQuotes(String:text[]);
/**
* Returns an uppercase character to a lowercase character.
*
* @param chr Characer to convert.
* @return Lowercase character on success,
* no change on failure.
*/
stock CharToUpper(chr)
{
if (IsCharLower(chr))
{
return (chr & ~(1<<5));
}
return chr;
}
/**
* Returns a lowercase character to an uppercase character.
*
* @param chr Characer to convert.
* @return Uppercase character on success,
* no change on failure.
*/
stock CharToLower(chr)
{
if (IsCharUpper(chr))
{
return (chr | (1<<5));
}
return chr;
}
/**
* Finds the first occurrence of a character in a string.
*
* @param str String.
* @param c Character to search for.
* @param reverse False (default) to search forward, true to search
* backward.
* @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)
{
new i, len
len = strlen(str);
if (!reverse)
{
for (i = 0; i < len; i++)
{
if (str[i] == c)
{
return i;
}
}
}
else
{
for (i = len - 1; i >= 0; i--)
{
if (str[i] == c)
{
return i;
}
}
}
return -1;
}
/**
* Concatenates one string onto another.
*
* @param buffer String to append to.
* @param maxlength Maximum length of entire buffer.
* @param source Source string to concatenate.
* @return Number of bytes written.
*/
stock StrCat(String:buffer[], maxlength, const String:source[])
{
new len = strlen(buffer);
if (len >= maxlength)
{
return 0;
}
return Format(buffer[len], maxlength-len, "%s", source);
}
/**
* Breaks a string into pieces and stores each piece into an array of buffers.
*
* @param text The string to split.
* @param split The string to use as a split delimiter.
* @param buffers An array of string buffers (2D array).
* @param maxStrings Number of string buffers (first dimension size).
* @param maxStringLength Maximum length of each string buffer.
* @return Number of strings retrieved.
*/
stock ExplodeString(const String:text[], const String:split[], String:buffers[][], maxStrings, maxStringLength)
{
new reloc_idx, idx, total;
if (maxStrings < 1 || split[0] == '\0')
{
return 0;
}
while ((idx = SplitString(text[reloc_idx], split, buffers[total], maxStringLength)) != -1)
{
reloc_idx += idx;
if (text[reloc_idx] == '\0')
{
break;
}
if (++total >= maxStrings)
{
return total;
}
}
if (text[reloc_idx] != '\0' && total <= maxStrings - 1)
{
strcopy(buffers[total++], maxStringLength, text[reloc_idx]);
}
return total;
}
/**
* Joins an array of strings into one string, with a "join" string inserted in
* between each given string. This function complements ExplodeString.
*
* @param strings An array of strings.
* @param numStrings Number of strings in the array.
* @param join The join string to insert between each string.
* @param buffer Output buffer to write the joined string to.
* @param maxLength Maximum length of the output buffer.
* @return Number of bytes written to the output buffer.
*/
stock ImplodeStrings(const String:strings[][], numStrings, const String:join[], String:buffer[], maxLength)
{
new total, length, part_length;
new join_length = strlen(join);
for (new i=0; i<numStrings; i++)
{
length = strcopy(buffer[total], maxLength-total, strings[i]);
total += length;
if (length < part_length)
{
break;
}
if (i != numStrings - 1)
{
length = strcopy(buffer[total], maxLength-total, join);
total += length;
if (length < join_length)
{
break;
}
}
}
return total;
}

203
src/include/textparse.inc Normal file
View File

@ -0,0 +1,203 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: textparse.inc 1336 2007-08-15 06:19:30Z damagedsoul $
*/
#if defined _textparse_included
#endinput
#endif
#define _textparse_included
/********************************
* Everything below describes the SMC Parse, or "SourceMod Configuration" format.
* This parser is entirely event based. You must hook events to receive data.
* The file format itself is nearly identical to Valve's KeyValues format.
********************************/
/**
* Parse result directive.
*/
enum SMCResult
{
SMCParse_Continue, /**< Continue parsing */
SMCParse_Halt, /**< Stop parsing here */
SMCParse_HaltFail /**< Stop parsing and return failure */
};
/**
* Parse error codes.
*/
enum SMCError
{
SMCError_Okay = 0, /**< No error */
SMCError_StreamOpen, /**< Stream failed to open */
SMCError_StreamError, /**< The stream died... somehow */
SMCError_Custom, /**< A custom handler threw an error */
SMCError_InvalidSection1, /**< A section was declared without quotes, and had extra tokens */
SMCError_InvalidSection2, /**< A section was declared without any header */
SMCError_InvalidSection3, /**< A section ending was declared with too many unknown tokens */
SMCError_InvalidSection4, /**< A section ending has no matching beginning */
SMCError_InvalidSection5, /**< A section beginning has no matching ending */
SMCError_InvalidTokens, /**< There were too many unidentifiable strings on one line */
SMCError_TokenOverflow, /**< The token buffer overflowed */
SMCError_InvalidProperty1, /**< A property was declared outside of any section */
};
/**
* 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();
/**
* Parses an SMC file.
*
* @param smc A Handle to an SMC Parse structure.
* @param file A string containing the file path.
* @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.
*/
native SMCError:SMC_ParseFile(Handle:smc, const String:file[], &line=0, &col=0);
/**
* Gets an error string for an SMCError code.
* @note SMCError_Okay returns false.
* @note SMCError_Custom (which is thrown on SMCParse_HaltFail) returns false.
*
* @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 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 SMC_ParseStart public(Handle:smc);
/**
* Sets the SMC_ParseStart function of a parse Handle.
*
* @param smc Handle to an SMC Parse.
* @param func SMC_ParseStart function.
* @noreturn
* @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 SMC_ParseEnd public(Handle:smc, bool:halted, bool:failed);
/**
* Sets the SMC_ParseEnd of a parse handle.
*
* @param smc Handle to an SMC Parse.
* @param func SMC_ParseEnd function.
* @noreturn
* @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 SMC_NewSection SMCResult:public(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 SMC_KeyValue SMCResult:public(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 SMC_EndSection SMCResult:public(Handle:smc);
/**
* Sets the three main reader functions.
*
* @param smc An SMC parse Handle.
* @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 SMC_RawLine SMCResult:public(Handle:smc, const String:line[], lineno);
/**
* 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);

121
src/include/tf2.inc Normal file
View File

@ -0,0 +1,121 @@
/**
* 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: tf2.inc 2215 2008-05-29 04:06:16Z dvander $
*/
#if defined _tf2_included
#endinput
#endif
#define _tf2_included
enum TFClassType
{
TFClass_Unknown = 0,
TFClass_Scout,
TFClass_Sniper,
TFClass_Soldier,
TFClass_DemoMan,
TFClass_Medic,
TFClass_Heavy,
TFClass_Pyro,
TFClass_Spy,
TFClass_Engineer
};
enum TFTeam
{
TFTeam_Unassigned = 0,
TFTeam_Spectator = 1,
TFTeam_Red = 2,
TFTeam_Blue = 3
};
/**
* Respawns a client
*
* @param client Player's index.
* @noreturn
* @error Invalid client index, client not in game, or no mod support.
*/
native TF2_RespawnPlayer(client);
/**
* Disguises a client to the given model and team. Only has an effect on spies.
*
* Note: This only starts the disguise process and a delay occurs before the spy is fully disguised
*
* @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
* @noreturn
* @error Invalid client index, client not in game, or no mod support.
*/
native TF2_DisguisePlayer(client, TFTeam:team, TFClassType:class);
/**
* Removes the current disguise from a client. Only has an effect on spies.
*
* @param client Player's index.
* @noreturn
* @error Invalid client index, client not in game, or no mod support.
*/
native TF2_RemovePlayerDisguise(client);
/**
* Retrieves the entity index of the CPlayerResource entity
*
* @return The current resource entity index.
*/
native TF2_GetResourceEntity();
/**
* Finds the TFClassType for a given class name.
*
* @param classname A classname string such as "sniper" or "demoman"
* @return A TFClassType constant.
*/
native TFClassType:TF2_GetClass(const String:classname[]);
/**
* Do not edit below this line!
*/
public Extension:__ext_tf2 =
{
name = "TF2 Tools",
file = "game.tf2.ext",
autoload = 1,
#if defined REQUIRE_EXTENSIONS
required = 1,
#else
required = 0,
#endif
};

219
src/include/tf2_stocks.inc Normal file
View File

@ -0,0 +1,219 @@
/**
* 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: tf2_stocks.inc 2236 2008-05-31 22:30:57Z damagedsoul $
*/
#if defined _tf2_stocks_included
#endinput
#endif
#define _tf2_stocks_included
#include <tf2>
#include <sdktools>
enum TFResourceType
{
TFResource_Ping,
TFResource_Score,
TFResource_Deaths,
TFResource_TotalScore,
TFResource_Captures,
TFResource_Defenses,
TFResource_Dominations,
TFResource_Revenge,
TFResource_BuildingsDestroyed,
TFResource_Headshots,
TFResource_Backstabs,
TFResource_HealPoints,
TFResource_Invulns,
TFResource_Teleports,
TFResource_ResupplyPoints,
TFResource_KillAssists,
TFResource_MaxHealth,
TFResource_PlayerClass
};
static const String:TFResourceNames[TFResourceType][] =
{
"m_iPing",
"m_iScore",
"m_iDeaths",
"m_iTotalScore",
"m_iCaptures",
"m_iDefenses",
"m_iDominations",
"m_iRevenge",
"m_iBuildingsDestroyed",
"m_iHeadshots",
"m_iBackstabs",
"m_iHealPoints",
"m_iInvulns",
"m_iTeleports",
"m_iResupplyPoints",
"m_iKillAssists",
"m_iMaxHealth",
"m_iPlayerClass"
};
/**
* Get's a Clients current class.
*
* @param client Player's index.
* @param class TFClassType to change to.
* @noreturn
* @error Invalid client index.
*/
stock TFClassType:TF2_GetPlayerClass(client)
{
return TFClassType:GetEntProp(client, Prop_Send, "m_iClass");
}
/**
* Set's a Clients 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 persistant If true changes the players desired class so the change stays after death.
* @noreturn
* @error Invalid client index.
*/
stock TF2_SetPlayerClass(client, TFClassType:class, bool:weapons=true, bool:persistant=true)
{
SetEntProp(client, Prop_Send, "m_iClass", _:class);
if (persistant)
{
SetEntProp(client, Prop_Send, "m_iDesiredPlayerClass", _:class);
}
}
/**
* Retrieves client data from the resource entity
*
* @param client Player's index.
* @param type ResourceType constant
* @return Value or -1 on failure.
* @error Invalid client index, client not in game or failed to find resource entity.
*/
stock TF2_GetPlayerResourceData(client, TFResourceType:type)
{
if (!IsClientConnected(client))
{
return -1;
}
new offset = FindSendPropInfo("CTFPlayerResource", TFResourceNames[type]);
if (offset < 1)
{
return -1;
}
new entity = TF2_GetResourceEntity();
if (entity == -1)
{
return -1;
}
return GetEntData(entity, offset + (client*4));
}
/**
* Sets client data in the resource entity
*
* Note: The game overwrites these values every frame, so changing them will have very little effect.
*
* @param client Player's index.
* @param type ResourceType constant
* @param value Value to set.
* @return Value or -1 on failure.
* @error Invalid client index, client not in game or failed to find resource entity.
*/
stock bool:TF2_SetPlayerResourceData(client, TFResourceType:type, any:value)
{
if (!IsClientConnected(client))
{
return false;
}
new offset = FindSendPropInfo("CTFPlayerResource", TFResourceNames[type]);
if (offset < 1)
{
return false;
}
new entity = TF2_GetResourceEntity();
if (entity == -1)
{
return false;
}
SetEntData(entity, offset + (client*4), value);
return true;
}
/**
* Removes all weapons from a client's weapon slot
*
* @param client Player's index.
* @param slot Slot index (0-5)
* @noreturn
* @error Invalid client, invalid slot or lack of mod support
*/
stock TF2_RemoveWeaponSlot(client, slot)
{
new weaponIndex;
while ((weaponIndex = GetPlayerWeaponSlot(client, slot)) != -1)
{
RemovePlayerItem(client, weaponIndex);
RemoveEdict(weaponIndex);
}
}
/**
* Removes all weapons from a client
*
* @param client Player's index.
* @noreturn
*/
stock TF2_RemoveAllWeapons(client)
{
for (new i = 0; i <= 5; i++)
{
TF2_RemoveWeaponSlot(client, i);
}
}

208
src/include/timers.inc Normal file
View File

@ -0,0 +1,208 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: timers.inc 2213 2008-05-29 03:59:00Z dvander $
*/
#if defined _timers_included
#endinput
#endif
#define _timers_included
#include <datapack>
#define TIMER_REPEAT (1<<0) /**< Timer will repeat until it returns Plugin_Stop */
#define TIMER_FLAG_NO_MAPCHANGE (1<<1) /**< Timer will not carry over mapchanges */
#define TIMER_HNDL_CLOSE (1<<9) /**< Timer will automatically call CloseHandle() on its value when finished */
/**
* Any of the following prototypes will work for a timed function.
*/
funcenum Timer
{
/**
* Called when the timer interval has elapsed.
*
* @param timer Handle to the timer object.
* @param hndl Handle passed when the timer was created.
* @return Plugin_Stop to stop a repeating timer, any other value for
* default behavior.
*/
Action:public(Handle:timer, Handle:hndl),
/**
* Called when the timer interval has elapsed.
*
* @param timer Handle to the timer object.
* @param value Value passed when the timer was created.
* @return Plugin_Stop to stop a repeating timer, any other value for
* default behavior.
*/
Action:public(Handle:timer, any:value),
/**
* Called when the timer interval has elapsed.
*
* @param timer Handle to the timer object.
* @return Plugin_Stop to stop a repeating timer, any other value for
* default behavior.
*/
Action:public(Handle:timer),
};
/**
* Creates a basic timer. Calling CloseHandle() on a timer will end the timer.
*
* @param interval Interval from the current game time to execute the given function.
* @param func Function to execute once the given interval has elapsed.
* @param value Handle or value to give to the timer function.
* @param flags Flags to set (such as repeatability or auto-Handle closing).
* @return Handle to the timer object. You do not need to call CloseHandle().
* If the timer could not be created, INVALID_HANDLE will be returned.
*/
native Handle:CreateTimer(Float:interval, Timer:func, any:value=INVALID_HANDLE, flags=0);
/**
* Kills a timer. Use this instead of CloseHandle() if you need more options.
*
* @param autoClose If autoClose is true, the timer's value will be
* closed as a handle if TIMER_HNDL_CLOSE was not specified.
* @noreturn
*/
native KillTimer(Handle:timer, bool:autoClose=false);
/**
* Manually triggers a timer so its function will be called.
*
* @param timer Timer Handle to trigger.
* @param reset If reset is true, the elapsed time counter is reset
* so the full interval must pass again.
* @noreturn
*/
native TriggerTimer(Handle:timer, bool:reset=false);
/**
* Returns the simulated game time.
*
* This time is internally maintained by SourceMod and is based on the game
* tick count and tick rate. Unlike GetGameTime(), it will increment past
* map changes and while no players are connected. Unlike GetEngineTime(),
* it will not increment based on the system clock (i.e. it is still bound
* to the ticking process).
*
* @return Time based on the game tick count.
*/
native Float:GetTickedTime();
/**
* Returns an estimate of the time left before the map ends. If the server
* has not processed any frames yet (i.e. no players have joined the map yet),
* then the time left returned will always be infinite.
*
* @param timeleft Variable to store the time, in seconds. If the
* value is less than 0, the time limit is infinite.
* @return True if the operation is supported, false otherwise.
*/
native bool:GetMapTimeLeft(&timeleft);
/**
* Retrieves the current map time limit. If the server has not processed any
* frames yet (i.e. no players have joined the map yet), then the time limit
* returned will always be 0.
*
* @param time Set to the number of total seconds in the map time
* limit, or 0 if there is no time limit set.
* @return True on success, false if operation is not supported.
*/
native bool:GetMapTimeLimit(&time);
/**
* Extends the map time limit in a way that will notify all plugins.
*
* @param time Number of seconds to extend map time limit by.
* The number can be negative to decrease the time limit.
* If 0, the map will be set to have no time limit.
* @return True on success, false if operation is not supported.
*/
native bool:ExtendMapTimeLimit(time);
/**
* Returns the number of seconds in between game server ticks.
*
* Note: A tick, in this context, is a frame.
*
* @return Number of seconds in between ticks.
*/
native Float:GetTickInterval();
/**
* Notification that the map's time left has changed via a change in the time
* limit or a change in the game rules (such as mp_restartgame). This is useful
* for plugins trying to create timers based on the time left in the map.
*
* Calling ExtendMapTimeLimit() from here, without proper precaution, will
* cause infinite recursion.
*
* If the operation is not supported, this will never be called.
* If the server has not yet processed any frames (i.e. no players have joined
* the map yet), then this will be called once the server begins ticking, even
* if there is no time limit set.
*/
forward OnMapTimeLeftChanged();
/**
* Returns whether or not the server is processing frames or not.
*
* The server does not process frames until at least one client joins the game.
* Once the first player has in, even if that player, leaves, the server's
* timers and entities will work.
*
* @return True if the server is ticking, false otherwise.
*/
native bool:IsServerProcessing();
/**
* Creates a timer associated with a new data pack, and returns the datapack.
* @note The datapack is automatically freed when the timer ends.
* @note The position of the datapack is not reset or changed for the timer function.
*
* @param interval Interval from the current game time to execute the given function.
* @param func Function to execute once the given interval has elapsed.
* @param data The newly created datapack is passed though this by-reference parameter.
* @param flags Timer flags.
* @return Handle to the timer object. You do not need to call CloseHandle().
*/
stock Handle:CreateDataTimer(Float:interval, Timer:func, &Handle:data, flags=0)
{
data = CreateDataPack();
flags |= TIMER_HNDL_CLOSE;
return CreateTimer(interval, func, data, flags);
}

290
src/include/topmenus.inc Normal file
View File

@ -0,0 +1,290 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: topmenus.inc 2086 2008-04-19 10:34:56Z pred $
*/
#if defined _topmenus_included
#endinput
#endif
#define _topmenus_included
#include <menus>
/**
* Actions a top menu will take on an object.
*/
enum TopMenuAction
{
/**
* An option is being drawn for a menu (or for sorting purposes).
*
* INPUT : TopMenu Handle, object 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.
*
* 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.
* OUTPUT: Buffer for rendering, maxlength of buffer.
*/
TopMenuAction_DisplayTitle = 1,
/**
* A menu option has been selected.
*
* The Object ID will always be an item (not a category).
*
* INPUT : TopMenu Handle, object 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.
* OUTPUT: The first byte of the 'buffer' string should be set
* to the desired flags. By default, it will contain
* ITEMDRAW_DEFAULT.
*/
TopMenuAction_DrawOption = 3,
/**
* Called when an object is being removed from the menu.
* This can be used to clean up data stored in the info string.
*
* INPUT : TopMenu Handle, object ID.
*/
TopMenuAction_RemoveObject = 4,
};
/**
* Top menu object types.
*/
enum TopMenuObjectType
{
TopMenuObject_Category = 0, /**< Category (sub-menu branching from root) */
TopMenuObject_Item = 1 /**< Item on a sub-menu */
};
/**
* Top menu starting positions for display.
*/
enum TopMenuPosition
{
TopMenuPosition_Start = 0, /**< Start/root of the menu */
TopMenuPosition_LastRoot = 1, /**< Last position in the root menu */
TopMenuPosition_LastCategory = 3, /**< Last position in their last category */
};
/**
* Top menu object tag for type checking.
*/
enum TopMenuObject
{
INVALID_TOPMENUOBJECT = 0,
};
/**
* TopMenu callback prototype.
*
* @param topmenu Handle to the TopMenu.
* @param action TopMenuAction being performed.
* @param object_id The object ID (if used).
* @param param Extra parameter (if used).
* @param buffer Output buffer (if used).
* @param maxlength Output buffer (if used).
* @noreturn
*/
functag TopMenuHandler public(Handle:topmenu,
TopMenuAction:action,
TopMenuObject:object_id,
param,
String:buffer[],
maxlength);
/**
* Creates a 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);
/**
* 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.
* @error Invalid TopMenu Handle.
*/
native bool:LoadTopMenuConfig(Handle:topmenu, const String:file[], String:error[], maxlength);
/**
* Adds an object to a TopMenu.
*
* @param topmenu TopMenu Handle.
* @param name Object name (MUST be unique).
* @param type Object type.
* @param handler Handler for object.
* @param cmdname Command name (for access overrides).
* @param flags Default access flags.
* @param parent Parent object ID, or INVALID_TOPMENUOBJECT for none.
* Items must have a category parent.
* Categories must not have a parent.
* @param info_string Arbitrary storage (max 255 bytes).
* @return A new TopMenuObject ID, or INVALID_TOPMENUOBJECT on
* 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[]="");
/**
* Retrieves the info string of a top menu item.
*
* @param topmenu TopMenu Handle.
* @param object 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 GetTopMenuInfoString(Handle:topmenu, TopMenuObject:parent, String:buffer[], maxlength);
/**
* Retrieves the name string of a top menu item.
*
* @param topmenu TopMenu Handle.
* @param object 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);
/**
* Removes an object from a TopMenu.
*
* Plugins' objects 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.
* @noreturn
* @error Invalid TopMenu Handle.
*/
native RemoveFromTopMenu(Handle:topmenu, TopMenuObject:object);
/**
* Displays a TopMenu to a client.
*
* @param topmenu TopMenu Handle.
* @param client Client index.
* @param position Position to display from.
* @return True on success, false on failure.
* @error Invalid TopMenu Handle or client not in game.
*/
native bool:DisplayTopMenu(Handle:topmenu, client, TopMenuPosition:position);
/**
* Finds a category's object ID in a TopMenu.
*
* @param topmenu TopMenu Handle.
* @param name Object's unique name.
* @return TopMenuObject ID on success, or
* INVALID_TOPMENUOBJECT on failure.
* @error Invalid TopMenu Handle.
*/
native TopMenuObject:FindTopMenuCategory(Handle:topmenu, const String:name[]);
/**
* Do not edit below this line!
*/
public Extension:__ext_topmenus =
{
name = "TopMenus",
file = "topmenus.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_topmenus_SetNTVOptional()
{
MarkNativeAsOptional("CreateTopMenu");
MarkNativeAsOptional("LoadTopMenuConfig");
MarkNativeAsOptional("AddToTopMenu");
MarkNativeAsOptional("RemoveFromTopMenu");
MarkNativeAsOptional("DisplayTopMenu");
MarkNativeAsOptional("FindTopMenuCategory");
}
#endif

View File

@ -0,0 +1,200 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: usermessages.inc 1943 2008-03-16 23:16:34Z dvander $
*/
#if defined _eventsmsgs_included
#endinput
#endif
#define _eventsmsgs_included
/**
* UserMsg helper values.
*/
enum UserMsg
{
INVALID_MESSAGE_ID = -1,
};
/**
* @section Message Flags.
*/
#define USERMSG_RELIABLE (1<<2) /**< Message will be set on the reliable stream */
#define USERMSG_INITMSG (1<<3) /**< Message will be considered to be an initmsg */
#define USERMSG_BLOCKHOOKS (1<<7) /**< Prevents the message from triggering SourceMod and Metamod hooks */
/**
* @endsection
*/
/**
* Returns the ID of a given message, or -1 on failure.
*
* @param msg String containing message name (case sensitive).
* @return A message index, or INVALID_MESSAGE_ID on failure.
*/
native UserMsg:GetUserMessageId(const String:msg[]);
/**
* Retrieves the name of a message by ID.
*
* @param msg_id Message index.
* @param msg Buffer to store the name of the message.
* @param maxlength Maximum length of string buffer.
* @return True if message index is valid, false otherwise.
*/
native bool:GetUserMessageName(UserMsg:msg_id, String:msg[], maxlength);
/**
* Starts a usermessage (network message).
* @note Only one message can be active at a time.
* @note It is illegal to send any message while a non-intercept hook is in progress.
*
* @param msgname Message name to start.
* @param clients Array containing player indexes to broadcast to.
* @param numClients Number of players in the array.
* @param flags Optional flags to set.
* @return A handle to a bf_write bit packing structure, or
* INVALID_HANDLE on failure.
* @error Invalid message name or unable to start a message.
*/
native Handle:StartMessage(String:msgname[], clients[], numClients, flags=0);
/**
* Starts a usermessage (network message).
* @note Only one message can be active at a time.
* @note It is illegal to send any message while a non-intercept hook is in progress.
*
* @param msg Message index to start.
* @param clients Array containing player indexes to broadcast to.
* @param numClients Number of players in the array.
* @param flags Optional flags to set.
* @return A handle to a bf_write bit packing structure, or
* INVALID_HANDLE on failure.
* @error Invalid message name or unable to start a message.
*/
native Handle:StartMessageEx(UserMsg:msg, clients[], numClients, flags=0);
/**
* Ends a previously started user message (network message).
*
* @noreturn
*/
native EndMessage();
/**
* Called when a message is hooked
*
* @param msg_id Message index.
* @param bf Handle to the input bit buffer of the message.
* @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 MsgHook Action:public(UserMsg:msg_id, Handle:bf, const players[], playersNum, bool:reliable, bool:init);
/**
* Called when a message is finished sending.
*
* @param msg_id Message index.
*/
functag MsgSentNotify public(UserMsg:msg_id);
/**
* Hooks a user message.
*
* @param msg_id Message index.
* @param hook Function to use as a hook.
* @param intercept If intercept is true, message will be fully intercepted,
* allowing the user to block the message. Otherwise,
* the hook is normal and ignores the return value.
* @param notify Notification function.
* @noreturn
* @error Invalid message index.
*/
native HookUserMessage(UserMsg:msg_id, MsgHook:hook, bool:intercept=false, MsgSentNotify:notify=MsgSentNotify:-1);
/**
* Removes one usermessage hook.
*
* @param msg_id Message index.
* @param hook Function used for the hook.
* @param intercept Specifies whether the hook was an intercept hook or not.
* @noreturn
* @error Invalid message index.
*/
native UnhookUserMessage(UserMsg:msg_id, MsgHook:hook, bool:intercept=false);
/**
* Starts a usermessage (network message) that broadcasts to all clients.
* @note See StartMessage or StartMessageEx().
*
* @param msgname Message name to start.
* @param flags Optional flags to set.
* @return A handle to a bf_write bit packing structure, or
* INVALID_HANDLE on failure.
*/
stock Handle:StartMessageAll(String:msgname[], flags=0)
{
new maxClients = GetMaxClients();
new total = 0;
new clients[maxClients];
for (new i=1; i<=maxClients; i++)
{
if (IsClientConnected(i))
{
clients[total++] = i;
}
}
return StartMessage(msgname, clients, total, flags);
}
/**
* Starts a simpler usermessage (network message) for one client.
* @note See StartMessage or StartMessageEx().
*
* @param msgname Message name to start.
* @param client Client to send to.
* @param flags Optional flags to set.
* @return A handle to a bf_write bit packing structure, or
* INVALID_HANDLE on failure.
*/
stock Handle:StartMessageOne(String:msgname[], client, flags=0)
{
new players[1];
players[0] = client;
return StartMessage(msgname, players, 1, flags);
}

188
src/include/vector.inc Normal file
View File

@ -0,0 +1,188 @@
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2007 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: vector.inc 1336 2007-08-15 06:19:30Z damagedsoul $
*/
#if defined _vector_included
#endinput
#endif
#define _vector_included
/**
* Calculates a vector's length.
*
* @param vec Vector.
* @param squared If true, the result will be squared (for optimization).
* @return Vector length (magnitude).
*/
native Float:GetVectorLength(const Float:vec[3], bool:squared=false);
/**
* Calculates the distance between two vectors.
*
* @param vec1 First vector.
* @param vec2 Second vector.
* @param squared If true, the result will be squared (for optimization).
* @return Vector distance.
*/
native Float:GetVectorDistance(const Float:vec1[3], const Float:vec2[3], bool:squared=false);
/**
* Calculates the dot product of two vectors.
*
* @param vec1 First vector.
* @param vec2 Second vector.
* @return Dot product of the two vectors.
*/
native Float:GetVectorDotProduct(const Float:vec1[3], const Float:vec2[3]);
/**
* Computes the cross product of two vectors. Any input array can be the same
* as the output array.
*
* @param vec1 First vector.
* @param vec2 Second vector.
* @param result Resultant vector.
* @noreturn
*/
native GetVectorCrossProduct(const Float:vec1[3], const Float:vec2[3], Float:result[3]);
/**
* Normalizes a vector. The input array can be the same as the output array.
*
* @param vec Vector.
* @param result Resultant vector.
* @return Vector length.
*/
native Float:NormalizeVector(const Float:vec[3], Float:result[3]);
/**
* Returns vectors in the direction of an angle.
*
* @param angle Angle.
* @param fwd Forward vector buffer or NULL_VECTOR.
* @param right Right vector buffer or NULL_VECTOR.
* @param up Up vector buffer or NULL_VECTOR.
* @noreturn
*/
native GetAngleVectors(const Float:angle[3], Float:fwd[3], Float:right[3], Float:up[3]);
/**
* Returns angles from a vector.
*
* @param vec Vector.
* @param angle Angle buffer.
* @noreturn
*/
native GetVectorAngles(const Float:vec[3], Float:angle[3]);
/**
* Returns direction vectors from a vector.
*
* @param vec Vector.
* @param right Right vector buffer or NULL_VECTOR.
* @param up Up vector buffer or NULL_VECTOR.
* @noreturn
*/
native GetVectorVectors(const Float:vec[3], Float:right[3], Float:up[3]);
/**
* Adds two vectors. It is safe to use either input buffer as an output
* buffer.
*
* @param vec1 First vector.
* @param vec2 Second vector.
* @param result Result buffer.
* @noreturn
*/
stock AddVectors(const Float:vec1[3], const Float:vec2[3], Float:result[3])
{
result[0] = vec1[0] + vec2[0];
result[1] = vec1[1] + vec2[1];
result[2] = vec1[2] + vec2[2];
}
/**
* Subtracts a vector from another vector. It is safe to use either input
* buffer as an output buffer.
*
* @param vec1 First vector.
* @param vec2 Second vector to subtract from first.
* @param result Result buffer.
* @noreturn
*/
stock SubtractVectors(const Float:vec1[3], const Float:vec2[3], Float:result[3])
{
result[0] = vec1[0] - vec2[0];
result[1] = vec1[1] - vec2[1];
result[2] = vec1[2] - vec2[2];
}
/**
* Scales a vector.
*
* @param vec Vector.
* @param scale Scale value.
* @noreturn
*/
stock ScaleVector(Float:vec[3], Float:scale)
{
vec[0] *= scale;
vec[1] *= scale;
vec[2] *= scale;
}
/**
* Negatives a vector.
*
* @param vec Vector.
* @noreturn
*/
stock NegateVector(Float:vec[3])
{
vec[0] = -vec[0];
vec[1] = -vec[1];
vec[2] = -vec[2];
}
/**
* Builds a vector from two points by subtracting the points.
*
* @param pt1 First point (to be subtracted from the second).
* @param pt2 Second point.
* @param output Output vector buffer.
* @noreturn
*/
stock MakeVectorFromPoints(const Float:pt1[3], const Float:pt2[3], Float:output[3])
{
output[0] = pt2[0] - pt1[0];
output[1] = pt2[1] - pt1[1];
output[2] = pt2[2] - pt1[2];
}

42
src/include/version.inc Normal file
View File

@ -0,0 +1,42 @@
/**
* 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 <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id: version.inc 2534 2008-09-14 05:13:21Z dvander $
*/
#if defined _version_included
#endinput
#endif
#define _version_included
#define SOURCEMOD_V_MAJOR 1 /**< SourceMod Major version */
#define SOURCEMOD_V_MINOR 0 /**< SourceMod Minor version */
#define SOURCEMOD_V_RELEASE 4 /**< SourceMod Release version */
#define SOURCEMOD_VERSION "1.0.4" /**< SourceMod version string (major.minor.release.build) */

42
src/include/zr.inc Normal file
View File

@ -0,0 +1,42 @@
/**
* ====================
* Zombie:Reloaded
* File: zr.inc
* Author: Greyscale
* ====================
*/
/**
* Used to check if a player is a zombie.
* @param client Client index.
* @return True if the player is a zombie, and false if human.
*/
native bool:ZR_IsClientZombie(client);
/**
* Returns the client's zombie class.
* @param client Client index.
* @return The client's zombie class.
*/
native ZR_GetClientZClass(client);
/**
* Returns if the zombie has spawned or not.
* @return Returns true, if the first zombie has spawned during the round, false if not.
*/
native bool:ZR_HasZombieSpawned();
/**
* Called when a player turns into a zombie.
* @param client Client index.
* @param mother True if zombie is a mother, false if zombified by another zombie.
*/
forward ZR_Zombify(client, bool:mother);
/**
* Called when a player changes their zombie class.
* @param client Client index.
* @param oldclass The client's old class.
* @param newclass The client's new class.
*/
forward ZR_OnZClassChanged(client, oldclass, newclass);

209
src/zombiereloaded.sp Normal file
View File

@ -0,0 +1,209 @@
/**
* ====================
* Zombie:Reloaded
* File: zombiereloaded.sp
* Author: Greyscale
* ====================
*/
#pragma semicolon 1
#include <sourcemod>
#include <sdktools>
#include <cstrike>
#include <hacks>
#undef REQUIRE_PLUGIN
#include <market>
#define VERSION "2.5.1"
#include "zr/zombiereloaded"
#include "zr/global"
#include "zr/cvars"
#include "zr/translation"
#include "zr/offsets"
#include "zr/ambience"
#include "zr/classes"
#include "zr/models"
#include "zr/overlays"
#include "zr/zombie"
#include "zr/menu"
#include "zr/sayhooks"
#include "zr/weaponrestrict"
#include "zr/damagecontrol"
#include "zr/commands"
#include "zr/event"
public Plugin:myinfo =
{
name = "Zombie:Reloaded",
author = "Greyscale",
description = "Infection/survival style gameplay",
version = VERSION,
url = ""
};
public bool:AskPluginLoad(Handle:myself, bool:late, String:error[], err_max)
{
CreateGlobals();
return true;
}
public OnPluginStart()
{
LoadTranslations("common.phrases.txt");
LoadTranslations("zombiereloaded.phrases.txt");
// ======================================================================
ZR_PrintToServer("Plugin loading");
// ======================================================================
HookEvents();
HookChatCmds();
CreateCvars();
HookCvars();
CreateCommands();
HookCommands();
FindOffsets();
SetupGameData();
InitWeaponRestrict();
InitDmgControl();
// ======================================================================
market = LibraryExists("market");
// ======================================================================
CreateConVar("gs_zombiereloaded_version", VERSION, "[ZR] Current version of this plugin", FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_UNLOGGED|FCVAR_DONTRECORD|FCVAR_REPLICATED|FCVAR_NOTIFY);
// ======================================================================
ZR_PrintToServer("Plugin loaded");
}
public OnPluginEnd()
{
ZREnd();
}
public OnLibraryRemoved(const String:name[])
{
if (StrEqual(name, "market"))
{
market = false;
}
}
public OnLibraryAdded(const String:name[])
{
if (StrEqual(name, "market"))
{
market = true;
}
}
public OnMapStart()
{
MapChangeCleanup();
LoadModelData();
LoadDownloadData();
}
public OnConfigsExecuted()
{
FindMapSky();
LoadClassData();
LoadAmbienceData();
decl String:mapconfig[PLATFORM_MAX_PATH];
GetCurrentMap(mapconfig, sizeof(mapconfig));
Format(mapconfig, sizeof(mapconfig), "sourcemod/zombiereloaded/%s.cfg", mapconfig);
decl String:path[PLATFORM_MAX_PATH];
Format(path, sizeof(path), "cfg/%s", mapconfig);
if (FileExists(path))
{
ServerCommand("exec %s", mapconfig);
}
}
public OnClientPutInServer(client)
{
pClass[client] = 0;
gBlockMotherInfect[client] = false;
bZVision[client] = !IsFakeClient(client);
new bool:zhp = GetConVarBool(gCvars[CVAR_ZHP_DEFAULT]);
dispHP[client] = zhp;
ClientHookUse(client);
ClientHookAttack(client);
FindClientDXLevel(client);
for (new x = 0; x < MAXTIMERS; x++)
{
tHandles[client][x] = INVALID_HANDLE;
}
}
public OnClientDisconnect(client)
{
ClientUnHookUse(client);
ClientUnHookAttack(client);
PlayerLeft(client);
for (new x = 0; x < MAXTIMERS; x++)
{
if (tHandles[client][x] != INVALID_HANDLE)
{
CloseHandle(tHandles[client][x]);
tHandles[client][x] = INVALID_HANDLE;
}
}
}
MapChangeCleanup()
{
ClearArray(restrictedWeapons);
tRound = INVALID_HANDLE;
tInfect = INVALID_HANDLE;
tAmbience = INVALID_HANDLE;
}
ZREnd()
{
TerminateRound(3.0, Game_Commencing);
UnhookCvars();
UnhookEvents();
new maxplayers = GetMaxClients();
for (new x = 1; x <= maxplayers; x++)
{
if (!IsClientInGame(x))
{
continue;
}
for (new y = 0; y < MAXTIMERS; y++)
{
if (tHandles[x][y] != INVALID_HANDLE)
{
CloseHandle(tHandles[x][y]);
tHandles[x][y] = INVALID_HANDLE;
}
}
}
}

97
src/zr/ambience.inc Normal file
View File

@ -0,0 +1,97 @@
/**
* ====================
* Zombie:Reloaded
* File: ambience.inc
* Author: Greyscale
* ====================
*/
new bool:soundValid = false;
new Handle:tAmbience = INVALID_HANDLE;
LoadAmbienceData()
{
new bool:ambience = GetConVarBool(gCvars[CVAR_AMBIENCE]);
if (!ambience)
{
return;
}
decl String:sound[64];
GetConVarString(gCvars[CVAR_AMBIENCE_FILE], sound, sizeof(sound));
Format(sound, sizeof(sound), "sound/%s", sound);
soundValid = FileExists(sound, true);
if (soundValid)
{
AddFileToDownloadsTable(sound);
}
else
{
ZR_LogMessage("Ambient sound load failed", sound);
}
}
RestartAmbience()
{
if (tAmbience != INVALID_HANDLE)
{
CloseHandle(tAmbience);
}
CreateTimer(0.0, AmbienceLoop, _, TIMER_FLAG_NO_MAPCHANGE);
}
public Action:AmbienceLoop(Handle:timer)
{
new bool:ambience = GetConVarBool(gCvars[CVAR_AMBIENCE]);
if (!ambience || !soundValid)
{
return;
}
decl String:sound[64];
GetConVarString(gCvars[CVAR_AMBIENCE_FILE], sound, sizeof(sound));
EmitAmbience(sound);
new Float:delay = GetConVarFloat(gCvars[CVAR_AMBIENCE_LENGTH]);
tAmbience = CreateTimer(delay, AmbienceLoop, _, TIMER_FLAG_NO_MAPCHANGE);
}
StopAmbience()
{
new bool:ambience = GetConVarBool(gCvars[CVAR_AMBIENCE]);
if (!ambience)
{
return;
}
decl String:sound[64];
GetConVarString(gCvars[CVAR_AMBIENCE_FILE], sound, sizeof(sound));
new maxplayers = GetMaxClients();
for (new x = 1; x <= maxplayers; x++)
{
if (!IsClientInGame(x))
{
continue;
}
StopSound(x, SNDCHAN_AUTO, sound);
}
}
EmitAmbience(const String:sound[])
{
PrecacheSound(sound);
StopAmbience();
new Float:volume = GetConVarFloat(gCvars[CVAR_AMBIENCE_VOLUME]);
EmitSoundToAll(sound, SOUND_FROM_PLAYER, SNDCHAN_AUTO, SNDLEVEL_NORMAL, SND_NOFLAGS, volume, SNDPITCH_NORMAL, -1, NULL_VECTOR, NULL_VECTOR, true, 0.0);
}

295
src/zr/classes.inc Normal file
View File

@ -0,0 +1,295 @@
/**
* ====================
* Zombie:Reloaded
* File: classes.inc
* Author: Greyscale
* ====================
*/
enum ZR_ClassOptions
{
String:data_name[64],
String:data_model[256],
String:data_menu_description[256],
String:data_zvision[256],
data_health,
Float:data_speed,
Float:data_jump_distance,
Float:data_jump_height,
Float:data_knockback,
bool:data_nvgs[8],
data_fov,
bool:data_regen,
data_regen_health,
Float:data_regen_interval,
bool:data_napalm,
Float:data_napalm_time,
bool:data_nofalldamage,
data_kill_bonus,
data_infect_health
}
#define MAXCLASSES 20
new Handle:kvClasses = INVALID_HANDLE;
new arrayClasses[MAXCLASSES][ZR_ClassOptions];
new classCount;
LoadClassData()
{
if (kvClasses != INVALID_HANDLE)
{
CloseHandle(kvClasses);
}
kvClasses = CreateKeyValues("classes");
decl String:path[PLATFORM_MAX_PATH];
BuildPath(Path_SM, path, sizeof(path), "configs/zr/classes.txt");
if (!FileToKeyValues(kvClasses, path))
{
SetFailState("\"%s\" missing from server", path);
}
KvRewind(kvClasses);
if (!KvGotoFirstSubKey(kvClasses))
{
new bool:classes = GetConVarBool(gCvars[CVAR_CLASSES]);
if (classes)
{
SetConVarBool(gCvars[CVAR_CLASSES], false);
ZR_LogMessage("Class auto-disable", path);
}
}
decl String:name[64];
decl String:model[256];
decl String:menu_description[256];
decl String:zvision[256];
classCount = 0;
do
{
KvGetString(kvClasses, "name", name, sizeof(name));
strcopy(arrayClasses[classCount][data_name], 64, name);
KvGetString(kvClasses, "model", model, sizeof(model));
strcopy(arrayClasses[classCount][data_model], 256, model);
KvGetString(kvClasses, "menu_description", menu_description, sizeof(menu_description));
strcopy(arrayClasses[classCount][data_menu_description], 256, menu_description);
decl String:cvar_zvision[256];
GetConVarString(gCvars[CVAR_ZOMBIE_ZVISION], cvar_zvision, sizeof(cvar_zvision));
KvGetString(kvClasses, "zvision", zvision, sizeof(zvision), cvar_zvision);
strcopy(arrayClasses[classCount][data_zvision], 256, zvision);
arrayClasses[classCount][data_health] = KvGetNum(kvClasses, "health"), GetConVarInt(gCvars[CVAR_ZOMBIE_HEALTH]);
arrayClasses[classCount][data_speed] = KvGetFloat(kvClasses, "speed"), GetConVarFloat(gCvars[CVAR_ZOMBIE_SPEED]);
arrayClasses[classCount][data_jump_distance] = KvGetFloat(kvClasses, "jump_distance"), GetConVarFloat(gCvars[CVAR_ZOMBIE_JUMP_DISTANCE]);
arrayClasses[classCount][data_jump_height] = KvGetFloat(kvClasses, "jump_height"), GetConVarFloat(gCvars[CVAR_ZOMBIE_JUMP_HEIGHT]);
arrayClasses[classCount][data_knockback] = KvGetFloat(kvClasses, "knockback"), GetConVarFloat(gCvars[CVAR_ZOMBIE_KNOCKBACK]);
arrayClasses[classCount][data_nvgs] = bool:KvGetNum(kvClasses, "nvgs"), GetConVarBool(gCvars[CVAR_ZOMBIE_NVGS]);
arrayClasses[classCount][data_fov] = KvGetNum(kvClasses, "fov"), GetConVarInt(gCvars[CVAR_ZOMBIE_FOV]);
arrayClasses[classCount][data_regen] = bool:KvGetNum(kvClasses, "regen"), GetConVarBool(gCvars[CVAR_ZOMBIE_REGEN]);
arrayClasses[classCount][data_regen_health] = KvGetNum(kvClasses, "regen_health"), GetConVarInt(gCvars[CVAR_ZOMBIE_REGEN_HEALTH]);
arrayClasses[classCount][data_regen_interval] = KvGetFloat(kvClasses, "regen_interval"), GetConVarFloat(gCvars[CVAR_ZOMBIE_REGEN_INTERVAL]);
arrayClasses[classCount][data_napalm] = bool:KvGetNum(kvClasses, "napalm"), GetConVarBool(gCvars[CVAR_ZOMBIE_NAPALM]);
arrayClasses[classCount][data_napalm_time] = KvGetFloat(kvClasses, "napalm_time"), GetConVarFloat(gCvars[CVAR_ZOMBIE_NAPALM_TIME]);
arrayClasses[classCount][data_nofalldamage] = bool:KvGetNum(kvClasses, "nofalldamage"), GetConVarBool(gCvars[CVAR_ZOMBIE_NOFALLDAMAGE]);
arrayClasses[classCount][data_kill_bonus] = KvGetNum(kvClasses, "kill_bonus"), GetConVarInt(gCvars[CVAR_ZOMBIE_KILL_BONUS]);
arrayClasses[classCount][data_infect_health] = KvGetNum(kvClasses, "infect_health"), GetConVarInt(gCvars[CVAR_ZOMBIE_INFECT_HEALTH]);
classCount++;
} while (KvGotoNextKey(kvClasses));
}
GetClassName(classindex, String:name[], maxlen)
{
strcopy(name, maxlen, arrayClasses[classindex][data_name]);
}
GetClassModel(classindex, String:model[], maxlen)
{
strcopy(model, maxlen, arrayClasses[classindex][data_model]);
}
GetClassMenuDescription(classindex, String:menudescription[], maxlen)
{
strcopy(menudescription, maxlen, arrayClasses[classindex][data_menu_description]);
}
GetClassZVision(classindex, String:zvision[], maxlen)
{
strcopy(zvision, maxlen, arrayClasses[classindex][data_zvision]);
}
GetClassHealth(classindex)
{
new bool:classes = GetConVarBool(gCvars[CVAR_CLASSES]);
if (classes)
{
return arrayClasses[classindex][data_health];
}
return GetConVarInt(gCvars[CVAR_ZOMBIE_HEALTH]);
}
Float:GetClassSpeed(classindex)
{
new bool:classes = GetConVarBool(gCvars[CVAR_CLASSES]);
if (classes)
{
return arrayClasses[classindex][data_speed];
}
return GetConVarFloat(gCvars[CVAR_ZOMBIE_SPEED]);
}
Float:GetClassJumpDistance(classindex)
{
new bool:classes = GetConVarBool(gCvars[CVAR_CLASSES]);
if (classes)
{
return arrayClasses[classindex][data_jump_distance];
}
return GetConVarFloat(gCvars[CVAR_ZOMBIE_JUMP_DISTANCE]);
}
Float:GetClassJumpHeight(classindex)
{
new bool:classes = GetConVarBool(gCvars[CVAR_CLASSES]);
if (classes)
{
return arrayClasses[classindex][data_jump_height];
}
return GetConVarFloat(gCvars[CVAR_ZOMBIE_JUMP_HEIGHT]);
}
Float:GetClassKnockback(classindex)
{
new bool:classes = GetConVarBool(gCvars[CVAR_CLASSES]);
if (classes)
{
return arrayClasses[classindex][data_knockback];
}
return GetConVarFloat(gCvars[CVAR_ZOMBIE_KNOCKBACK]);
}
bool:GetClassNVGs(classindex)
{
new bool:classes = GetConVarBool(gCvars[CVAR_CLASSES]);
if (classes)
{
return arrayClasses[classindex][data_nvgs];
}
return GetConVarBool(gCvars[CVAR_ZOMBIE_NVGS]);
}
GetClassFOV(classindex)
{
new bool:classes = GetConVarBool(gCvars[CVAR_CLASSES]);
if (classes)
{
return arrayClasses[classindex][data_fov];
}
return GetConVarInt(gCvars[CVAR_ZOMBIE_FOV]);
}
bool:GetClassRegen(classindex)
{
new bool:classes = GetConVarBool(gCvars[CVAR_CLASSES]);
if (classes)
{
return arrayClasses[classindex][data_regen];
}
return GetConVarBool(gCvars[CVAR_ZOMBIE_REGEN]);
}
GetClassRegenHealth(classindex)
{
new bool:classes = GetConVarBool(gCvars[CVAR_CLASSES]);
if (classes)
{
return arrayClasses[classindex][data_regen_health];
}
return GetConVarInt(gCvars[CVAR_ZOMBIE_REGEN_HEALTH]);
}
Float:GetClassRegenInterval(classindex)
{
new bool:classes = GetConVarBool(gCvars[CVAR_CLASSES]);
if (classes)
{
return arrayClasses[classindex][data_regen_interval];
}
return GetConVarFloat(gCvars[CVAR_ZOMBIE_REGEN_INTERVAL]);
}
bool:GetClassNapalm(classindex)
{
new bool:classes = GetConVarBool(gCvars[CVAR_CLASSES]);
if (classes)
{
return arrayClasses[classindex][data_napalm];
}
return GetConVarBool(gCvars[CVAR_ZOMBIE_NAPALM]);
}
Float:GetClassNapalmTime(classindex)
{
new bool:classes = GetConVarBool(gCvars[CVAR_CLASSES]);
if (classes)
{
return arrayClasses[classindex][data_napalm_time];
}
return GetConVarFloat(gCvars[CVAR_ZOMBIE_NAPALM_TIME]);
}
bool:GetClassNoFallDamage(classindex)
{
new bool:classes = GetConVarBool(gCvars[CVAR_CLASSES]);
if (classes)
{
return arrayClasses[classindex][data_nofalldamage];
}
return GetConVarBool(gCvars[CVAR_ZOMBIE_NOFALLDAMAGE]);
}
GetClassKillBonus(classindex)
{
new bool:classes = GetConVarBool(gCvars[CVAR_CLASSES]);
if (classes)
{
return arrayClasses[classindex][data_kill_bonus];
}
return GetConVarInt(gCvars[CVAR_ZOMBIE_KILL_BONUS]);
}
GetClassInfectHealth(classindex)
{
new bool:classes = GetConVarBool(gCvars[CVAR_CLASSES]);
if (classes)
{
return arrayClasses[classindex][data_infect_health];
}
return GetConVarInt(gCvars[CVAR_ZOMBIE_INFECT_HEALTH]);
}

118
src/zr/commands.inc Normal file
View File

@ -0,0 +1,118 @@
/**
* ====================
* Zombie:Reloaded
* File: commands.inc
* Author: Greyscale
* ====================
*/
CreateCommands()
{
RegAdminCmd("zr_infect", Command_Infect, ADMFLAG_GENERIC, "Infects the specified player");
RegAdminCmd("zr_spawn", Command_Respawn, ADMFLAG_GENERIC, "Respawns the specified player following auto-respawning rules");
RegAdminCmd("zr_restrict", Command_Restrict, ADMFLAG_GENERIC, "Restrict a specified weapon");
RegAdminCmd("zr_unrestrict", Command_UnRestrict, ADMFLAG_GENERIC, "Unrestrict a specified weapon");
}
public Action:Command_Infect(client, argc)
{
new bool:enabled = GetConVarBool(gCvars[CVAR_ENABLE]);
if (argc < 1 || !enabled)
{
return Plugin_Handled;
}
decl String:arg1[32];
GetCmdArg(1, arg1, sizeof(arg1));
decl String:target_name[MAX_TARGET_LENGTH];
new targets[MAXPLAYERS];
new bool:tn_is_ml;
new tcount = ProcessTargetString(arg1, client, targets, MAXPLAYERS, COMMAND_FILTER_ALIVE, target_name, sizeof(target_name), tn_is_ml);
if (tcount <= 0)
{
ReplyToTargetError(client, tcount);
return Plugin_Handled;
}
for (new x = 0; x < tcount; x++)
{
Zombify(targets[x], 0);
}
return Plugin_Handled;
}
public Action:Command_Respawn(client, argc)
{
new bool:enabled = GetConVarBool(gCvars[CVAR_ENABLE]);
if (argc < 1 || !enabled)
{
return Plugin_Handled;
}
decl String:arg1[32];
GetCmdArg(1, arg1, sizeof(arg1));
decl String:target_name[MAX_TARGET_LENGTH];
new targets[MAXPLAYERS];
new bool:tn_is_ml;
new tcount = ProcessTargetString(arg1, client, targets, MAXPLAYERS, COMMAND_FILTER_DEAD, target_name, sizeof(target_name), tn_is_ml);
if (tcount <= 0)
{
ReplyToTargetError(client, tcount);
return Plugin_Handled;
}
for (new x = 0; x < tcount; x++)
{
RespawnPlayer(targets[x]);
}
return Plugin_Handled;
}
public Action:Command_Restrict(client, argc)
{
new bool:enabled = GetConVarBool(gCvars[CVAR_ENABLE]);
if (argc < 1 || !enabled)
{
return Plugin_Handled;
}
decl String:arg1[32];
GetCmdArg(1, arg1, sizeof(arg1));
new WepRestrictQuery:output = RestrictWeapon(arg1);
if (output == Existing)
{
ZR_ReplyToCommand(client, "Weapon already restricted", arg1);
}
return Plugin_Handled;
}
public Action:Command_UnRestrict(client, argc)
{
new bool:enabled = GetConVarBool(gCvars[CVAR_ENABLE]);
if (argc < 1 || !enabled)
{
return Plugin_Handled;
}
decl String:arg1[32];
GetCmdArg(1, arg1, sizeof(arg1));
new WepRestrictQuery:output = UnRestrictWeapon(arg1);
if (output == Invalid)
{
ZR_ReplyToCommand(client, "Weapon invalid", arg1);
}
return Plugin_Handled;
}

191
src/zr/cvars.inc Normal file
View File

@ -0,0 +1,191 @@
/**
* ====================
* Zombie:Reloaded
* File: cvars.inc
* Author: Greyscale
* ====================
*/
enum ZRSettings
{
Handle:CVAR_ENABLE,
Handle:CVAR_ALLOW_PLAYER_TEAM,
Handle:CVAR_AMBIENCE,
Handle:CVAR_AMBIENCE_FILE,
Handle:CVAR_AMBIENCE_LENGTH,
Handle:CVAR_AMBIENCE_VOLUME,
Handle:CVAR_EMITSOUNDS,
Handle:CVAR_CLASSES,
Handle:CVAR_CLASSES_SPAWN,
Handle:CVAR_CLASSES_RANDOM,
Handle:CVAR_ZOMBIE_HEALTH,
Handle:CVAR_ZOMBIE_SPEED,
Handle:CVAR_ZOMBIE_JUMP_DISTANCE,
Handle:CVAR_ZOMBIE_JUMP_HEIGHT,
Handle:CVAR_ZOMBIE_KNOCKBACK,
Handle:CVAR_ZOMBIE_NVGS,
Handle:CVAR_ZOMBIE_FOV,
Handle:CVAR_ZOMBIE_REGEN,
Handle:CVAR_ZOMBIE_REGEN_HEALTH,
Handle:CVAR_ZOMBIE_REGEN_INTERVAL,
Handle:CVAR_ZOMBIE_NAPALM,
Handle:CVAR_ZOMBIE_NAPALM_TIME,
Handle:CVAR_ZOMBIE_NOFALLDAMAGE,
Handle:CVAR_ZOMBIE_KILL_BONUS,
Handle:CVAR_ZOMBIE_INFECT_HEALTH,
Handle:CVAR_ZOMBIE_ZVISION,
Handle:CVAR_ZVISION_REDISPLAY,
Handle:CVAR_ZVISION_ALLOW_DISABLE,
Handle:CVAR_DARK,
Handle:CVAR_DARK_LEVEL,
Handle:CVAR_DARK_SKY,
Handle:CVAR_MOTHER_ZOMBIE_RATIO,
Handle:CVAR_MOTHER_ZOMBIE_RESPAWN,
Handle:CVAR_RESPAWN,
Handle:CVAR_RESPAWN_TEAM,
Handle:CVAR_RESPAWN_DELAY,
Handle:CVAR_SUICIDE,
Handle:CVAR_SPAWN_MIN,
Handle:CVAR_SPAWN_MAX,
Handle:CVAR_PROTECT,
Handle:CVAR_CONSECUTIVE_INFECT,
Handle:CVAR_OVERLAYS,
Handle:CVAR_OVERLAYS_HUMAN,
Handle:CVAR_OVERLAYS_ZOMBIE,
Handle:CVAR_ZMARKET_BUYZONE,
Handle:CVAR_ZSPAWN,
Handle:CVAR_ZTELE,
Handle:CVAR_ZTELE_LIMIT,
Handle:CVAR_ZSTUCK,
Handle:CVAR_ZHP,
Handle:CVAR_ZHP_DEFAULT,
Handle:CVAR_CASHFILL,
Handle:CVAR_CASHAMOUNT,
Handle:CVAR_INFECT_FIREBALL,
Handle:CVAR_INFECT_SMOKE,
Handle:CVAR_INFECT_SPARKS,
Handle:CVAR_INFECT_SOUND,
Handle:CVAR_INFECT_ESPLASH,
Handle:CVAR_INFECT_SHAKE,
Handle:CVAR_INFECT_SHAKE_AMP,
Handle:CVAR_INFECT_SHAKE_FREQUENCY,
Handle:CVAR_INFECT_SHAKE_DURATION
}
new gCvars[ZRSettings];
CreateCvars()
{
gCvars[CVAR_ENABLE] = CreateConVar("zr_enable", "1", "Enable zombie gameplay (0: Disable)");
gCvars[CVAR_ALLOW_PLAYER_TEAM] = CreateConVar("zr_allow_player_team", "0", "This will allow the player_team event to be fired on first team join, enable when using mani model menu (0: Disable)");
gCvars[CVAR_AMBIENCE] = CreateConVar("zr_ambience", "1", "Enable creepy ambience to be played throughout the game (0: Disable)");
gCvars[CVAR_AMBIENCE_FILE] = CreateConVar("zr_ambience_file", "ambient/zr/zr_ambience.mp3", "Path to ambient sound file that will be played throughout the game, when zr_ambience is 1");
gCvars[CVAR_AMBIENCE_LENGTH] = CreateConVar("zr_ambience_length", "60.0", "The length, in seconds, of the ambient sound file");
gCvars[CVAR_AMBIENCE_VOLUME] = CreateConVar("zr_ambience_volume", "0.6", "Volume of ambient sounds when zr_ambience is 1 (0.0: Unhearable, 1.0: Max volume)");
gCvars[CVAR_EMITSOUNDS] = CreateConVar("zr_emitsounds", "50", "How often a zombie emits a sound, in seconds (0: Disable)");
gCvars[CVAR_CLASSES] = CreateConVar("zr_classes", "1", "Enable zombie classes");
gCvars[CVAR_CLASSES_SPAWN] = CreateConVar("zr_classes_spawn", "0", "Classmenu is re-displayed every spawn (0: Disable)");
gCvars[CVAR_CLASSES_RANDOM] = CreateConVar("zr_classes_random", "0", "A random class is assigned to each player every round (0: Disable)");
gCvars[CVAR_ZOMBIE_HEALTH] = CreateConVar("zr_zombie_health", "5000", "The default health of a zombie");
gCvars[CVAR_ZOMBIE_SPEED] = CreateConVar("zr_zombie_speed", "350", "How fast zombies travel (300: Default speed, 600: Double speed)");
gCvars[CVAR_ZOMBIE_JUMP_DISTANCE] = CreateConVar("zr_zombie_jump_distance", "0.1", "How far the zombie jumps, (0: Regular jump distance)");
gCvars[CVAR_ZOMBIE_JUMP_HEIGHT] = CreateConVar("zr_zombie_jump_height", "10.0", "How high a zombie jumps (0: Regular jump height)");
gCvars[CVAR_ZOMBIE_KNOCKBACK] = CreateConVar("zr_zombie_knockback", "4", "How far zombies are pushed back when shot (1: Default)");
gCvars[CVAR_ZOMBIE_NVGS] = CreateConVar("zr_zombie_nvgs", "0", "Zombies will receive nightvision and it will automatically be enabled (0: No night vision, recommended if using zvision)");
gCvars[CVAR_ZOMBIE_FOV] = CreateConVar("zr_zombie_fov", "110", "The field of vision of zombies (90: Default vision)");
gCvars[CVAR_ZOMBIE_REGEN] = CreateConVar("zr_zombie_regen", "0", "Zombies will regenerate health");
gCvars[CVAR_ZOMBIE_REGEN_HEALTH] = CreateConVar("zr_zombie_regen_health", "1", "How much health is regenerated when zr_zombie_regen is 1");
gCvars[CVAR_ZOMBIE_REGEN_INTERVAL] = CreateConVar("zr_zombie_regen_interval", "5", "How often, in seconds, a zombie regenerates health when zr_zombie_regen is 1");
gCvars[CVAR_ZOMBIE_NAPALM] = CreateConVar("zr_zombie_napalm", "1", "Turns grenades into napalm grenades that light zombies on fire (0: Disable)");
gCvars[CVAR_ZOMBIE_NAPALM_TIME] = CreateConVar("zr_zombie_napalm_time", "20", "How long the zombie burns when zr_napalm is 1");
gCvars[CVAR_ZOMBIE_NOFALLDAMAGE] = CreateConVar("zr_zombie_nofalldamage", "0", "Zombies wont be hurt from falling (0: Disable)");
gCvars[CVAR_ZOMBIE_KILL_BONUS] = CreateConVar("zr_zombie_kill_bonus", "2", "How many additional kills are rewarded to the killer of the zombie");
gCvars[CVAR_ZOMBIE_INFECT_HEALTH] = CreateConVar("zr_zombie_infect_health", "100", "How much health a zombie gains when infecting a human (0: Disable)");
gCvars[CVAR_ZOMBIE_ZVISION] = CreateConVar("zr_zombie_zvision", "overlays/zr/zvision", "Overlay to be shown on all zombies' screen on infection (Leave empty to disable)");
gCvars[CVAR_ZVISION_REDISPLAY] = CreateConVar("zr_zvision_redisplay", "0.2", "Frequency, in seconds, to display zvision on the client's screen (Never go below 0.1, 0.2 seems safe)");
gCvars[CVAR_ZVISION_ALLOW_DISABLE] = CreateConVar("zr_zvision_allow_disable", "1", "Allow users to disable ZVision with their nightvision key (0: Disable)");
gCvars[CVAR_DARK] = CreateConVar("zr_dark", "0", "Default value for darkening maps, most dislike this feature (0: Disable)");
gCvars[CVAR_DARK_LEVEL] = CreateConVar("zr_dark_level", "a", "The darkness of the map, a being the darkest, z being extremely bright when zr_dark is 1 (n: Default)");
gCvars[CVAR_DARK_SKY] = CreateConVar("zr_dark_sky", "sky_borealis01", "The sky the map will have when zr_dark is 1");
gCvars[CVAR_MOTHER_ZOMBIE_RATIO] = CreateConVar("zr_mother_zombie_ratio", "5", "For every 'x' number of humans, there will be 1 zombie (0: Always only 1 mother zombie)");
gCvars[CVAR_MOTHER_ZOMBIE_RESPAWN] = CreateConVar("zr_mother_zombie_respawn", "0", "First zombie(s) will be teleported back to spawn when infected (0: Disable)");
gCvars[CVAR_RESPAWN] = CreateConVar("zr_respawn", "0", "When player is killed, player will respawn");
gCvars[CVAR_RESPAWN_TEAM] = CreateConVar("zr_respawn_team", "zombie", "Which team to respawn player as (Choices: zombie, human)");
gCvars[CVAR_RESPAWN_DELAY] = CreateConVar("zr_respawn_delay", "1", "How long to wait after death to respawn, in seconds");
gCvars[CVAR_SUICIDE] = CreateConVar("zr_suicide", "1", "Stops players from suiciding");
gCvars[CVAR_SPAWN_MIN] = CreateConVar("zr_spawn_min", "30", "Minimum time a player is picked to be zombie after the round starts, in seconds");
gCvars[CVAR_SPAWN_MAX] = CreateConVar("zr_spawn_max", "50", "Maximum time a player is picked to be zombie after the round starts, in seconds");
gCvars[CVAR_PROTECT] = CreateConVar("zr_protect", "10", "Players that join late will be protected for this long, in seconds (0: Disable)");
gCvars[CVAR_CONSECUTIVE_INFECT] = CreateConVar("zr_consecutive_infect", "0", "Allow player to be randomly chosen twice in a row to be a mother zombie (0: Disable)");
gCvars[CVAR_OVERLAYS] = CreateConVar("zr_overlays", "1", "Will show overlays that tell who the winner of the round was (0: Disable)");
gCvars[CVAR_OVERLAYS_HUMAN] = CreateConVar("zr_overlays_human", "overlays/zr/humans_win", "The overlay shown to tell everyone that humans won when zr_overlays is 1");
gCvars[CVAR_OVERLAYS_ZOMBIE] = CreateConVar("zr_overlays_zombie", "overlays/zr/zombies_win", "The overlay shown to tell everyone that zombies won when zr_overlays is 1");
gCvars[CVAR_ZMARKET_BUYZONE] = CreateConVar("zr_zmarket_buyzone", "1", "Must be in buyzone to access !zmarket, if Market is installed (0: Can be used anywhere)");
gCvars[CVAR_ZSPAWN] = CreateConVar("zr_zspawn", "1", "Allow players to spawn if they just joined the game (0: Disable)");
gCvars[CVAR_ZTELE] = CreateConVar("zr_ztele", "1", "Allows zombies who get stuck to teleport back to spawn (0: Disable)");
gCvars[CVAR_ZTELE_LIMIT] = CreateConVar("zr_ztele_limit", "1", "Max amount of teleports per round when zr_ztele is 1 (0: Unlimited)");
gCvars[CVAR_ZSTUCK] = CreateConVar("zr_zstuck", "1", "Allow players that are stuck together to get unstuck (0: Disable)");
gCvars[CVAR_ZHP] = CreateConVar("zr_zhp", "1", "Allows clients to enable/disable zombie health display (1: On, 0: Off)");
gCvars[CVAR_ZHP_DEFAULT] = CreateConVar("zr_zhp_default", "1", "The default value of zombie health display to new clients (1: On, 0: Off)");
gCvars[CVAR_CASHFILL] = CreateConVar("zr_cashfill", "1", "Enable the mod to set the players cash to zr_cashamount (0: Disabled)");
gCvars[CVAR_CASHAMOUNT] = CreateConVar("zr_cashamount", "12000", "How much money players will have when they spawn when zr_cashfill is 1");
gCvars[CVAR_INFECT_FIREBALL] = CreateConVar("zr_infect_fireball", "1", "A fireball is created when a player is infected ( 0: Disable)");
gCvars[CVAR_INFECT_SMOKE] = CreateConVar("zr_infect_smoke", "1", "A puff of smoke is created when a player is infected (0: Disable)");
gCvars[CVAR_INFECT_SPARKS] = CreateConVar("zr_infect_sparks", "1", "Sparks are emitted when a player is infected (0: Disable)");
gCvars[CVAR_INFECT_SOUND] = CreateConVar("zr_infect_sound", "npc/fast_zombie/fz_scream1.wav", "Sound played from from player on infection (Leave blank to disable)");
gCvars[CVAR_INFECT_ESPLASH] = CreateConVar("zr_infect_esplash", "1", "An energy splash is emitted when player is infected ( 0: Disable)");
gCvars[CVAR_INFECT_SHAKE] = CreateConVar("zr_infect_shake", "1", "Player's screen is shaken on infection (0: Disable)");
gCvars[CVAR_INFECT_SHAKE_AMP] = CreateConVar("zr_infect_shake_amp", "15.0", "Amplitude of the shake, when zr_infect_shake is 1");
gCvars[CVAR_INFECT_SHAKE_FREQUENCY] = CreateConVar("zr_infect_shake_frequency", "1.0", "Frequency of the shake, when zr_infect_shake is 1");
gCvars[CVAR_INFECT_SHAKE_DURATION] = CreateConVar("zr_infect_shake_duration", "5.0", "Duration of the shake, when zr_infect_shake is 1");
HookConVarChange(gCvars[CVAR_ENABLE], EnableHook);
AutoExecConfig(true, "zombiereloaded", "sourcemod/zombiereloaded");
}
HookCvars()
{
SetConVarBool(FindConVar("mp_autoteambalance"), false);
SetConVarInt(FindConVar("mp_limitteams"), 0);
HookConVarChange(FindConVar("mp_autoteambalance"), AutoTeamBalanceHook);
HookConVarChange(FindConVar("mp_limitteams"), LimitTeamsHook);
HookConVarChange(FindConVar("mp_restartgame"), RestartGameHook);
}
UnhookCvars()
{
UnhookConVarChange(FindConVar("mp_autoteambalance"), AutoTeamBalanceHook);
UnhookConVarChange(FindConVar("mp_limitteams"), LimitTeamsHook);
UnhookConVarChange(FindConVar("mp_restartgame"), RestartGameHook);
}
public EnableHook(Handle:convar, const String:oldValue[], const String:newValue[])
{
new bool:enable = bool:StringToInt(newValue);
if (enable)
{
HookEvents();
HookCvars();
TerminateRound(3.0, Game_Commencing);
}
else
{
ZREnd();
}
}
public AutoTeamBalanceHook(Handle:convar, const String:oldValue[], const String:newValue[])
{
SetConVarBool(FindConVar("mp_autoteambalance"), false);
}
public LimitTeamsHook(Handle:convar, const String:oldValue[], const String:newValue[])
{
SetConVarInt(FindConVar("mp_limitteams"), 0);
}

178
src/zr/damagecontrol.inc Normal file
View File

@ -0,0 +1,178 @@
/**
* ====================
* Zombie:Reloaded
* File: damagecontrol.inc
* Author: Greyscale
* ====================
*/
#define DMG_GENERIC 0 // generic damage was done
#define DMG_BULLET (1 << 1) // shot
#define DMG_SLASH (1 << 2) // cut, clawed, stabbed
#define DMG_BURN (1 << 3) // heat burned
#define DMG_FALL (1 << 5) // fell too far
#define DMG_BLAST (1 << 6) // explosive blast damage
#define DMG_DROWN (1 << 14) // Drowning
enum ZRHooks
{
Hook_TraceAttack,
Hook_OnTakeDamage
}
new gHooks[MAXPLAYERS+1][ZRHooks];
InitDmgControl()
{
RegConsoleCmd("kill", Attempt_Suicide);
RegConsoleCmd("jointeam", Attempt_Suicide);
RegConsoleCmd("spectate", Attempt_Suicide);
}
ClientHookAttack(client)
{
gHooks[client][Hook_TraceAttack] = Hacks_Hook(client, HACKS_HTYPE_TRACEATTACK, TraceAttack, false);
gHooks[client][Hook_OnTakeDamage] = Hacks_Hook(client, HACKS_HTYPE_ONTAKEDAMAGE, OnTakeDamage, false);
}
ClientUnHookAttack(client)
{
Hacks_Unhook(gHooks[client][Hook_TraceAttack]);
Hacks_Unhook(gHooks[client][Hook_OnTakeDamage]);
}
public TraceAttack(client, inflictor, attacker, damage, hitbox, hitgroup)
{
new bool:enabled = GetConVarBool(gCvars[CVAR_ENABLE]);
if (!attacker || !IsClientInGame(attacker) || !enabled)
{
return Hacks_Continue;
}
if (IsPlayerZombie(client) && IsPlayerZombie(attacker))
{
return 0;
}
if (IsPlayerHuman(client) && IsPlayerHuman(attacker))
{
return 0;
}
return Hacks_Continue;
}
public OnTakeDamage(client, inflictor, attacker, damage, damagetype, ammotype)
{
new bool:enabled = GetConVarBool(gCvars[CVAR_ENABLE]);
if (!enabled)
{
return Hacks_Continue;
}
decl String:classname[64];
GetEdictClassname(inflictor, classname, sizeof(classname));
if (StrContains(classname, "trigger") > -1)
{
return Hacks_Continue;
}
if (damagetype & DMG_FALL)
{
if (!IsPlayerZombie(client))
{
return Hacks_Continue;
}
new bool:blockfalldamage = GetClassNoFallDamage(pClass[client]);
if (!blockfalldamage)
{
return Hacks_Continue;
}
return 0;
}
if (damagetype & DMG_BLAST)
{
if (!IsPlayerHuman(client) || !IsClientInGame(attacker))
{
return Hacks_Continue;
}
return 0;
}
if (damagetype & DMG_BULLET)
{
if (!client || !IsClientInGame(client))
{
return Hacks_Continue;
}
if (!attacker || !IsClientInGame(attacker))
{
return Hacks_Continue;
}
if (IsPlayerZombie(client) && IsPlayerHuman(attacker))
{
return Hacks_Continue;
}
if (IsPlayerHuman(client) && IsPlayerZombie(attacker))
{
new health = GetClientHealth(client);
SetEntityHealth(client, health + damage);
return Hacks_Continue;
}
return 0;
}
return Hacks_Continue;
}
public Action:Attempt_Suicide(client, argc)
{
if (!client)
{
return Plugin_Continue;
}
new bool:enabled = GetConVarBool(gCvars[CVAR_ENABLE]);
if (!enabled)
{
return Plugin_Continue;
}
new bool:suicide = GetConVarBool(gCvars[CVAR_SUICIDE]);
if (!suicide)
{
return Plugin_Continue;
}
decl String:cmd[16];
GetCmdArg(0, cmd, sizeof(cmd));
if (!IsPlayerZombie(client) && StrEqual(cmd, "spectate", false))
{
return Plugin_Continue;
}
if (!IsPlayerZombie(client) && !GetConVarBool(gCvars[CVAR_RESPAWN]))
{
return Plugin_Continue;
}
if (!IsPlayerAlive(client))
{
return Plugin_Continue;
}
ZR_ReplyToCommand(client, "Suicide text");
return Plugin_Handled;
}

465
src/zr/event.inc Normal file
View File

@ -0,0 +1,465 @@
/**
* ====================
* Zombie:Reloaded
* File: events.inc
* Author: Greyscale
* ====================
*/
HookEvents()
{
HookEvent("round_start", RoundStart);
HookEvent("round_freeze_end", RoundFreezeEnd);
HookEvent("round_end", RoundEnd);
HookEvent("player_team", PlayerTeam, EventHookMode_Pre);
HookEvent("player_spawn", PlayerSpawn);
HookEvent("player_hurt", PlayerHurt);
HookEvent("player_death", PlayerDeath);
HookEvent("player_jump", PlayerJump);
}
UnhookEvents()
{
UnhookEvent("round_start", RoundStart);
UnhookEvent("round_freeze_end", RoundFreezeEnd);
UnhookEvent("round_end", RoundEnd);
UnhookEvent("player_team", PlayerTeam, EventHookMode_Pre);
UnhookEvent("player_spawn", PlayerSpawn);
UnhookEvent("player_hurt", PlayerHurt);
UnhookEvent("player_death", PlayerDeath);
UnhookEvent("player_jump", PlayerJump);
}
public Action:RoundStart(Handle:event, const String:name[], bool:dontBroadcast)
{
ChangeLightStyle();
RestartAmbience();
RefreshList();
if (tRound != INVALID_HANDLE)
{
CloseHandle(tRound);
tRound = INVALID_HANDLE;
}
if (tInfect != INVALID_HANDLE)
{
CloseHandle(tInfect);
tInfect = INVALID_HANDLE;
}
ZR_PrintToChat(0, "Round objective");
}
public Action:RoundFreezeEnd(Handle:event, const String:name[], bool:dontBroadcast)
{
RemoveObjectives();
if (tRound != INVALID_HANDLE)
{
CloseHandle(tRound);
}
new Float:roundlen = GetConVarFloat(FindConVar("mp_roundtime")) * 60.0;
tRound = CreateTimer(roundlen, RoundOver, _, TIMER_FLAG_NO_MAPCHANGE);
if (tInfect != INVALID_HANDLE)
{
CloseHandle(tInfect);
}
new Float:min = GetConVarFloat(gCvars[CVAR_SPAWN_MIN]);
new Float:max = GetConVarFloat(gCvars[CVAR_SPAWN_MAX]);
new Float:randlen = GetRandomFloat(min, max);
tInfect = CreateTimer(randlen, MotherZombie, _, TIMER_FLAG_NO_MAPCHANGE);
}
public Action:RoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
{
if (tRound != INVALID_HANDLE)
{
CloseHandle(tRound);
tRound = INVALID_HANDLE;
}
if (tInfect != INVALID_HANDLE)
{
CloseHandle(tInfect);
tInfect = INVALID_HANDLE;
}
zombieSpawned = false;
new maxplayers = GetMaxClients();
for (new x = 1; x<= maxplayers; x++)
{
if (!IsClientInGame(x))
{
continue;
}
gZombie[x] = false;
new bool:consecutive_infect = GetConVarBool(gCvars[CVAR_CONSECUTIVE_INFECT]);
gBlockMotherInfect[x] = consecutive_infect ? false : motherZombie[x];
}
BalanceTeams();
new reason = GetEventInt(event, "reason");
if (reason == CTs_PreventEscape)
{
ShowOverlays(5.0, Human);
}
else if (reason == Terrorists_Escaped)
{
ShowOverlays(5.0, Zombie);
}
}
public Action:PlayerTeam(Handle:event, const String:name[], bool:dontBroadcast)
{
new index = GetClientOfUserId(GetEventInt(event, "userid"));
new team = GetEventInt(event, "team");
if (team == 1)
{
gZombie[index] = false;
motherZombie[index] = false;
}
new bool:allow_player_team = GetConVarBool(gCvars[CVAR_ALLOW_PLAYER_TEAM]);
if (allow_player_team && !IsPlayerInList(index))
{
return Plugin_Continue;
}
return Plugin_Handled;
}
public Action:PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast)
{
new index = GetClientOfUserId(GetEventInt(event, "userid"));
for (new x = 0; x < MAXTIMERS; x++)
{
if (x == TRESPAWN)
{
continue;
}
if (tHandles[index][x] != INVALID_HANDLE)
{
CloseHandle(tHandles[index][x]);
tHandles[index][x] = INVALID_HANDLE;
}
}
gZombie[index] = false;
motherZombie[index] = false;
SetPlayerFOV(index, 90);
ClientCommand(index, "r_screenoverlay \"\"");
new team = GetClientTeam(index);
if (team != CS_TEAM_T && team != CS_TEAM_CT)
{
return;
}
new bool:cashfill = GetConVarBool(gCvars[CVAR_CASHFILL]);
if (cashfill)
{
new cash = GetConVarInt(gCvars[CVAR_CASHAMOUNT]);
SetPlayerMoney(index, cash);
}
teleCount[index] = 0;
GetClientAbsOrigin(index, spawnLoc[index]);
NightVisionOn(index, false);
NightVision(index, false);
if (pNextClass[index] != -1)
{
Call_StartForward(hOnZClassChanged);
Call_PushCell(index);
Call_PushCell(pClass[index]);
Call_PushCell(pNextClass[index]);
Call_Finish();
pClass[index] = pNextClass[index];
pNextClass[index] = -1;
}
pProtect[index] = false;
if (zombieSpawned)
{
if (team == CS_TEAM_T)
{
CS_SwitchTeam(index, CS_TEAM_CT);
CS_RespawnPlayer(index);
}
new protect = GetConVarInt(gCvars[CVAR_PROTECT]);
if (protect > 0)
{
decl String:respawnteam[32];
GetConVarString(gCvars[CVAR_RESPAWN_TEAM], respawnteam, sizeof(respawnteam));
if (!StrEqual(respawnteam, "zombie", false))
{
pProtect[index] = true;
ZR_PrintToChat(index, "Spawn protection begin", protect);
ZR_PrintCenterText(index, "Spawn protection begin", protect);
if (tHandles[index][TPROTECT] != INVALID_HANDLE)
{
CloseHandle(tHandles[index][TPROTECT]);
}
tHandles[index][TPROTECT] = CreateTimer(float(protect), EndProtect, index, TIMER_FLAG_NO_MAPCHANGE);
}
}
}
new bool:randomclass = GetConVarBool(gCvars[CVAR_CLASSES_RANDOM]);
new bool:classes = GetConVarBool(gCvars[CVAR_CLASSES]);
if (classes)
{
new bool:showmenu = GetConVarBool(gCvars[CVAR_CLASSES_SPAWN]);
if (showmenu && !randomclass)
{
ClassMenu(index);
}
}
ZR_PrintToChat(index, "!zmenu reminder");
decl String:steamid[16];
GetClientAuthString(index, steamid, sizeof(steamid));
if (StrEqual(steamid, "BOT") || randomclass)
{
new class = GetRandomInt(0, classCount - 1);
Call_StartForward(hOnZClassChanged);
Call_PushCell(index);
Call_PushCell(pClass[index]);
Call_PushCell(class);
Call_Finish();
pClass[index] = class;
decl String:classname[32];
GetClassName(class, classname, sizeof(classname));
ZR_PrintToChat(index, "Auto-assign", classname);
}
}
public Action:PlayerHurt(Handle:event, const String:name[], bool:dontBroadcast)
{
new index = GetClientOfUserId(GetEventInt(event, "userid"));
new attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
new dmg = GetEventInt(event, "dmg_health");
decl String:weapon[32];
GetEventString(event, "weapon", weapon, sizeof(weapon));
if (attacker != 0)
{
if (IsPlayerHuman(index) && IsPlayerZombie(attacker))
{
if (StrEqual(weapon, "knife"))
{
Zombify(index, attacker);
}
}
else if (IsPlayerHuman(attacker))
{
new Float:knockback = GetClassKnockback(pClass[index]);
new Float:clientloc[3];
new Float:attackerloc[3];
GetClientAbsOrigin(index, clientloc);
if (!StrEqual(weapon, "hegrenade"))
{
GetClientAbsOrigin(attacker, attackerloc);
new bool:shotgun = (StrEqual(weapon, "m3") || StrEqual(weapon, "xm1014"));
KnockBack(index, clientloc, attackerloc, knockback, dmg, shotgun);
}
else
{
new Float:heLoc[3];
FindExplodingGrenade(heLoc);
KnockBack(index, clientloc, heLoc, knockback, dmg, true);
}
}
}
if (!IsPlayerZombie(index))
{
return;
}
if (GetRandomInt(1, 5) == 1)
{
decl String:sound[64];
new randsound = GetRandomInt(1, 6);
Format(sound, sizeof(sound), "npc/zombie/zombie_pain%d.wav", randsound);
PrecacheSound(sound);
EmitSoundToAll(sound, index);
}
new bool:napalm = GetClassNapalm(pClass[index]);
if (napalm)
{
if (StrEqual(weapon, "hegrenade", false))
{
new Float:napalm_time = GetClassNapalmTime(pClass[index]);
IgniteEntity(index, napalm_time);
}
}
UpdateHPDisplay(index);
if (GetClassRegen(pClass[index]))
{
if (tHandles[index][TREGEN] == INVALID_HANDLE)
{
new Float:interval = GetClassRegenInterval(pClass[index]);
tHandles[index][TREGEN] = CreateTimer(interval, Regenerate, index, TIMER_REPEAT);
}
}
}
FindExplodingGrenade(Float:heLoc[3])
{
decl String:classname[64];
new maxentities = GetMaxEntities();
for (new x = GetMaxClients(); x <= maxentities; x++)
{
if (IsValidEdict(x))
{
GetEdictClassname(x, classname, sizeof(classname));
if (StrEqual(classname, "hegrenade_projectile"))
{
new takedamage = GetEntProp(x, Prop_Data, "m_takedamage");
if (takedamage == 0)
{
GetEntPropVector(x, Prop_Send, "m_vecOrigin", heLoc);
return x;
}
}
}
}
return -1;
}
public Action:PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
{
new index = GetClientOfUserId(GetEventInt(event, "userid"));
new attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
SetPlayerFOV(index, DEFAULT_FOV);
ExtinguishEntity(index);
decl String:weapon[32];
GetEventString(event, "weapon", weapon, sizeof(weapon));
if (StrEqual(weapon, "zombie_claws_of_death", false))
{
if (index)
{
AddPlayerDeath(index, 1);
}
if (attacker)
{
AddPlayerScore(attacker, 1);
new healthgain = GetClassInfectHealth(pClass[attacker]);
new health = GetClientHealth(attacker);
SetEntityHealth(attacker, health + healthgain);
UpdateHPDisplay(attacker);
}
}
else
{
if (IsPlayerZombie(index))
{
decl String:sound[64];
new randsound = GetRandomInt(1, 3);
Format(sound, sizeof(sound), "npc/zombie/zombie_die%d.wav", randsound);
PrecacheSound(sound);
EmitSoundToAll(sound, index);
if (attacker)
{
new bonus = GetClassKillBonus(pClass[index]);
AddPlayerScore(attacker, bonus);
}
}
for (new x = 0; x < MAXTIMERS; x++)
{
if (tHandles[index][x] != INVALID_HANDLE)
{
CloseHandle(tHandles[index][x]);
tHandles[index][x] = INVALID_HANDLE;
}
}
new bool:respawn = GetConVarBool(gCvars[CVAR_RESPAWN]);
if (respawn)
{
new Float:delay = GetConVarFloat(gCvars[CVAR_RESPAWN_DELAY]);
tHandles[index][TRESPAWN] = CreateTimer(delay, RespawnTimer, index, TIMER_FLAG_NO_MAPCHANGE);
}
}
new ZTeam:team = IsRoundOver();
if (team == Neither)
{
ClientCommand(index, "r_screenoverlay \"\"");
return;
}
RoundWin(team);
}
public Action:PlayerJump(Handle:event, const String:name[], bool:dontBroadcast)
{
new index = GetClientOfUserId(GetEventInt(event, "userid"));
if (IsPlayerZombie(index))
{
new Float:distance = GetClassJumpDistance(pClass[index]);
new Float:height = GetClassJumpHeight(pClass[index]);
JumpBoost(index, distance, height);
}
}

36
src/zr/global.inc Normal file
View File

@ -0,0 +1,36 @@
/**
* ====================
* Zombie:Reloaded
* File: global.inc
* Author: Greyscale
* ====================
*/
new Handle:hZombify = INVALID_HANDLE;
new Handle:hOnZClassChanged = INVALID_HANDLE;
CreateGlobals()
{
CreateNative("ZR_IsClientZombie", Native_IsClientZombie);
CreateNative("ZR_GetClientZClass", Native_GetClientZClass);
CreateNative("ZR_HasZombieSpawned", Native_HasZombieSpawned);
hZombify = CreateGlobalForward("ZR_Zombify", ET_Ignore, Param_Cell, Param_Cell);
hOnZClassChanged = CreateGlobalForward("ZR_OnZClassChanged", ET_Ignore, Param_Cell, Param_Cell, Param_Cell);
}
public Native_IsClientZombie(Handle:plugin, argc)
{
return gZombie[GetNativeCell(1)];
}
public Native_GetClientZClass(Handle:plugin, argc)
{
new class = GetNativeCell(1);
return pClass[class];
}
public Native_HasZombieSpawned(Handle:plugin, argc)
{
return zombieSpawned;
}

175
src/zr/menu.inc Normal file
View File

@ -0,0 +1,175 @@
/**
* ====================
* Zombie:Reloaded
* File: menu.sp
* Author: Greyscale
* ====================
*/
MainMenu(client)
{
new Handle:menu_main = CreateMenu(MainMenuHandle);
SetGlobalTransTarget(client);
SetMenuTitle(menu_main, "%t\n ", "!zmenu title");
decl String:zmenu[128];
decl String:zclass[128];
decl String:zmarket[128];
decl String:zspawn[128];
decl String:ztele[128];
decl String:zstuck[128];
decl String:zhp[128];
Format(zmenu, sizeof(zmenu), "%t", "!zmenu menu");
Format(zclass, sizeof(zclass), "%t", "!zmenu class");
Format(zmarket, sizeof(zmarket), "%t", "!zmenu market");
Format(zspawn, sizeof(zspawn), "%t", "!zmenu spawn");
Format(ztele, sizeof(ztele), "%t", "!zmenu tele");
Format(zstuck, sizeof(zstuck), "%t", "!zmenu stuck");
Format(zhp, sizeof(zhp), "%t (%d HP)", "!zmenu hp", GetClientHealth(client));
AddMenuItem(menu_main, "zmenu", zmenu, ITEMDRAW_DISABLED);
AddMenuItem(menu_main, "zclass", zclass);
if (market)
{
AddMenuItem(menu_main, "zmarket", zmarket);
}
else
{
AddMenuItem(menu_main, "zmarket", zmarket, ITEMDRAW_DISABLED);
}
AddMenuItem(menu_main, "zspawn", zspawn);
AddMenuItem(menu_main, "ztele", ztele);
AddMenuItem(menu_main, "zstuck", zstuck);
AddMenuItem(menu_main, "zhp", zhp);
DisplayMenu(menu_main, client, MENU_TIME_FOREVER);
}
public MainMenuHandle(Handle:menu_main, MenuAction:action, client, slot)
{
if (action == MenuAction_Select)
{
switch(slot)
{
case 1:
{
if (!ZClass(client))
{
MainMenu(client);
}
}
case 2:
{
if (!ZMarket(client))
{
MainMenu(client);
}
}
case 3:
{
ZSpawn(client);
MainMenu(client);
}
case 4:
{
ZTele(client);
MainMenu(client);
}
case 5:
{
ZStuck(client);
MainMenu(client);
}
case 6:
{
ZHP(client);
MainMenu(client);
}
}
}
if (action == MenuAction_End)
{
CloseHandle(menu_main);
}
}
ClassMenu(client)
{
new Handle:menu_classes = CreateMenu(ClassMenuHandle);
decl String:menu_description[256];
decl String:display[288]; // 32 + 256
SetGlobalTransTarget(client);
SetMenuTitle(menu_classes, "%t\n ", "!zclass title");
for (new x = 0; x < classCount; x++)
{
GetClassName(x, display, sizeof(display));
GetClassMenuDescription(x, menu_description, sizeof(menu_description));
if (pNextClass[client] == -1)
{
if (x == pClass[client])
{
Format(display, sizeof(display), "%s (current)", display);
}
}
else if (x == pNextClass[client])
{
Format(display, sizeof(display), "%s (current)", display);
}
Format(display, sizeof(display), "%s\n %s", display, menu_description);
AddMenuItem(menu_classes, "", display);
}
SetMenuExitBackButton(menu_classes, true);
DisplayMenu(menu_classes, client, MENU_TIME_FOREVER);
}
public ClassMenuHandle(Handle:menu_classes, MenuAction:action, client, slot)
{
if (action == MenuAction_Select)
{
if (IsPlayerHuman(client) || !IsPlayerAlive(client))
{
Call_StartForward(hOnZClassChanged);
Call_PushCell(client);
Call_PushCell(pClass[client]);
Call_PushCell(slot);
Call_Finish();
pClass[client] = slot;
}
else
{
pNextClass[client] = slot;
}
decl String:name[64];
GetClassName(slot, name, sizeof(name));
ZR_PrintToChat(client, "Class select", name);
}
if (action == MenuAction_Cancel)
{
if (slot == MenuCancel_ExitBack)
{
MainMenu(client);
}
}
else if (action == MenuAction_End)
{
CloseHandle(menu_classes);
}
}

139
src/zr/models.inc Normal file
View File

@ -0,0 +1,139 @@
/**
* ====================
* Zombie:Reloaded
* File: models.inc
* Author: Greyscale
* ====================
*/
new String:modelSuffix[8][16] = {".dx80.vtx", ".dx90.vtx", ".mdl", ".phy", ".sw.vtx", ".vvd", ".xbox", ".xbox.vtx"};
new Handle:arrayModels = INVALID_HANDLE;
FileLinesToArray(Handle:array, const Handle:file)
{
ClearArray(array);
decl String:line[128];
while(!IsEndOfFile(file) && ReadFileLine(file, line, sizeof(line)))
{
if (StrContains(line, ";") == -1)
{
if (StrContains(line, "//") > -1)
{
SplitString(line, "//", line, sizeof(line));
}
TrimString(line);
if (!StrEqual(line, "", false))
{
PushArrayString(array, line);
}
}
}
}
LoadModelData()
{
decl String:path[PLATFORM_MAX_PATH];
BuildPath(Path_SM, path, sizeof(path), "configs/zr/models.txt");
if (arrayModels != INVALID_HANDLE)
{
CloseHandle(arrayModels);
}
arrayModels = CreateArray(256, 0);
new Handle:fileModels = OpenFile(path, "r");
if (fileModels == INVALID_HANDLE)
{
SetFailState("\"%s\" missing from server", path);
}
FileLinesToArray(arrayModels, fileModels);
if (!GetArraySize(arrayModels))
{
SetFailState("No models listed in models.txt, please add some models then restart");
}
decl String:model[256];
decl String:modelpath[256];
new modelsize = GetArraySize(arrayModels);
for (new x = 0; x < modelsize; x++)
{
for (new y = 0; y < 8; y++)
{
GetArrayString(arrayModels, x, model, sizeof(model));
Format(modelpath, sizeof(modelpath), "%s%s", model, modelSuffix[y]);
if (FileExists(modelpath))
{
AddFileToDownloadsTable(modelpath);
}
}
}
CloseHandle(fileModels);
}
LoadDownloadData()
{
decl String:path[PLATFORM_MAX_PATH];
BuildPath(Path_SM, path, sizeof(path), "configs/zr/downloads.txt");
new Handle:fileDownloads = OpenFile(path, "r");
if (fileDownloads == INVALID_HANDLE)
{
SetFailState("\"%s\" missing from server", path);
}
new Handle:arrayDownloads = CreateArray(256, 0);
FileLinesToArray(arrayDownloads, fileDownloads);
decl String:file[256];
new downloadsize = GetArraySize(arrayDownloads);
for (new x = 0; x < downloadsize; x++)
{
GetArrayString(arrayDownloads, x, file, sizeof(file));
if (FileExists(file))
{
AddFileToDownloadsTable(file);
}
else
{
ZR_LogMessage("File load failed", file);
}
}
CloseHandle(fileDownloads);
CloseHandle(arrayDownloads);
}
ApplyZombieModel(client)
{
decl String:modelpath[256];
new bool:classes = GetConVarBool(gCvars[CVAR_CLASSES]);
if (classes)
{
GetClassModel(pClass[client], modelpath, sizeof(modelpath));
if (!StrEqual(modelpath, "default", false))
{
SetPlayerModel(client, modelpath);
return;
}
}
new randmodel = GetRandomInt(0, GetArraySize(arrayModels) - 1);
GetArrayString(arrayModels, randmodel, modelpath, sizeof(modelpath));
Format(modelpath, sizeof(modelpath), "%s.mdl", modelpath);
SetPlayerModel(client, modelpath);
}

190
src/zr/offsets.inc Normal file
View File

@ -0,0 +1,190 @@
/**
* ====================
* Zombie:Reloaded
* File: offsets.inc
* Author: Greyscale
* ====================
*/
new offsBaseVelocity;
new offsGetVelocity0;
new offsGetVelocity1;
new offsGetVelocity2;
new offsSpeed;
new offsNVG;
new offsNVGOn;
new offsCollision;
new offsMoney;
new offsFOV;
new offsBuyZone;
new Handle:hGameConf = INVALID_HANDLE;
new Handle:hRemoveAllItems = INVALID_HANDLE;
new Handle:hTerminateRound = INVALID_HANDLE;
FindOffsets()
{
offsBaseVelocity = FindSendPropInfo("CBasePlayer", "m_vecBaseVelocity");
if (offsBaseVelocity == -1)
{
SetFailState("Couldn't find \"m_vecBaseVelocity\"!");
}
offsGetVelocity0 = FindSendPropInfo("CBasePlayer", "m_vecVelocity[0]");
if (offsGetVelocity0 == -1)
{
SetFailState("Couldn't find \"m_vecVelocity[0]\"!");
}
offsGetVelocity1 = FindSendPropInfo("CBasePlayer", "m_vecVelocity[1]");
if (offsGetVelocity1 == -1)
{
SetFailState("Couldn't find \"m_vecVelocity[1]\"!");
}
offsGetVelocity2 = FindSendPropInfo("CBasePlayer", "m_vecVelocity[2]");
if (offsGetVelocity2 == -1)
{
SetFailState("Couldn't find \"m_vecVelocity[2]\"!");
}
offsSpeed = FindSendPropInfo("CCSPlayer", "m_flLaggedMovementValue");
if (offsSpeed == -1)
{
SetFailState("Couldn't find \"m_flLaggedMovementValue\"!");
}
offsNVG = FindSendPropInfo("CCSPlayer", "m_bHasNightVision");
if (offsNVG == -1)
{
SetFailState("Couldn't find \"m_bHasNightVision\"!");
}
offsNVGOn = FindSendPropInfo("CCSPlayer", "m_bNightVisionOn");
if (offsNVGOn == -1)
{
SetFailState("Couldn't find \"m_bNightVisionOn\"!");
}
offsCollision = FindSendPropInfo("CBaseEntity", "m_CollisionGroup");
if (offsCollision == -1)
{
SetFailState("Couldn't find \"m_CollisionGroup\"!");
}
offsMoney = FindSendPropInfo("CCSPlayer", "m_iAccount");
if (offsMoney == -1)
{
SetFailState("Couldn't find \"m_iAccount\"!");
}
offsFOV = FindSendPropInfo("CBasePlayer", "m_iDefaultFOV");
if (offsFOV == -1)
{
SetFailState("Couldn't find \"m_iDefaultFOV\"!");
}
offsBuyZone = FindSendPropInfo("CCSPlayer", "m_bInBuyZone");
if (offsBuyZone == -1)
{
SetFailState("Couldn't find \"m_bInBuyZone\"!");
}
}
SetupGameData()
{
hGameConf = LoadGameConfigFile("plugin.zombiereloaded");
StartPrepSDKCall(SDKCall_Player);
PrepSDKCall_SetFromConf(hGameConf, SDKConf_Virtual, "RemoveAllItems");
hRemoveAllItems = EndPrepSDKCall();
StartPrepSDKCall(SDKCall_GameRules);
PrepSDKCall_SetFromConf(hGameConf, SDKConf_Signature, "TerminateRound");
PrepSDKCall_AddParameter(SDKType_Float, SDKPass_Plain);
PrepSDKCall_AddParameter(SDKType_PlainOldData, SDKPass_Plain);
hTerminateRound = EndPrepSDKCall();
}
SetPlayerVelocity(client, const Float:vec[3])
{
SetEntDataVector(client, offsBaseVelocity, vec, true);
}
GetPlayerVelocity(client, Float:vel[3])
{
vel[0] = GetEntDataFloat(client, offsGetVelocity0);
vel[1] = GetEntDataFloat(client, offsGetVelocity1);
vel[2] = GetEntDataFloat(client, offsGetVelocity2);
}
SetPlayerSpeed(client, Float:speed)
{
new Float:newspeed = speed / 300.0;
SetEntDataFloat(client, offsSpeed, newspeed, true);
}
NightVision(client, bool:enable)
{
SetEntData(client, offsNVG, enable, 1, true);
}
NightVisionOn(client, bool:enable)
{
SetEntData(client, offsNVGOn, enable, 1, true);
}
NoCollide(client, bool:nocollide)
{
if (nocollide)
{
SetEntData(client, offsCollision, 2, 1, true);
}
else
{
SetEntData(client, offsCollision, 5, 1, true);
}
}
SetPlayerMoney(client, amount)
{
SetEntData(client, offsMoney, amount, 4, true);
}
SetPlayerFOV(client, fov)
{
SetEntData(client, offsFOV, fov, 1, true);
}
bool:IsClientInBuyZone(client)
{
return bool:GetEntData(client, offsBuyZone);
}
AddPlayerScore(client, amount)
{
new frags = GetEntProp(client, Prop_Data, "m_iFrags");
SetEntProp(client, Prop_Data, "m_iFrags", frags + amount);
}
AddPlayerDeath(client, amount)
{
new deaths = GetEntProp(client, Prop_Data, "m_iDeaths");
SetEntProp(client, Prop_Data, "m_iDeaths", deaths + amount);
}
RemoveAllPlayersWeapons(client)
{
SDKCall(hRemoveAllItems, client);
}
TerminateRound(Float:delay, reason)
{
SDKCall(hTerminateRound, delay, reason);
}
SetPlayerModel(client, const String:model[])
{
PrecacheModel(model);
SetEntityModel(client, model);
}

47
src/zr/overlays.inc Normal file
View File

@ -0,0 +1,47 @@
/**
* ====================
* Zombie:Reloaded
* File: overlays.inc
* Author: Greyscale
* ====================
*/
ShowOverlays(Float:time, ZTeam:winner)
{
new bool:overlays = GetConVarBool(gCvars[CVAR_OVERLAYS]);
if (overlays)
{
decl String:overlay[64];
if (winner == Human)
{
GetConVarString(gCvars[CVAR_OVERLAYS_HUMAN], overlay, sizeof(overlay));
}
else if (winner == Zombie)
{
GetConVarString(gCvars[CVAR_OVERLAYS_ZOMBIE], overlay, sizeof(overlay));
}
new maxplayers = GetMaxClients();
for (new x = 1; x <= maxplayers; x++)
{
if (IsClientInGame(x))
{
DisplayClientOverlay(x, overlay);
}
}
CreateTimer(time, KillOverlays);
}
}
public Action:KillOverlays(Handle:timer)
{
new maxplayers = GetMaxClients();
for (new x = 1; x <= maxplayers; x++)
{
if (IsClientInGame(x))
{
ClientCommand(x, "r_screenoverlay \"\"");
}
}
}

346
src/zr/sayhooks.inc Normal file
View File

@ -0,0 +1,346 @@
/**
* ====================
* Zombie:Reloaded
* File: sayhooks.inc
* Author: Greyscale
* ====================
*/
HookChatCmds()
{
RegConsoleCmd("say", SayCommand);
RegConsoleCmd("say_team", SayCommand);
}
public Action:SayCommand(client, argc)
{
new bool:enabled = GetConVarBool(gCvars[CVAR_ENABLE]);
if (!client || !enabled)
{
return Plugin_Continue;
}
decl String:args[192];
GetCmdArgString(args, sizeof(args));
ReplaceString(args, sizeof(args), "\"", "");
if (StrEqual(args, "!zmenu", false))
{
MainMenu(client);
return Plugin_Handled;
}
else if (StrEqual(args, "!zclass", false))
{
ZClass(client);
return Plugin_Handled;
}
else if (StrEqual(args, "!zmarket", false))
{
ZMarket(client);
return Plugin_Handled;
}
else if (StrEqual(args, "!zspawn", false))
{
ZSpawn(client);
return Plugin_Handled;
}
else if (StrEqual(args, "!ztele", false))
{
ZTele(client);
return Plugin_Handled;
}
else if (StrEqual(args, "!zstuck", false))
{
ZStuck(client);
return Plugin_Handled;
}
else if (StrEqual(args, "!zhp", false))
{
ZHP(client);
return Plugin_Handled;
}
return Plugin_Continue;
}
bool:ZClass(client)
{
new bool:classes = GetConVarBool(gCvars[CVAR_CLASSES]);
if (!classes)
{
ZR_PrintToChat(client, "Feature is disabled");
return false;
}
new bool:randomclass = GetConVarBool(gCvars[CVAR_CLASSES_RANDOM]);
if (randomclass)
{
ZR_PrintToChat(client, "Random class is enabled");
return false;
}
ClassMenu(client);
return true;
}
bool:ZMarket(client)
{
if (!market)
{
ZR_PrintToChat(client, "Feature is disabled");
return false;
}
if (!IsPlayerAlive(client))
{
ZR_PrintToChat(client, "Must be alive");
return false;
}
new bool:buyzone = GetConVarBool(gCvars[CVAR_ZMARKET_BUYZONE]);
if (!IsClientInBuyZone(client) && buyzone)
{
ZR_PrintCenterText(client, "Market out of buyzone");
return false;
}
SetGlobalTransTarget(client);
decl String:title[64];
decl String:rebuy[64];
Format(title, sizeof(title), "%t\n ", "Market title");
Format(rebuy, sizeof(rebuy), "%t\n ", "Market rebuy");
Market_Send(client, title, rebuy);
return true;
}
public bool:Market_OnWeaponSelected(client, String:weaponid[])
{
if (!weaponid[0] || !IsPlayerAlive(client))
{
return false;
}
if (IsPlayerZombie(client))
{
ZR_PrintToChat(client, "Zombie cant use weapon");
return false;
}
if (StrEqual(weaponid, "rebuy"))
{
return true;
}
decl String:display[64];
decl String:weapon[32];
new price;
if (!Market_GetWeaponIDInfo(weaponid, display, weapon, price))
{
return false;
}
ReplaceString(weapon, sizeof(weapon), "weapon_", "");
if (IsWeaponRestricted(weapon))
{
ZR_PrintToChat(client, "Weapon is restricted", weapon);
return false;
}
new bool:buyzone = GetConVarBool(gCvars[CVAR_ZMARKET_BUYZONE]);
if (!IsClientInBuyZone(client) && buyzone)
{
ZR_PrintCenterText(client, "Market out of buyzone");
return false;
}
return true;
}
public Market_PostOnWeaponSelected(client, &bool:allowed)
{
if (!allowed)
{
return;
}
ZMarket(client);
}
ZSpawn(client)
{
new bool:spawn = GetConVarBool(gCvars[CVAR_ZSPAWN]);
if (!spawn)
{
ZR_PrintToChat(client, "Feature is disabled");
return;
}
new team = GetClientTeam(client);
if (team != CS_TEAM_T && team != CS_TEAM_CT)
{
return;
}
if (IsPlayerAlive(client) || IsPlayerInList(client))
{
return;
}
RespawnPlayer(client);
AddPlayerToList(client);
}
ZTele(client)
{
new bool:tele = GetConVarBool(gCvars[CVAR_ZTELE]);
if (!tele)
{
ZR_PrintToChat(client, "Feature is disabled");
return;
}
if (!IsPlayerZombie(client) && zombieSpawned)
{
ZR_PrintToChat(client, "!ztele humans restricted");
return;
}
if (!IsPlayerAlive(client) || tHandles[client][TTELE] != INVALID_HANDLE)
{
return;
}
new count = teleCount[client];
new limit = GetConVarInt(gCvars[CVAR_ZTELE_LIMIT]);
if (limit > 0)
{
if (count < limit)
{
tHandles[client][TTELE] = CreateTimer(3.0, Teleport, client, TIMER_FLAG_NO_MAPCHANGE);
teleCount[client]++;
ZR_PrintToChat(client, "!ztele amount", limit - teleCount[client]);
}
else
{
ZR_PrintToChat(client, "!ztele limit reached");
}
}
else
{
tHandles[client][TTELE] = CreateTimer(3.0, Teleport, client, TIMER_FLAG_NO_MAPCHANGE);
ZR_PrintToChat(client, "!ztele amount unlimited");
}
}
public Action:Teleport(Handle:timer, any:index)
{
TeleportEntity(index, spawnLoc[index], NULL_VECTOR, NULL_VECTOR);
tHandles[index][TTELE] = INVALID_HANDLE;
}
ZStuck(client)
{
new bool:stuck = GetConVarBool(gCvars[CVAR_ZTELE]);
if (!stuck)
{
ZR_PrintToChat(client, "Feature is disabled");
return;
}
if (!IsPlayerAlive(client))
{
return;
}
new Float:clientloc[3];
new Float:stuckloc[3];
GetClientAbsOrigin(client, clientloc);
new maxplayers = GetMaxClients();
for (new x = 1; x <= maxplayers; x++)
{
if (!IsClientInGame(x) || !IsPlayerAlive(x))
{
continue;
}
GetClientAbsOrigin(x, stuckloc);
if (GetVectorDistance(clientloc, stuckloc) <= 60)
{
NoCollide(x, true);
CreateTimer(0.5, CollisionOn, x, TIMER_FLAG_NO_MAPCHANGE);
}
}
new Float:x = GetRandomFloat(-150.0, 150.0);
new Float:y = GetRandomFloat(-150.0, 150.0);
new Float:nudge[3];
nudge[0] = x;
nudge[1] = y;
SetPlayerVelocity(client, nudge);
}
public Action:CollisionOn(Handle:timer, any:index)
{
if (!IsClientInGame(index))
{
return;
}
NoCollide(index, false);
}
ZHP(client)
{
new bool:zhp = GetConVarBool(gCvars[CVAR_ZHP]);
if (!zhp)
{
ZR_PrintToChat(client, "Feature is disabled");
return;
}
if (dispHP[client])
{
ZR_PrintToChat(client, "!zhp disabled");
}
else
{
ZR_PrintToChat(client, "!zhp enabled");
UpdateHPDisplay(client);
}
dispHP[client] = !dispHP[client];
}

118
src/zr/translation.inc Normal file
View File

@ -0,0 +1,118 @@
/**
* ====================
* Zombie:Reloaded
* File: translations.inc
* Author: Greyscale
* ====================
*/
FormatTextString(String:text[], maxlen)
{
Format(text, maxlen, "@green[%t] @default%s", "ZR", text);
ReplaceString(text, maxlen, "@default","\x01");
ReplaceString(text, maxlen, "@lgreen","\x03");
ReplaceString(text, maxlen, "@green","\x04");
}
stock ZR_PrintToChat(client, any:...)
{
decl String:phrase[192];
if (client)
{
SetGlobalTransTarget(client);
VFormat(phrase, sizeof(phrase), "%t", 2);
FormatTextString(phrase, sizeof(phrase));
PrintToChat(client, phrase);
}
else
{
SetGlobalTransTarget(client);
VFormat(phrase, sizeof(phrase), "%t", 2);
FormatTextString(phrase, sizeof(phrase));
PrintToServer(phrase);
new maxplayers = GetMaxClients();
for (new x = 1; x <= maxplayers; x++)
{
if (IsClientInGame(x))
{
SetGlobalTransTarget(x);
VFormat(phrase, sizeof(phrase), "%t", 2);
FormatTextString(phrase, sizeof(phrase));
PrintToChat(x, phrase);
}
}
}
}
stock ZR_PrintCenterText(client, any:...)
{
SetGlobalTransTarget(client);
decl String:phrase[192];
VFormat(phrase, sizeof(phrase), "%t", 2);
PrintCenterText(client, phrase);
}
stock ZR_HudHint(client, any:...)
{
SetGlobalTransTarget(client);
decl String:phrase[192];
VFormat(phrase, sizeof(phrase), "%t", 2);
new Handle:hHintText = StartMessageOne("HintText", client);
if (hHintText != INVALID_HANDLE)
{
BfWriteByte(hHintText, -1);
BfWriteString(hHintText, phrase);
EndMessage();
}
}
stock ZR_PrintToServer(any:...)
{
SetGlobalTransTarget(LANG_SERVER);
decl String:phrase[192];
decl String:buffer[192];
VFormat(phrase, sizeof(phrase), "%t", 1);
Format(buffer, sizeof(buffer), "[%t] %s", "ZR", phrase);
PrintToServer(buffer);
}
stock ZR_LogMessage(any:...)
{
SetGlobalTransTarget(LANG_SERVER);
decl String:phrase[192];
VFormat(phrase, sizeof(phrase), "%t", 1);
LogMessage(phrase);
}
stock ZR_ReplyToCommand(client, any:...)
{
decl String:phrase[192];
SetGlobalTransTarget(client);
VFormat(phrase, sizeof(phrase), "%t", 2);
FormatTextString(phrase, sizeof(phrase));
ReplyToCommand(client, phrase);
}

261
src/zr/weaponrestrict.inc Normal file
View File

@ -0,0 +1,261 @@
/**
* ====================
* Zombie:Reloaded
* File: weaponrestrict.inc
* Author: Greyscale
* ====================
*/
new Handle:restrictedWeapons = INVALID_HANDLE;
new gRestrict[MAXPLAYERS+1];
enum WepRestrictQuery
{
Successful, /** Weapon (un)restrict query was successful */
Invalid, /** Weapon invalid */
Existing, /** Already restricted */
}
InitWeaponRestrict()
{
RegConsoleCmd("buy", BuyHook);
restrictedWeapons = CreateArray(32, 0);
}
ClientHookUse(client)
{
gRestrict[client] = Hacks_Hook(client, HACKS_HTYPE_WEAPON_CANUSE, Weapon_CanUse, false);
}
ClientUnHookUse(client)
{
Hacks_Unhook(gRestrict[client]);
}
public Action:BuyHook(client, argc)
{
new bool:enabled = GetConVarBool(gCvars[CVAR_ENABLE]);
if (!enabled)
{
return Plugin_Continue;
}
if (IsPlayerHuman(client))
{
decl String:weapon[64];
GetCmdArg(1, weapon, sizeof(weapon));
ReplaceString(weapon, sizeof(weapon), "weapon_", "");
if (IsWeaponRestricted(weapon))
{
ZR_PrintToChat(client, "Weapon is restricted", weapon);
return Plugin_Handled;
}
}
else
{
ZR_PrintToChat(client, "Zombie cant use weapon");
return Plugin_Handled;
}
return Plugin_Continue;
}
WepRestrictQuery:RestrictWeapon(const String:weapon[])
{
if (IsWeaponGroup(weapon))
{
RestrictWeaponGroup(weapon);
ZR_PrintToChat(0, "Weapon group has been restricted", weapon);
return Successful;
}
if (!IsWeaponRestricted(weapon))
{
PushArrayString(restrictedWeapons, weapon);
ZR_PrintToChat(0, "Weapon has been restricted", weapon);
return Successful;
}
return Existing;
}
RestrictWeaponGroup(const String:group[])
{
if (StrEqual(group, "pistols", false))
{
PushArrayString(restrictedWeapons, "glock");
PushArrayString(restrictedWeapons, "usp");
PushArrayString(restrictedWeapons, "p228");
PushArrayString(restrictedWeapons, "deagle");
PushArrayString(restrictedWeapons, "elite");
PushArrayString(restrictedWeapons, "fiveseven");
}
else if (StrEqual(group, "shotguns", false))
{
PushArrayString(restrictedWeapons, "m3");
PushArrayString(restrictedWeapons, "xm1014");
}
else if (StrEqual(group, "smgs", false))
{
PushArrayString(restrictedWeapons, "tmp");
PushArrayString(restrictedWeapons, "mac10");
PushArrayString(restrictedWeapons, "mp5navy");
PushArrayString(restrictedWeapons, "ump45");
PushArrayString(restrictedWeapons, "p90");
}
else if (StrEqual(group, "rifles", false))
{
PushArrayString(restrictedWeapons, "galil");
PushArrayString(restrictedWeapons, "famas");
PushArrayString(restrictedWeapons, "ak47");
PushArrayString(restrictedWeapons, "m4a1");
PushArrayString(restrictedWeapons, "sg552");
PushArrayString(restrictedWeapons, "bullpup");
}
else if (StrEqual(group, "snipers", false))
{
PushArrayString(restrictedWeapons, "scout");
PushArrayString(restrictedWeapons, "sg550");
PushArrayString(restrictedWeapons, "g3sg1");
PushArrayString(restrictedWeapons, "awp");
}
}
WepRestrictQuery:UnRestrictWeapon(const String:weapon[])
{
if (IsWeaponGroup(weapon))
{
UnRestrictWeaponGroup(weapon);
ZR_PrintToChat(0, "Weapon group has been unrestricted", weapon);
return Successful;
}
new index = GetRestrictedWeaponIndex(weapon);
if (index > -1)
{
RemoveFromArray(restrictedWeapons, index);
ZR_PrintToChat(0, "Weapon has been unrestricted", weapon);
return Successful;
}
return Invalid;
}
UnRestrictWeaponGroup(const String:group[])
{
if (StrEqual(group, "pistols", false))
{
UnRestrictWeapon("glock");
UnRestrictWeapon("usp");
UnRestrictWeapon("p228");
UnRestrictWeapon("deagle");
UnRestrictWeapon("elite");
UnRestrictWeapon("fiveseven");
}
else if (StrEqual(group, "shotguns", false))
{
UnRestrictWeapon("m3");
UnRestrictWeapon("xm1014");
}
else if (StrEqual(group, "smgs", false))
{
UnRestrictWeapon("tmp");
UnRestrictWeapon("mac10");
UnRestrictWeapon("mp5navy");
UnRestrictWeapon("ump45");
UnRestrictWeapon("p90");
}
else if (StrEqual(group, "rifles", false))
{
UnRestrictWeapon("galil");
UnRestrictWeapon("famas");
UnRestrictWeapon("ak47");
UnRestrictWeapon("m4a1");
UnRestrictWeapon("sg552");
UnRestrictWeapon("bullpup");
}
else if (StrEqual(group, "snipers", false))
{
UnRestrictWeapon("scout");
UnRestrictWeapon("sg550");
UnRestrictWeapon("g3sg1");
UnRestrictWeapon("awp");
}
}
bool:IsWeaponRestricted(const String:weapon[])
{
for (new x = 0; x < GetArraySize(restrictedWeapons); x++)
{
decl String:restrictedweapon[32];
GetArrayString(restrictedWeapons, x, restrictedweapon, sizeof(restrictedweapon));
if (StrEqual(weapon, restrictedweapon, false))
{
return true;
}
}
return false;
}
GetRestrictedWeaponIndex(const String:weapon[])
{
for (new x = 0; x < GetArraySize(restrictedWeapons); x++)
{
decl String:restrictedweapon[32];
GetArrayString(restrictedWeapons, x, restrictedweapon, sizeof(restrictedweapon));
ReplaceString(restrictedweapon, sizeof(restrictedweapon), "weapon_", "");
if (StrEqual(weapon, restrictedweapon, false))
{
return x;
}
}
return -1;
}
bool:IsWeaponGroup(const String:weapon[])
{
return (StrEqual(weapon, "pistols", false) || StrEqual(weapon, "shotguns", false) || StrEqual(weapon, "smgs", false) || StrEqual(weapon, "rifles", false) || StrEqual(weapon, "snipers", false));
}
public Weapon_CanUse(client, weapon, dummy1, dummy2, dummy3, dummy4)
{
new bool:enabled = GetConVarBool(gCvars[CVAR_ENABLE]);
if (!enabled)
{
return Hacks_Continue;
}
new String:weaponname[32];
GetEdictClassname(weapon, weaponname, sizeof(weaponname));
ReplaceString(weaponname, sizeof(weaponname), "weapon_", "");
if (IsWeaponRestricted(weaponname))
{
return 0;
}
if (IsPlayerZombie(client) && !StrEqual(weaponname, "knife"))
{
return 0;
}
return Hacks_Continue;
}

887
src/zr/zombie.inc Normal file
View File

@ -0,0 +1,887 @@
/**
* ====================
* Zombie:Reloaded
* File: zombie.inc
* Author: Greyscale
* ====================
*/
#define EXP_NODAMAGE 1
#define EXP_REPEATABLE 2
#define EXP_NOFIREBALL 4
#define EXP_NOSMOKE 8
#define EXP_NODECAL 16
#define EXP_NOSPARKS 32
#define EXP_NOSOUND 64
#define EXP_RANDOMORIENTATION 128
#define EXP_NOFIREBALLSMOKE 256
#define EXP_NOPARTICLES 512
#define EXP_NODLIGHTS 1024
#define EXP_NOCLAMPMIN 2048
#define EXP_NOCLAMPMAX 4096
new String:skyname[32];
HookCommands()
{
RegConsoleCmd("nightvision", Command_NightVision);
}
public Action:Command_NightVision(client, argc)
{
new bool:allow_disable = GetConVarBool(gCvars[CVAR_ZVISION_ALLOW_DISABLE]);
if (!allow_disable)
{
return;
}
new bool:enabled = GetConVarBool(gCvars[CVAR_ENABLE]);
if (!enabled)
{
return;
}
if (!IsPlayerZombie(client))
{
return;
}
bZVision[client] = !bZVision[client];
if (bZVision[client])
{
StartZVision(client);
}
else
{
StopZVision(client);
}
}
FindMapSky()
{
GetConVarString(FindConVar("sv_skyname"), skyname, sizeof(skyname));
}
ChangeLightStyle()
{
new bool:dark = GetConVarBool(gCvars[CVAR_DARK]);
if (dark)
{
decl String:darkness[2];
decl String:sky[32];
GetConVarString(gCvars[CVAR_DARK_LEVEL], darkness, sizeof(darkness));
GetConVarString(gCvars[CVAR_DARK_SKY], sky, sizeof(sky));
SetLightStyle(0, darkness);
SetConVarString(FindConVar("sv_skyname"), sky, true, false);
}
else
{
SetLightStyle(0, "n");
SetConVarString(FindConVar("sv_skyname"), skyname, true, false);
}
}
public RestartGameHook(Handle:convar, const String:oldValue[], const String:newValue[])
{
SetConVarInt(FindConVar("mp_restartgame"), 0);
TerminateRound(StringToFloat(newValue), Round_Draw);
}
public Action:MotherZombie(Handle:timer)
{
RefreshList();
new size = GetArraySize(pList);
new immune = 0;
for (new x = 0; x < size; x++)
{
new index = GetArrayCell(pList, x);
if (gBlockMotherInfect[index])
{
immune++;
}
if (!IsPlayerAlive(index) || IsPlayerZombie(index))
{
continue;
}
CS_SwitchTeam(index, CS_TEAM_CT);
}
if (!(size - immune))
{
tInfect = INVALID_HANDLE;
return;
}
new randclient;
new ratio = GetConVarInt(gCvars[CVAR_MOTHER_ZOMBIE_RATIO]);
if (ratio <= 0)
{
do
{
randclient = RandomPlayerFromList();
} while (!IsPlayerAlive(randclient) || gBlockMotherInfect[randclient]);
Zombify_Mother(randclient);
}
else
{
new mothercount = RoundToCeil(float(size) / ratio);
for (new x = 0; x < mothercount; x++)
{
do
{
randclient = RandomPlayerFromList();
} while (IsPlayerZombie(randclient) || !IsPlayerAlive(randclient) || gBlockMotherInfect[randclient]);
Zombify_Mother(randclient);
}
}
tInfect = INVALID_HANDLE;
zombieSpawned = true;
}
Zombify_Mother(client)
{
Call_StartForward(hZombify);
Call_PushCell(client);
Call_PushCell(true);
Call_Finish();
gZombie[client] = true;
motherZombie[client] = true;
ApplyZombieHealth(client,true);
ApplyZombieSpeed(client);
CS_SwitchTeam(client, CS_TEAM_T);
RemoveAllPlayersWeapons(client);
GivePlayerItem(client, "weapon_knife");
ApplyZombieNightVision(client);
ApplyZombieFOV(client);
ApplyZombieModel(client);
InfectionEffects(client);
ZR_PrintToChat(client, "You are a zombie");
if (bZVision[client])
{
StartZVision(client);
}
new bool:mother_zombie_respawn = GetConVarBool(gCvars[CVAR_MOTHER_ZOMBIE_RESPAWN]);
if (mother_zombie_respawn)
{
TeleportEntity(client, spawnLoc[client], NULL_VECTOR, NULL_VECTOR);
}
new Float:interval = GetConVarFloat(gCvars[CVAR_EMITSOUNDS]);
if (tHandles[client][TMOAN] != INVALID_HANDLE)
{
CloseHandle(tHandles[client][TMOAN]);
}
tHandles[client][TMOAN] = CreateTimer(interval, ZombieMoanTimer, client, TIMER_REPEAT);
if (tHandles[client][TPROTECT] != INVALID_HANDLE)
{
TriggerTimer(tHandles[client][TPROTECT]);
tHandles[client][TPROTECT] = INVALID_HANDLE;
}
if (tHandles[client][TZHP] != INVALID_HANDLE)
{
CloseHandle(tHandles[client][TZHP]);
tHandles[client][TZHP] = INVALID_HANDLE;
}
new bool:zhp = GetConVarBool(gCvars[CVAR_ZHP]);
if (zhp)
{
UpdateHPDisplay(client);
tHandles[client][TZHP] = CreateTimer(5.0, ZHPTimer, client, TIMER_REPEAT);
}
}
Zombify(client, attacker)
{
if (attacker != 0)
{
new Handle:event = CreateEvent("player_death");
if (event != INVALID_HANDLE)
{
SetEventInt(event, "userid", GetClientUserId(client));
SetEventInt(event, "attacker", GetClientUserId(attacker));
SetEventString(event, "weapon", "zombie_claws_of_death");
FireEvent(event, false);
}
}
Call_StartForward(hZombify);
Call_PushCell(client);
Call_PushCell(false);
Call_Finish();
gZombie[client] = true;
ApplyZombieHealth(client, false);
ApplyZombieSpeed(client);
RemoveAllPlayersWeapons(client);
GivePlayerItem(client, "weapon_knife");
ApplyZombieNightVision(client);
ApplyZombieFOV(client);
ApplyZombieModel(client);
if (bZVision[client])
{
StartZVision(client);
}
InfectionEffects(client);
new ZTeam:team = IsRoundOver();
RoundWin(team);
CS_SwitchTeam(client, CS_TEAM_T);
new Float:interval = GetConVarFloat(gCvars[CVAR_EMITSOUNDS]);
if (tHandles[client][TMOAN] != INVALID_HANDLE)
{
CloseHandle(tHandles[client][TMOAN]);
}
tHandles[client][TMOAN] = CreateTimer(interval, ZombieMoanTimer, client, TIMER_REPEAT);
if (tHandles[client][TPROTECT] != INVALID_HANDLE)
{
TriggerTimer(tHandles[client][TPROTECT]);
tHandles[client][TPROTECT] = INVALID_HANDLE;
}
if (tHandles[client][TZHP] != INVALID_HANDLE)
{
CloseHandle(tHandles[client][TZHP]);
tHandles[client][TZHP] = INVALID_HANDLE;
}
new bool:zhp = GetConVarBool(gCvars[CVAR_ZHP]);
if (zhp)
{
UpdateHPDisplay(client);
tHandles[client][TZHP] = CreateTimer(5.0, ZHPTimer, client, TIMER_REPEAT);
}
AntiStick(attacker, client);
}
InfectionEffects(client)
{
new Float:clientloc[3];
new Float:direction[3] = {0.0, 0.0, 0.0};
GetClientAbsOrigin(client, clientloc);
clientloc[2] += 30;
decl String:sound[128];
GetConVarString(gCvars[CVAR_INFECT_SOUND], sound, sizeof(sound));
if (sound[0])
{
PrecacheSound(sound);
EmitSoundToAll(sound, client, SNDCHAN_AUTO, SNDLEVEL_SCREAMING);
}
new bool:esplash = GetConVarBool(gCvars[CVAR_INFECT_ESPLASH]);
if (esplash)
{
TE_SetupEnergySplash(clientloc, direction, true);
TE_SendToAll();
}
new explosion = CreateEntityByName("env_explosion");
if (explosion != -1)
{
new flags = GetEntProp(explosion, Prop_Data, "m_spawnflags");
flags = flags | EXP_NODAMAGE | EXP_NODECAL;
new bool:fireball = GetConVarBool(gCvars[CVAR_INFECT_FIREBALL]);
if (!fireball)
{
flags = flags | EXP_NOFIREBALL;
}
new bool:smoke = GetConVarBool(gCvars[CVAR_INFECT_SMOKE]);
if (!smoke)
{
flags = flags | EXP_NOSMOKE;
}
new bool:sparks = GetConVarBool(gCvars[CVAR_INFECT_SPARKS]);
if (!sparks)
{
flags = flags | EXP_NOSPARKS;
}
SetEntProp(explosion, Prop_Data, "m_spawnflags", flags);
DispatchSpawn(explosion);
PrecacheModel("materials/sprites/xfireball3.vmt");
DispatchKeyValueVector(explosion, "origin", clientloc);
DispatchKeyValue(explosion, "fireballsprite", "materials/sprites/xfireball3.vmt");
AcceptEntityInput(explosion, "Explode");
}
new bool:shake = GetConVarBool(gCvars[CVAR_INFECT_SHAKE]);
if (shake)
{
new Handle:hShake = StartMessageOne("Shake", client);
if (hShake != INVALID_HANDLE)
{
BfWriteByte(hShake, 0);
BfWriteFloat(hShake, GetConVarFloat(gCvars[CVAR_INFECT_SHAKE_AMP]));
BfWriteFloat(hShake, GetConVarFloat(gCvars[CVAR_INFECT_SHAKE_FREQUENCY]));
BfWriteFloat(hShake, GetConVarFloat(gCvars[CVAR_INFECT_SHAKE_DURATION]));
EndMessage();
}
}
}
ApplyZombieHealth(client, bool:mother)
{
new health = GetClassHealth(pClass[client]);
if (mother)
{
health *= 2;
}
SetEntityHealth(client, health);
}
ApplyZombieSpeed(client)
{
new Float:speed = GetClassSpeed(pClass[client]);
SetPlayerSpeed(client, speed);
}
ApplyZombieNightVision(client)
{
new bool:nvgs = GetClassNVGs(pClass[client]);
NightVision(client, nvgs);
NightVisionOn(client, nvgs);
}
ApplyZombieFOV(client)
{
new fov = GetClassFOV(pClass[client]);
SetPlayerFOV(client, fov);
}
KnockBack(client, const Float:clientloc[3], const Float:attackerloc[3], Float:power, dmg, bool:boost)
{
if (!IsPlayerZombie(client))
{
return;
}
new Float:vector[3];
MakeVectorFromPoints(attackerloc, clientloc, vector);
NormalizeVector(vector, vector);
vector[0] *= power * (float(dmg) * 1.5);
vector[1] *= power * (float(dmg) * 1.5);
vector[2] *= power * (float(dmg) * 1.5);
if (boost)
{
ScaleVector(vector, 4.0);
}
SetPlayerVelocity(client, vector);
}
JumpBoost(client, Float:distance, Float:height)
{
new Float:vel[3];
GetPlayerVelocity(client, vel);
vel[0] *= distance;
vel[1] *= distance;
vel[2] = height;
SetPlayerVelocity(client, vel);
}
PlayerLeft(client)
{
if (!IsClientInGame(client))
{
return;
}
new ZTeam:team = IsRoundOver();
if (team == Zombie)
{
RoundWin(team);
return;
}
if (!IsPlayerAlive(client) || !IsPlayerZombie(client))
{
return;
}
new zombiecount = GetZTeamCount(Zombie);
if (zombiecount > 1)
{
return;
}
new count = GetTeamClientCount(CS_TEAM_CT);
if (count <= 1)
{
return;
}
new Handle:aClients = CreateArray();
new maxplayers = GetMaxClients();
for (new x = 1; x <= maxplayers; x++)
{
if (!IsClientInGame(x) || !IsPlayerAlive(x) || client == x || GetClientTeam(x) != CS_TEAM_CT || gBlockMotherInfect[x])
{
continue;
}
PushArrayCell(aClients, x);
}
new size = GetArraySize(aClients);
if (!size)
{
return;
}
new randclient = GetArrayCell(aClients, GetRandomInt(0, size-1));
Zombify_Mother(randclient);
ZR_PrintToChat(randclient, "Zombie replacement");
CloseHandle(aClients);
}
GetZTeamCount(ZTeam:team)
{
new count = 0;
new maxplayers = GetMaxClients();
for (new x = 1; x <= maxplayers; x++)
{
if (!IsClientInGame(x) || !IsPlayerAlive(x))
{
continue;
}
new ZTeam:pTeam = GetPlayerZTeam(x);
if (pTeam == team)
{
count++;
}
}
return count;
}
ZTeam:IsRoundOver()
{
new bool:zombies = false;
new bool:humans = false;
new maxplayers = GetMaxClients();
for (new x = 1; x <= maxplayers; x++)
{
if (!IsClientInGame(x) || !IsPlayerAlive(x))
{
continue;
}
if (IsPlayerZombie(x))
{
zombies = true;
}
else
{
humans = true;
}
}
if (zombies && !humans)
{
return Zombie;
}
if (humans && !zombies)
{
if (zombieSpawned)
{
return Human;
}
}
return Neither;
}
RoundWin(ZTeam:team)
{
if (team == Human)
{
TerminateRound(5.0, CTs_PreventEscape);
}
else if (team == Zombie)
{
TerminateRound(5.0, Terrorists_Escaped);
}
}
BalanceTeams()
{
new count = 0;
new cPlayers[MAXPLAYERS];
new maxplayers = GetMaxClients();
for (new x = 1; x <= maxplayers; x++)
{
if (!IsClientInGame(x) || GetClientTeam(x) <= 1)
{
continue;
}
CS_SwitchTeam(x, CS_TEAM_T);
cPlayers[count++] = x;
}
for (new x = 0; x < count; x++)
{
if (!IsClientInGame(cPlayers[x]) || GetClientTeam(cPlayers[x]) <= 1)
{
continue;
}
CS_SwitchTeam(cPlayers[x], CS_TEAM_CT);
x++;
}
}
RemoveObjectives()
{
decl String:classname[64];
new maxentities = GetMaxEntities();
for (new x = 0; x <= maxentities; x++)
{
if(!IsValidEdict(x))
{
continue;
}
GetEdictClassname(x, classname, sizeof(classname));
if( StrEqual(classname, "func_bomb_target") ||
StrEqual(classname, "func_hostage_rescue") ||
StrEqual(classname, "c4") ||
StrEqual(classname, "hostage_entity"))
{
RemoveEdict(x);
}
}
}
AntiStick(attacker, client)
{
if (!attacker || !IsClientInGame(attacker))
{
return;
}
new Float:vector[3];
new Float:attackerloc[3];
new Float:clientloc[3];
GetClientAbsOrigin(attacker, attackerloc);
GetClientAbsOrigin(client, clientloc);
MakeVectorFromPoints(attackerloc, clientloc, vector);
NormalizeVector(vector, vector);
ScaleVector(vector, -160.0);
TeleportEntity(attacker, NULL_VECTOR, NULL_VECTOR, vector);
}
StartZVision(client)
{
if (tHandles[client][TZVISION] != INVALID_HANDLE)
{
CloseHandle(tHandles[client][TZVISION]);
}
new bool:zvision = ZVision(client);
if (zvision)
{
new Float:redisplay = GetConVarFloat(gCvars[CVAR_ZVISION_REDISPLAY]);
tHandles[client][TZVISION] = CreateTimer(redisplay, ZVisionTimer, client, TIMER_REPEAT);
}
}
StopZVision(client)
{
if (tHandles[client][TZVISION] != INVALID_HANDLE)
{
CloseHandle(tHandles[client][TZVISION]);
tHandles[client][TZVISION] = INVALID_HANDLE;
}
ClientCommand(client, "r_screenoverlay \"\"");
}
bool:ZVision(client)
{
if (IsFakeClient(client))
{
return false;
}
decl String:zvision[64];
GetClassZVision(pClass[client], zvision, sizeof(zvision));
if (zvision[0])
{
DisplayClientOverlay(client, zvision);
return true;
}
return false;
}
public Action:ZVisionTimer(Handle:timer, any:index)
{
if (!IsClientInGame(index) || !IsPlayerZombie(index))
{
tHandles[index][TZVISION] = INVALID_HANDLE;
return Plugin_Stop;
}
ZVision(index);
return Plugin_Continue;
}
ZombieMoan(client)
{
decl String:sound[64];
new randsound = GetRandomInt(1, 14);
Format(sound, sizeof(sound), "npc/zombie/zombie_voice_idle%d.wav", randsound);
PrecacheSound(sound);
EmitSoundToAll(sound, client, SNDCHAN_AUTO, SNDLEVEL_SCREAMING);
}
public Action:ZombieMoanTimer(Handle:timer, any:index)
{
if (!IsClientInGame(index) || !IsPlayerZombie(index))
{
tHandles[index][TMOAN] = INVALID_HANDLE;
return Plugin_Stop;
}
ZombieMoan(index);
return Plugin_Continue;
}
public Action:Regenerate(Handle:timer, any:index)
{
if (!IsClientInGame(index) || !IsPlayerZombie(index))
{
tHandles[index][TREGEN] = INVALID_HANDLE;
return Plugin_Stop;
}
new health = GetClassRegenHealth(pClass[index]);
new maxhealth = GetClassHealth(pClass[index]);
if (motherZombie[index])
{
maxhealth *= 2;
}
new newhealth = GetClientHealth(index) + health;
if (newhealth > maxhealth)
{
newhealth = maxhealth;
tHandles[index][TREGEN] = INVALID_HANDLE;
return Plugin_Stop;
}
SetEntityHealth(index, newhealth);
UpdateHPDisplay(index);
return Plugin_Continue;
}
UpdateHPDisplay(client)
{
new bool:zhp = GetConVarBool(gCvars[CVAR_ZHP]);
if (!zhp)
{
return;
}
if (!IsPlayerZombie(client) || !dispHP[client])
{
return;
}
new health = GetClientHealth(client);
if (health < 0)
{
health = 0;
}
ZR_HudHint(client, "Display HP", health);
}
public Action:ZHPTimer(Handle:timer, any:index)
{
if (!IsClientInGame(index))
{
tHandles[index][TZHP] = INVALID_HANDLE;
return Plugin_Stop;
}
UpdateHPDisplay(index);
return Plugin_Continue;
}
public Action:EndProtect(Handle:timer, any:index)
{
if (!IsClientInGame(index))
{
tHandles[index][TPROTECT] = INVALID_HANDLE;
return;
}
pProtect[index] = false;
if (IsPlayerHuman(index))
{
ZR_PrintCenterText(index, "Spawn protection end");
}
tHandles[index][TPROTECT] = INVALID_HANDLE;
}
RespawnPlayer(client)
{
if (!IsClientInGame(client))
{
return;
}
CS_RespawnPlayer(client);
if (!zombieSpawned)
{
return;
}
decl String:team[32];
GetConVarString(gCvars[CVAR_RESPAWN_TEAM], team, sizeof(team));
if (StrEqual(team, "zombie", false))
{
Zombify(client, 0);
}
}
public Action:RespawnTimer(Handle:timer, any:index)
{
new team = GetClientTeam(index);
if (!IsClientInGame(index) || IsPlayerAlive(index) || team != CS_TEAM_T && team != CS_TEAM_CT)
{
tHandles[index][TZHP] = INVALID_HANDLE;
return;
}
RespawnPlayer(index);
tHandles[index][TRESPAWN] = INVALID_HANDLE;
}
public Action:RoundOver(Handle:timer)
{
tRound = INVALID_HANDLE;
RoundWin(Human);
}
bool:IsPlayerZombie(client)
{
return gZombie[client];
}
bool:IsPlayerHuman(client)
{
return !gZombie[client];
}
ZTeam:GetPlayerZTeam(client)
{
if (IsPlayerZombie(client))
{
return Zombie;
}
return Human;
}

177
src/zr/zombiereloaded.inc Normal file
View File

@ -0,0 +1,177 @@
/**
* ====================
* Zombie:Reloaded
* File: zombiereloaded.inc
* Author: Greyscale
* ====================
*/
enum ZTeam
{
Neither, /** Round is not over */
Zombie, /** Round is over because zombies win */
Human, /** Round is over because humans wins */
}
#define Target_Bombed 1 // Target Successfully Bombed!
#define VIP_Escaped 2 // The VIP has escaped!
#define VIP_Assassinated 3 // VIP has been assassinated!
#define Terrorists_Escaped 4 // The terrorists have escaped!
#define CTs_PreventEscape 5 // The CT's have prevented most of the terrorists from escaping!
#define Escaping_Terrorists_Neutralized 6 // Escaping terrorists have all been neutralized!
#define Bomb_Defused 7 // The bomb has been defused!
#define CTs_Win 8 // Counter-Terrorists Win!
#define Terrorists_Win 9 // Terrorists Win!
#define Round_Draw 10 // Round Draw!
#define All_Hostages_Rescued 11 // All Hostages have been rescued!
#define Target_Saved 12 // Target has been saved!
#define Hostages_Not_Rescued 13 // Hostages have not been rescued!
#define Terrorists_Not_Escaped 14 // Terrorists have not escaped!
#define VIP_Not_Escaped 15 // VIP has not escaped!
#define Game_Commencing 16 // Game Commencing!
#define DXLEVEL_MIN 90
#define DEFAULT_FOV 90
new bool:market;
new dxLevel[MAXPLAYERS+1];
new bool:zombieSpawned;
new bool:motherZombie[MAXPLAYERS+1];
new bool:gZombie[MAXPLAYERS+1];
new bool:gBlockMotherInfect[MAXPLAYERS+1];
new bool:bZVision[MAXPLAYERS+1];
new bool:dispHP[MAXPLAYERS+1];
new bool:pProtect[MAXPLAYERS+1];
new pClass[MAXPLAYERS+1];
new pNextClass[MAXPLAYERS+1];
new teleCount[MAXPLAYERS+1];
new Float:spawnLoc[MAXPLAYERS+1][3];
new Handle:tRound = INVALID_HANDLE;
new Handle:tInfect = INVALID_HANDLE;
new Handle:pList = INVALID_HANDLE;
#define MAXTIMERS 7
#define TMOAN 0
#define TREGEN 1
#define TTELE 2
#define TZHP 3
#define TPROTECT 4
#define TRESPAWN 5
#define TZVISION 6
new Handle:tHandles[MAXPLAYERS+1][MAXTIMERS];
new QueryCookie:mat_dxlevel;
FindClientDXLevel(client)
{
if (IsFakeClient(client))
{
return;
}
mat_dxlevel = QueryClientConVar(client, "mat_dxlevel", DXLevelClientQuery);
}
public DXLevelClientQuery(QueryCookie:cookie, client, ConVarQueryResult:result, const String:cvarName[], const String:cvarValue[])
{
if (cookie != mat_dxlevel)
{
return;
}
dxLevel[client] = 0;
if (result != ConVarQuery_Okay)
{
return;
}
dxLevel[client] = StringToInt(cvarValue);
}
DisplayClientOverlay(client, const String:overlay[])
{
if (!dxLevel[client])
{
FindClientDXLevel(client);
return;
}
if (dxLevel[client] >= DXLEVEL_MIN)
{
ClientCommand(client, "r_screenoverlay \"%s\"", overlay);
}
else
{
ZR_PrintCenterText(client, "DX90 not supported", dxLevel[client], DXLEVEL_MIN);
}
}
RefreshList()
{
ClearList();
pList = CreateArray();
new maxplayers = GetMaxClients();
for (new x = 1; x <= maxplayers; x++)
{
if (IsClientInGame(x))
{
new team = GetClientTeam(x);
if (team == CS_TEAM_T || team == CS_TEAM_CT)
{
PushArrayCell(pList, x);
}
}
}
}
AddPlayerToList(client)
{
if (pList != INVALID_HANDLE)
{
PushArrayCell(pList, client);
}
}
ClearList()
{
if (pList != INVALID_HANDLE)
{
ClearArray(pList);
}
}
RandomPlayerFromList()
{
if (pList != INVALID_HANDLE)
{
new size = GetArraySize(pList);
new index = GetRandomInt(0, size - 1);
return GetArrayCell(pList, index);
}
return -1;
}
bool:IsPlayerInList(client)
{
if (pList != INVALID_HANDLE)
{
return (FindValueInArray(pList, client) != -1);
}
return false;
}