<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.alliedmods.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=DS</id>
	<title>AlliedModders Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.alliedmods.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=DS"/>
	<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/Special:Contributions/DS"/>
	<updated>2026-05-28T22:46:47Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.31.6</generator>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=SourceMod_Release_Notes&amp;diff=9594</id>
		<title>SourceMod Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=SourceMod_Release_Notes&amp;diff=9594"/>
		<updated>2014-06-12T05:27:50Z</updated>

		<summary type="html">&lt;p&gt;DS: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[SourceMod]] Release notes for each release:&lt;br /&gt;
&lt;br /&gt;
*[[SourceMod 1.5.3 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.5.2 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.5.1 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.5.0 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.4.7 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.4.6 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.4.5 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.4.4 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.4.3 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.4.2 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.4.1 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.4.0 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.3.8 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.3.7 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.3.6 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.3.5 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.3.4 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.3.3 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.3.2 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.3.1 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.3.0 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.2.4 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.2.3 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.2.2 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.2.1 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.2.0 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.1.2 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.1.1 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.1.0 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.0.4 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.0.3 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.0.2 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.0.1 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.0.0 Release Notes]]&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=AMBuild_API_(2.0)&amp;diff=9568</id>
		<title>AMBuild API (2.0)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=AMBuild_API_(2.0)&amp;diff=9568"/>
		<updated>2014-05-18T20:39:46Z</updated>

		<summary type="html">&lt;p&gt;DS: /* Attributes */ Add argv&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;AMBuild scripts have access to the following object types:&lt;br /&gt;
* '''Context''': Exposed as the &amp;lt;tt&amp;gt;builder&amp;lt;/tt&amp;gt;, this is the entry point for the API and is known as a ''configure context''.&lt;br /&gt;
* '''Entry''': Represents a node in the dependency graph.&lt;br /&gt;
* '''Compiler''': An abstraction representing a C++ compiler environment.&lt;br /&gt;
* '''BinaryBuilder''': An abstraction for building C++ compilation jobs.&lt;br /&gt;
&lt;br /&gt;
As a general rule, AMBuild uses the following conventions:&lt;br /&gt;
* Methods starting with an upper-case letter are considered public API.&lt;br /&gt;
* Methods starting with a lower-case letter are considered private and should not be used. There are a few exceptions for brevity or accessor-like functions.&lt;br /&gt;
* Properties and attributes ending with an underscore are considered private and should not be used.&lt;br /&gt;
* Spaces are used instead of tabs, and two-space indents are preferred.&lt;br /&gt;
&lt;br /&gt;
=Contexts=&lt;br /&gt;
&lt;br /&gt;
Contexts are implemented in &amp;lt;tt&amp;gt;ambuild2/frontend/base_gen.py&amp;lt;/tt&amp;gt;. They are the entry point for using AMBuild.&lt;br /&gt;
&lt;br /&gt;
When using path strings, it is important to note how AMBuild recognizes paths.&lt;br /&gt;
* ''source'' path strings may be any absolute path in the file system, as long as that path is not within the build folder. Source paths may also be expressed as relative to &amp;lt;tt&amp;gt;builder.currentSourcePath&amp;lt;/tt&amp;gt;, which is the source folder of the currently executing build script.&lt;br /&gt;
* ''output'' path strings are always relative to &amp;lt;tt&amp;gt;builder.buildFolder&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Attributes==&lt;br /&gt;
* ''compiler'' - An instance of a &amp;lt;tt&amp;gt;Compiler&amp;lt;/tt&amp;gt; object, or &amp;lt;tt&amp;gt;None&amp;lt;/tt&amp;gt; if &amp;lt;tt&amp;gt;DetectCompilers&amp;lt;/tt&amp;gt; was never called. Calling &amp;lt;tt&amp;gt;DetectCompilers&amp;lt;/tt&amp;gt; will set the &amp;lt;tt&amp;gt;compiler&amp;lt;/tt&amp;gt; field for this and all future contexts. Each context gets a clone of its parent's compiler, so it is safe to modify compilers in inner scripts.&lt;br /&gt;
* ''parent'' - The context that loaded the current context.&lt;br /&gt;
* ''script'' - The path, relative to &amp;lt;tt&amp;gt;sourcePath&amp;lt;/tt&amp;gt;, of the current build script.&lt;br /&gt;
* ''sourcePath'' - The absolute path to the source tree.&lt;br /&gt;
* ''options'' - The result of evaluating command-line options from &amp;lt;tt&amp;gt;configure.py&amp;lt;/tt&amp;gt;, via the &amp;lt;tt&amp;gt;optparse&amp;lt;/tt&amp;gt; module.&lt;br /&gt;
* ''buildPath'' - The absolute path to the build folder.&lt;br /&gt;
* ''buildFolder'' - The working directory of jobs in this context, relative to &amp;lt;tt&amp;gt;buildPath&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* ''localFolder'' - The &amp;lt;tt&amp;gt;Entry&amp;lt;/tt&amp;gt; for &amp;lt;tt&amp;gt;buildFolder&amp;lt;/tt&amp;gt;; &amp;lt;tt&amp;gt;None&amp;lt;/tt&amp;gt; for the root of the build.&lt;br /&gt;
* ''currentSourcePath'' - The source folder that the current build script is in.&lt;br /&gt;
* ''target_platform'' - The platform name that the build is targeting (see [[#Platforms]]).&lt;br /&gt;
* ''host_platform'' - The platform name that the build is being generated on (see [[#Platforms]]).&lt;br /&gt;
* ''originalCwd'' - The working directory that was set when the user first configured the build. This is useful when constructing absolute paths from user inputs that contain relative paths.&lt;br /&gt;
&lt;br /&gt;
==Methods==&lt;br /&gt;
* ''SetBuildFolder(folder)'' - Sets the working directory of jobs in this context, relative to &amp;lt;tt&amp;gt;buildPath&amp;lt;/tt&amp;gt;.&lt;br /&gt;
** ''folder'' - A string representing the folder path. '.' and './' are allowed.&lt;br /&gt;
** Returns &amp;lt;tt&amp;gt;None&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* ''DetectCompilers()'' - Detects C and C++ compilers and raises an exception if neither are available or they do not match. Should only be called once.&lt;br /&gt;
** Returns a &amp;lt;tt&amp;gt;Compiler&amp;lt;/tt&amp;gt; object that is also accessible via the &amp;lt;tt&amp;gt;compiler&amp;lt;/tt&amp;gt; attribute.&lt;br /&gt;
* ''RunScript(files, vars={})'' - Runs one additional build script.&lt;br /&gt;
** ''file'' - A string containing a file path, relative to the current script's path.&lt;br /&gt;
** ''vars'' - An optional dictionary of global variables to set in each child build script. The dictionary is merged with the global variables passed into our current script. Variables with the same name are overridden by the new dictionary.&lt;br /&gt;
** Returns the global variable &amp;lt;tt&amp;gt;rvalue&amp;lt;/tt&amp;gt; if set in the child script; otherwise, returns &amp;lt;tt&amp;gt;None&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* ''RunBuildScripts(files, vars={})'' - Runs additional build scripts.&lt;br /&gt;
** ''files'' - An iterable containing a list of file paths relative to path of the current build script, or a string containing such a path.&lt;br /&gt;
** ''vars'' - An optional dictionary of global variables to set in each child build script. The dictionary is merged with the global variables passed into our current script. Variables with the same name are overridden by the new dictionary.&lt;br /&gt;
** Returns &amp;lt;tt&amp;gt;None&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* ''Add(taskbuilder)'' - Some jobs are too complex to use a single API call, and instead provide objects to assist in creation. These objects are finalized into the dependency graph with this function. Currently, the only complex jobs built-in are C/C++ compilation jobs.&lt;br /&gt;
** ''taskbuilder'' - The job builder instance.&lt;br /&gt;
** Returns a value based on the taskbuilder. For example, C++ objects return a 'CppNode' described under the Compiler section.&lt;br /&gt;
* ''AddFolder(folder)'' - Ensures that a folder is created when performing a build. The folder is created relative to the context's local build folder.&lt;br /&gt;
** ''folder'' - A relative path specifying the folder. Folder chains can be created all at once; i.e. 'a/b/c' is a valid target even if 'a' or 'a/b' do not exist.&lt;br /&gt;
** Returns an &amp;lt;tt&amp;gt;Entry&amp;lt;/tt&amp;gt; instance describing the folder creation node.&lt;br /&gt;
* ''AddSymlink(source, output_path)'' - Adds a job to the build that will perform a symlink. On systems where symlinks are not available, it is implemented as a copy.&lt;br /&gt;
* ''AddCopy(source, output_path)'' - Adds a job to the build that will perform a file copy.&lt;br /&gt;
** ''source'' - Either a string containing a source file path, or a source node, or an output node, representing the file that will be the source of the operation.&lt;br /&gt;
** ''output_path'' - One of the following:&lt;br /&gt;
*** A string path ending in a path separator, or &amp;lt;tt&amp;gt;'.'&amp;lt;/tt&amp;gt;, specifying the folder to copy or symlink the file to. It is relative to the context's local build folder.&lt;br /&gt;
*** A string path ending in a filename, representing the destination file of the operation. It is relative to the context's local build folder.&lt;br /&gt;
*** A folder node created via &amp;lt;tt&amp;gt;AddFolder()&amp;lt;/tt&amp;gt;, representing the folder to copy or symlink the file to. In this case, the folder node's path is taken as-is and is not relative to the local build folder.&lt;br /&gt;
** See &amp;lt;tt&amp;gt;AddCommand&amp;lt;/tt&amp;gt; for return values.&lt;br /&gt;
* ''AddCommand(inputs, argv, outputs, folder?, dep_type?, weak_inputs?, shared_outputs?)'' - Adds a custom command that will be executed manually. The working directory of the command is the context's local build folder. As created, the command has no dependencies. If it has source dependencies they can be specified via &amp;lt;tt&amp;gt;AddDependency&amp;lt;/tt&amp;gt;.&lt;br /&gt;
** ''inputs'' - An iterable containing source file paths and/or &amp;lt;tt&amp;gt;Entry&amp;lt;/tt&amp;gt; output-file nodes that are incoming dependencies.&lt;br /&gt;
** ''argv'' - The argument vector that will be passed to &amp;lt;tt&amp;gt;subprocess.Popen&amp;lt;/tt&amp;gt;. &amp;lt;tt&amp;gt;argv[0]&amp;lt;/tt&amp;gt; should be the executable.&lt;br /&gt;
** ''outputs'' - An iterable containing files that are outputs of this command. Each file must be a relative path from the context's local build folder.&lt;br /&gt;
** ''folder'' - The working directory for the command. By default, this is &amp;lt;tt&amp;gt;buildFolder&amp;lt;/tt&amp;gt;. It can be &amp;lt;tt&amp;gt;None&amp;lt;/tt&amp;gt; to specify the root of the build. Otherwise, it must be an &amp;lt;tt&amp;gt;Entry&amp;lt;/tt&amp;gt; from calling &amp;lt;tt&amp;gt;AddFolder&amp;lt;/tt&amp;gt; or reading &amp;lt;tt&amp;gt;localFolder&amp;lt;/tt&amp;gt;.&lt;br /&gt;
** ''dep_type'' - Specifies whether the output of the command contains a dependency list. The following three values are supported:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;None&amp;lt;/tt&amp;gt; - (default) This command does not support dependency discovery or does not have dynamic dependencies.&lt;br /&gt;
*** &amp;lt;tt&amp;gt;'msvc'&amp;lt;/tt&amp;gt; - Dependencies are spewed in the exact manner of the Visual Studio C++ compiler, in &amp;lt;tt&amp;gt;stdout&amp;lt;/tt&amp;gt;.&lt;br /&gt;
*** &amp;lt;tt&amp;gt;'gcc'&amp;lt;/tt&amp;gt; - Dependencies are spewed in the exact manner of the GNU C Compiler or Clang, in &amp;lt;tt&amp;gt;stderr&amp;lt;/tt&amp;gt;.&lt;br /&gt;
*** &amp;lt;tt&amp;gt;'sun'&amp;lt;/tt&amp;gt; - Dependencies are spewed in the exact manner of the Sun Pro compiler, in &amp;lt;tt&amp;gt;stderr&amp;lt;/tt&amp;gt;.&lt;br /&gt;
** ''weak_inputs'' - Optional list of weak dependencies. Weak dependencies enforce an ordering between two commands, but an update only occurs if the command is discovered to actually use the dependency (see the Compiler.sourcedeps attribute).&lt;br /&gt;
** ''shared_outputs'' - Optional list of &amp;quot;shared&amp;quot; outputs. Shared outputs are files that are generated by multiple commands. This is a degenerate case in AMBuild, but some systems do this, and AMBuild needs to understand where the files came from. Shared outputs can not be used as an input; they do not participate in the dependency system, except that AMBuild knows when to remove them.&lt;br /&gt;
** Returns a 2-tuple, containing:&lt;br /&gt;
*** An &amp;lt;tt&amp;gt;Entry&amp;lt;/tt&amp;gt; instance representing the node for this command in the dependency graph.&lt;br /&gt;
*** A list of &amp;lt;tt&amp;gt;Entry&amp;lt;/tt&amp;gt; instances, each instance corresponding to one of the output file paths specified.&lt;br /&gt;
* ''AddConfigureFile(path)'' - Adds a source path that will trigger automatic reconfiguring if the file changes. This is useful for files that are conceptually part of a build script, but are not actually loaded as a build script.&lt;br /&gt;
** ''path'' - A source path.&lt;br /&gt;
&lt;br /&gt;
==Platforms==&lt;br /&gt;
AMBuild will use one of the following as a platform string:&lt;br /&gt;
* &amp;lt;tt&amp;gt;&amp;quot;windows&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;&amp;quot;mac&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;&amp;quot;linux&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;&amp;quot;freebsd&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;&amp;quot;openbsd&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;&amp;quot;netbsd&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;&amp;quot;solaris&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;&amp;quot;cygwin&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Entry=&lt;br /&gt;
&amp;lt;tt&amp;gt;Entry&amp;lt;/tt&amp;gt; objects are considered mostly opaque. However, all frontends must define at least these attributes:&lt;br /&gt;
* ''path'' - A file system path that uniquely represents nodes that are present in the filesystem, such as source files, output files, or folders.&lt;br /&gt;
&lt;br /&gt;
=Compiler=&lt;br /&gt;
Compiler objects encapsulate information about invoking the C or C++ compiler. Most of its attributes are lists of options, so it is best to use += to extend these lists, to avoid replacing previously set options.&lt;br /&gt;
&lt;br /&gt;
Whenever options come in pairs - for example, C/C++ flags versus C++-only flags, C++ flags will automatically include all C flags during compilation time.&lt;br /&gt;
&lt;br /&gt;
==Attributes==&lt;br /&gt;
* ''includes'' - List of C and C++ include paths&lt;br /&gt;
* ''cxxincludes'' - List of C++ include paths.&lt;br /&gt;
* ''cflags'' - List of C and C++ compiler flags.&lt;br /&gt;
* ''cxxflags'' - List of C++ compiler flags.&lt;br /&gt;
* ''defines'' - List of C and C++ #defines, in the form of 'KEY' or 'KEY=VALUE'&lt;br /&gt;
* ''cxxdefines'' - List of C++ #defines, in the form of 'KEY' or 'KEY=VALUE'&lt;br /&gt;
* ''rcdefines'' - List of RC (Resource Compiler) #defines, in the form of 'KEY' or 'KEY=VALUE'&lt;br /&gt;
* ''linkflags'' - Link flags (see below).&lt;br /&gt;
* ''postlink'' - Array of objects to link, added to the linker flags after linkflags. See below.&lt;br /&gt;
* ''sourcedeps'' - An array of output nodes which should be weak dependencies on each source compilation node.&lt;br /&gt;
* ''debuginfo'' - One of three values:&lt;br /&gt;
**&amp;lt;tt&amp;gt;None&amp;lt;/tt&amp;gt; - No debug information is generated.&lt;br /&gt;
**&amp;lt;tt&amp;gt;'bundled'&amp;lt;/tt&amp;gt; - If possible, debug information will be generated into the binary. On some compilers this is not possible. For example, MSVC always generates .PDB files.&lt;br /&gt;
**&amp;lt;tt&amp;gt;'separate'&amp;lt;/tt&amp;gt; - Separates debug information into a separate file (a .pdb file, .sym file, or dSYM package depending on the platform).&lt;br /&gt;
* ''vendor'' - The vendor string for the detected compiler ('msvc', 'gcc', 'icc', 'clang', or 'sun'). This attribute is read-only.&lt;br /&gt;
* ''version'' - Returns an object representing the compiler version. It may be stringified with &amp;lt;tt&amp;gt;str()&amp;lt;/tt&amp;gt;. It can also be compared to either integers, other version objects, or strings. For example: &amp;lt;tt&amp;gt;compiler.version &amp;gt;= '4.7.4'&amp;lt;/tt&amp;gt; will return true if the compiler's version is at least &amp;lt;tt&amp;gt;4.7.3&amp;lt;/tt&amp;gt;. The exact meaning of the version is vendor-dependent; for example, MSVC versions look like large numbers (&amp;lt;tt&amp;gt;1800&amp;lt;/tt&amp;gt; corresponds to Visual Studio 2013).&lt;br /&gt;
* ''argv'' - Returns a list containing the program name and arguments used to invoke the detected compiler. Note that availability of this is frontend-dependent. It is currently only exposed for the AMBuild 2 frontend.&lt;br /&gt;
&lt;br /&gt;
Entries to &amp;lt;tt&amp;gt;linkflags&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;postlink&amp;lt;/tt&amp;gt; can be:&lt;br /&gt;
* A string representing a linker flag.&lt;br /&gt;
* An &amp;lt;tt&amp;gt;Entry&amp;lt;/tt&amp;gt; object.&lt;br /&gt;
* A &amp;lt;tt&amp;gt;Dep&amp;lt;/tt&amp;gt; object. &amp;lt;tt&amp;gt;Dep&amp;lt;/tt&amp;gt; objects are useful when precise control is needed over what text is given to the linker in order to link in a file. Essentially, they let you customize the link flag while still including a dependency. They also allow lazy computation of dependencies, since sometimes extra steps must be generated before linking to an object. &amp;lt;tt&amp;gt;Dep&amp;lt;/tt&amp;gt; objects have two attributes:&lt;br /&gt;
** &amp;lt;tt&amp;gt;text&amp;lt;/tt&amp;gt;, the text that will be passed to the linker when constructing its argument list.&lt;br /&gt;
** &amp;lt;tt&amp;gt;node&amp;lt;/tt&amp;gt;, an object which tells AMBuild how to build a dependency for the linker flag. It can be:&lt;br /&gt;
*** &amp;lt;tt&amp;gt;None&amp;lt;/tt&amp;gt;, meaning that the text is a file path.&lt;br /&gt;
*** A file path.&lt;br /&gt;
*** An &amp;lt;tt&amp;gt;Entry&amp;lt;/tt&amp;gt; or list of &amp;lt;tt&amp;gt;Entry&amp;lt;/tt&amp;gt; objects representing the output files of a command, or&lt;br /&gt;
*** A function which returns the above, and has the signature &amp;lt;tt&amp;gt;(builder, binary)&amp;lt;/tt&amp;gt;, receiving a &amp;lt;tt&amp;gt;Context&amp;lt;/tt&amp;gt; object and a &amp;lt;tt&amp;gt;BinaryBuilder&amp;lt;/tt&amp;gt; object.&lt;br /&gt;
* ''Note:'' AMBuild does not currently support automatic dependency generation for &amp;lt;tt&amp;gt;-L&amp;lt;/tt&amp;gt; style linking.&lt;br /&gt;
&lt;br /&gt;
For example, to generate a linker invocation like &amp;quot;&amp;lt;tt&amp;gt;g++ main.o tier1.so -o main&amp;lt;/tt&amp;gt;&amp;quot;, where &amp;lt;tt&amp;gt;tier1.so&amp;lt;/tt&amp;gt; is a generated file, you could do:&lt;br /&gt;
&amp;lt;Python&amp;gt;&lt;br /&gt;
binary.postlink += [binary.Dep('tier1.so', tier1_so_entry)]&lt;br /&gt;
&amp;lt;/Python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this requires symlinking &amp;lt;tt&amp;gt;tier1.so&amp;lt;/tt&amp;gt; to be in the local folder, you can get more complex, such as:&lt;br /&gt;
&amp;lt;Python&amp;gt;&lt;br /&gt;
def make_linker_dep(compiler, name, entry):&lt;br /&gt;
  def lazy_dep(builder, binary):&lt;br /&gt;
    cmd, (output,) = builder.AddSymlink(entry, '.')&lt;br /&gt;
    return output&lt;br /&gt;
  return compiler.Dep(name, lazy_dep)&lt;br /&gt;
&amp;lt;/Python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Methods==&lt;br /&gt;
* &amp;lt;tt&amp;gt;Dep(text, node)&amp;lt;/tt&amp;gt; - Creates a &amp;lt;tt&amp;gt;Dep&amp;lt;/tt&amp;gt; object instance (see above for more details).&lt;br /&gt;
* &amp;lt;tt&amp;gt;Program(name)&amp;lt;/tt&amp;gt; - Creates a new &amp;lt;tt&amp;gt;BinaryBuilder&amp;lt;/tt&amp;gt; instance, with a copy of the compiler settings. The builder is configured to generate an executable (&amp;lt;tt&amp;gt;.exe&amp;lt;/tt&amp;gt; is automatically appended on Windows).&lt;br /&gt;
* &amp;lt;tt&amp;gt;Library(name)&amp;lt;/tt&amp;gt; - Creates a new &amp;lt;tt&amp;gt;BinaryBuilder&amp;lt;/tt&amp;gt; instance, with a copy of the compiler settings. The builder is configured to generate a shared library. &amp;lt;tt&amp;gt;.so&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;.dylib&amp;lt;/tt&amp;gt;, or &amp;lt;tt&amp;gt;.dll&amp;lt;/tt&amp;gt; is automatically appended depending on the platform. Nothing is ever prepended to the name.&lt;br /&gt;
* &amp;lt;tt&amp;gt;StaticLibrary(name)&amp;lt;/tt&amp;gt; - Creates a new &amp;lt;tt&amp;gt;BinaryBuilder&amp;lt;/tt&amp;gt; instance, with a copy of the compiler settings. The builder is configured to generate a static library. &amp;lt;tt&amp;gt;.a&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;.lib&amp;lt;/tt&amp;gt; is automatically appended depending on the platform. Nothing is ever prepended to the name.&lt;br /&gt;
* &amp;lt;tt&amp;gt;like(name)&amp;lt;/tt&amp;gt; - Returns whether the compiler is &amp;quot;like&amp;quot; another compiler. This is intended to represent the compatibility hierarchy of modern compilers. For example:&lt;br /&gt;
** Visual Studio is &amp;quot;like&amp;quot; 'msvc'.&lt;br /&gt;
** GCC is &amp;quot;like&amp;quot; 'gcc'.&lt;br /&gt;
** Clang is &amp;quot;like&amp;quot; 'gcc'.&lt;br /&gt;
** Note that GCC is not &amp;quot;like&amp;quot; Clang.&lt;br /&gt;
&lt;br /&gt;
=BinaryBuilder=&lt;br /&gt;
&amp;lt;tt&amp;gt;BinaryBuilder&amp;lt;/tt&amp;gt; assists in creating C/C++ compilation tasks. Once you've set all the information needed, they are integrated into the dependency graph by using &amp;lt;tt&amp;gt;builder.Add()&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Attributes==&lt;br /&gt;
* ''compiler'' - A full copy of the compiler settings used when instantiating this &amp;lt;tt&amp;gt;BinaryBuilder&amp;lt;/tt&amp;gt;. Modifying this compiler will not modify the original &amp;lt;tt&amp;gt;builder.compiler&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* ''sources'' - An (initially empty) list of C/C++ source file paths. They can be absolute paths, or paths relative to &amp;lt;tt&amp;gt;currentSourcePath&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* ''localFolder'' - The name of the folder this binary will be generated in, relative to the &amp;lt;tt&amp;gt;buildFolder&amp;lt;/tt&amp;gt; of the context that adds the tasks.&lt;br /&gt;
&lt;br /&gt;
==Methods==&lt;br /&gt;
* ''Dep(text, node)'' - A wrapper for &amp;lt;tt&amp;gt;compiler.Dep&amp;lt;/tt&amp;gt;.&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Building_AMX_Mod_X&amp;diff=9521</id>
		<title>Building AMX Mod X</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Building_AMX_Mod_X&amp;diff=9521"/>
		<updated>2014-03-18T12:26:12Z</updated>

		<summary type="html">&lt;p&gt;DS: /* Mac OS X */ Add special instructions for installing the command line tools on OS X 10.9.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;AMX Mod X is a large project, but we've tried to make it as easy to build as possible. The directions here will step you through the entire process.&lt;br /&gt;
&lt;br /&gt;
=Requirements=&lt;br /&gt;
&lt;br /&gt;
==Windows==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Install Visual Studio or Visual C++ 2010 or higher. Express editions should work fine. If you use 2013 or higher, make sure to get the &amp;quot;Desktop&amp;quot; version: [http://www.visualstudio.com/downloads/download-visual-studio-vs#d-express-windows-desktop Visual Studio Express 2013 for Desktop].&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Install [http://git-scm.com/ Git]. Make sure that you select the option that adds Git to PATH.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Next, you will need to start an environment capable of running Python and interacting with the Visual Studio compiler. There are two ways to do this.&lt;br /&gt;
 &amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;Use [https://wiki.mozilla.org/MozillaBuild MozillaBuild]. MozillaBuild comes with Python, Mercurial, and a unix-like shell.&lt;br /&gt;
   &amp;lt;ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Install MozillaBuild.&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Navigate to &amp;lt;tt&amp;gt;C:\mozilla-build&amp;lt;/tt&amp;gt; and run the batch file corresponding to your Visual Studio version. For example, &amp;lt;tt&amp;gt;start-msvc10.bat&amp;lt;/tt&amp;gt; for Visual Studio 2010 (10.0). Do not run an x64 version.&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Add Git to MozillaBuild's &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt;. The easiest way to do this is to enter the following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &amp;quot;export PATH=\$PATH:/c/Program\ Files\ \(x86\)/Git/bin&amp;quot; &amp;gt;&amp;gt; ~/.profile&lt;br /&gt;
source ~/.profile&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
    &amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;/ol&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;Or, you can manually set up a shell.&lt;br /&gt;
   &amp;lt;ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Install [http://mercurial.selenic.com/ Mercurial].&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Install [http://python.org/ Python] 2.7. It will install to C:\Python27 by default. (Version 3.4 will work, but is not recommended for compatibility with other tools).&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Add Python to your &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt; variable. Go to Control Panel, System, Advanced, Environment Variables. Add &amp;lt;tt&amp;gt;C:\Python27;C:\Python27\Scripts&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt; (or wherever your Python install is).&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Under Start, Programs, Microsoft Visual Studio, select the &amp;quot;Visual Studio Tools&amp;quot; folder and run &amp;quot;Visual Studio Command Prompt&amp;quot;. Alternately, open a normal command prompt and run &amp;lt;tt&amp;gt;&amp;quot;C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\vcvars.bat&amp;quot;&amp;lt;/tt&amp;gt;. Substitute your Visual Studio version if needed.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;/ol&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that AMX Mod X also has Visual Studio project files. These can be used for local development, however, they are not maintained nor are they used for official builds.&lt;br /&gt;
&lt;br /&gt;
==Linux==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Install Git, via either system packages or from the [http://git-scm.com/ Git] distribution.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Install Mercurial, via either system packages or the [http://mercurial.selenic.com/ Mercurial] distribution.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Install either the GNU C Compiler or the Clang compiler. On Debian/Ubuntu, the following commands will give you everything:&lt;br /&gt;
  &amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install gcc g++ clang&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;If building on a 64-bit system, a few additional packages may be required. For example on Debian/Ubuntu they are:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install ia32-libs&lt;br /&gt;
sudo apt-get install lib32z1 lib32z1-dev&lt;br /&gt;
sudo apt-get install libc6-dev-i386 libc6-i386&lt;br /&gt;
sudo apt-get install gcc-multilib g++-multilib&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Mac OS X==&lt;br /&gt;
Mac OS X 10.7 or higher is required to build, however, AMX Mod X will work on versions as early as 10.5.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Install Mercurial if you do not have it - there are a few ways to do this. Using the [http://mercurial.selenic.com/ Mercurial] distribution will work, or you can use [http://www.macports.org/ macports] or [http://brew.sh/ homebrew].&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Install the Xcode Command Line Tools.&lt;br /&gt;
  &amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;For OS X 10.9 or higher, run the command below in Terminal and click the Install button in the window that appears.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xcode-select --install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
    &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;For earlier versions of OS X, download and install Xcode from the App Store. Launch Xcode and then navigate to Preferences -&amp;gt; Downloads -&amp;gt; Components -&amp;gt; Command Line Tools -&amp;gt; Install. If you have recently upgraded Xcode, you will need to perform this step again. AMX Mod X cannot build without Xcode's command line tools.&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Dependencies=&lt;br /&gt;
Building AMX Mod X requires AMBuild, Metamod, the Half-Life SDK, and optionally MySQL 5. If you're using Linux, OS X, or Windows with MozillaBuild, you download and run the following script to get everything:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://raw2.github.com/alliedmodders/amxmodx/master/support/checkout-deps.sh&lt;br /&gt;
bash checkout-deps.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will download everything required into &amp;lt;tt&amp;gt;amxmodx&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;hlsdk&amp;lt;/tt&amp;gt;, and &amp;lt;tt&amp;gt;metamod-am&amp;lt;/tt&amp;gt;. If AMBuild is not installed, it will also download it into &amp;lt;tt&amp;gt;ambuild&amp;lt;/tt&amp;gt;, and prompt you for your password to install it.&lt;br /&gt;
&lt;br /&gt;
If for some reason this script doesn't work, or you can't use it, you can get AMX Mod X and its dependencies like so:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hg clone http://hg.alliedmods.net/ambuild&lt;br /&gt;
hg clone http://hg.alliedmods.net/metamod-am&lt;br /&gt;
hg clone http://hg.alliedmods.net/hl2sdks/hlsdk&lt;br /&gt;
git clone https://github.com/alliedmodders/amxmodx&lt;br /&gt;
cd ambuild&lt;br /&gt;
python setup.py install     # May need sudo or root on Linux/OS X&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Configuring=&lt;br /&gt;
&lt;br /&gt;
The first time you are building AMX Mod X, you must ''configure'' the build. First create a build folder, and then run &amp;lt;tt&amp;gt;configure.py&amp;lt;/tt&amp;gt;. For example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir build&lt;br /&gt;
cd build&lt;br /&gt;
python ../amxmodx/configure.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is safe to reconfigure over an old build. However, it's probably a bad idea to configure inside a random, non-empty folder.&lt;br /&gt;
&lt;br /&gt;
There are a few extra options you can pass to &amp;lt;tt&amp;gt;configure&amp;lt;/tt&amp;gt;:&lt;br /&gt;
*--enable-debug - Compile with symbols and debug checks/assertions.&lt;br /&gt;
*--enable-optimize - Compile with optimizations.&lt;br /&gt;
*--no-mysql - If you didn't install MySQL, you can choose not to build the extension.&lt;br /&gt;
&lt;br /&gt;
=Building=&lt;br /&gt;
&lt;br /&gt;
To build AMX Mod X, simply navigate to your build folder and type &amp;lt;tt&amp;gt;ambuild&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd build&lt;br /&gt;
ambuild&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternately, you can specify the path of the build folder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ambuild build&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The full package layouts that would be shipped for release are in the &amp;lt;tt&amp;gt;package&amp;lt;/tt&amp;gt; folder of the build.&lt;br /&gt;
&lt;br /&gt;
[[Category:Documentation (AMX Mod X)]]&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Building_SourceMod&amp;diff=9520</id>
		<title>Building SourceMod</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Building_SourceMod&amp;diff=9520"/>
		<updated>2014-03-18T12:20:21Z</updated>

		<summary type="html">&lt;p&gt;DS: /* Mac OS X */ Add special instructions for installing the command line tools on OS X 10.9.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Compiling SourceMod is not difficult, but requires a number of prerequisites.  This article details the requirements and steps to being able to build working SourceMod binaries.&lt;br /&gt;
&lt;br /&gt;
Note that specific compiler versions are required to maintain ABI compatibility with Source engine binaries.&lt;br /&gt;
&lt;br /&gt;
=Requirements=&lt;br /&gt;
&lt;br /&gt;
==Windows==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;You need one of the following Visual Studio versions:&lt;br /&gt;
  &amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Microsoft Visual C++ 2012 (Express or higher) will work for some games; notably, not Dota 2.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Microsoft Visual C++ 2010 (Express or higher) is supported and used for official builds.&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;/ul&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Next, you will need to start an environment capable of running Python, Mercurial, and interacting with the Visual Studio compiler. There are two ways to do this.&lt;br /&gt;
  &amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Recommended: Use [https://wiki.mozilla.org/MozillaBuild MozillaBuild]. MozillaBuild comes with Python, Mercurial, and a unix-like shell.&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
     &amp;lt;li&amp;gt;Install MozillaBuild.&amp;lt;/li&amp;gt;&lt;br /&gt;
     &amp;lt;li&amp;gt;Navigate to &amp;lt;tt&amp;gt;C:\mozilla-build&amp;lt;/tt&amp;gt; and run the batch file corresponding to your Visual Studio version. For example, &amp;lt;tt&amp;gt;start-msvc10.bat&amp;lt;/tt&amp;gt; for Visual Studio 2010 (10.0). Do not run an x64 version.&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
   &amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Or, you can manually set up a shell.&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
     &amp;lt;li&amp;gt;Install [http://mercurial.selenic.com/ Mercurial].&amp;lt;/li&amp;gt;&lt;br /&gt;
     &amp;lt;li&amp;gt;Add Python to your &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt; variable. Go to Control Panel, System, Advanced, Environment Variables. Add &amp;lt;tt&amp;gt;C:\Python27;C:\Python27\Scripts&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt; (or wherever your Python install is).&amp;lt;/li&amp;gt;&lt;br /&gt;
     &amp;lt;li&amp;gt;Under Start, Programs, Microsoft Visual Studio, select the &amp;quot;Visual Studio Tools&amp;quot; folder and run &amp;quot;Visual Studio Command Prompt&amp;quot;. Alternately, open a normal command prompt and run &amp;lt;tt&amp;gt;&amp;quot;C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\vcvars.bat&amp;quot;&amp;lt;/tt&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
   &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;/ul&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Linux==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Install Mercurial, via either system packages or the [http://mercurial.selenic.com/ Mercurial] distribution.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Install either the GNU C Compiler or the Clang compiler.&lt;br /&gt;
  &amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;For GCC, 4.4 or higher is required. On Debian/Ubuntu-based systems, the commands below will install GCC (the second set of packages is required for building on 64-bit systems).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install gcc g++&lt;br /&gt;
sudo apt-get install gcc-multilib g++-multilib&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
   &amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;For Clang, 3.2 or higher is required. On Debian/Ubuntu-based systems, the packages needed are:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install clang&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
   &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;/ul&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;If building on a 64-bit system, a few additional packages may be required. For example on Debian/Ubuntu they are:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install ia32-libs&lt;br /&gt;
sudo apt-get install lib32z1 lib32z1-dev&lt;br /&gt;
sudo apt-get install libc6-dev-i386 libc6-i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Mac OS X==&lt;br /&gt;
Mac OS X 10.7 or higher is required to build, however, SourceMod will work on 10.5. SourceMod will neither build nor run on older PPC Macs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Install Mercurial if you do not have it - there are a few ways to do this. Using the [http://mercurial.selenic.com/ Mercurial] distribution will work, or you can use [http://www.macports.org/ macports] or [http://brew.sh/ homebrew].&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Install the Xcode Command Line Tools.&lt;br /&gt;
  &amp;lt;ul&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;For OS X 10.9 or higher, run the command below in Terminal and click the Install button in the window that appears.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xcode-select --install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
    &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;For earlier versions of OS X, download and install Xcode from the App Store. Launch Xcode and then navigate to Preferences -&amp;gt; Downloads -&amp;gt; Components -&amp;gt; Command Line Tools -&amp;gt; Install. If you have recently upgraded Xcode, you will need to perform this step again. SourceMod cannot build without Xcode's command line tools.&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Source and Dependencies=&lt;br /&gt;
&lt;br /&gt;
First, grab the SourceMod source tree. We recommend placing it inside its own folder, since we'll also need to download its dependencies.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p alliedmodders&lt;br /&gt;
cd alliedmodders&lt;br /&gt;
hg clone https://hg.alliedmods.net/sourcemod-central&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, run the &amp;lt;tt&amp;gt;checkout-deps.sh&amp;lt;/tt&amp;gt; script. This will download all dependencies and attempt to install AMBuild. If you are using Linux or OS X, it may prompt you for your sudo password at the very end. If you want to skip this and install AMBuild manually, just Ctrl+C. (Do not run the checkout script with sudo.)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bash sourcemod-central/tools/checkout-deps.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After it's done, you should see a large number of hl2sdk folders and other assorted dependencies, like MySQL, Metamod:Source, and AMBuild.&lt;br /&gt;
&lt;br /&gt;
If you are on Windows, but not using MozillaBuild, then you won't be able to use the checkout-deps script. Instead, you'll have to manually clone the following repositories:&lt;br /&gt;
* Everything in [https://hg.alliedmods.net/hl2sdks/ https://hg.alliedmods.net/hl2sdks/]&lt;br /&gt;
* [https://hg.alliedmods.net/releases/mmsource-1.10/ https://hg.alliedmods.net/releases/mmsource-1.10/]&lt;br /&gt;
* [https://hg.alliedmods.net/ambuild/ https://hg.alliedmods.net/ambuild/]&lt;br /&gt;
* ... and [http://cdn.mysql.com/archives/mysql-5.0/mysql-noinstall-5.0.24a-win32.zip mysql-noinstall-5.0.24a-win32]&lt;br /&gt;
&lt;br /&gt;
Note that you can skip MySQL and SDK versions you don't plan to build.&lt;br /&gt;
&lt;br /&gt;
=Configuring=&lt;br /&gt;
&lt;br /&gt;
The first time you are building a SourceMod tree, you must ''configure'' the build. This step initializes some basic information and allows some customization around how things get compiled.&lt;br /&gt;
&lt;br /&gt;
First create a build folder, and then run &amp;lt;tt&amp;gt;configure.py&amp;lt;/tt&amp;gt;. For example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir build&lt;br /&gt;
cd build&lt;br /&gt;
python ../sourcemod-central/configure.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is safe to reconfigure over an old build. However, it's probably a bad idea to configure inside a random, non-empty folder.&lt;br /&gt;
&lt;br /&gt;
There are a few extra options you can pass to &amp;lt;tt&amp;gt;configure&amp;lt;/tt&amp;gt;:&lt;br /&gt;
*--enable-debug - Compile with symbols and debug checks/assertions.&lt;br /&gt;
*--enable-optimize - Compile with optimizations.&lt;br /&gt;
*--no-sse - Disable floating point optimizations (if you have a very, very old CPU).&lt;br /&gt;
&lt;br /&gt;
=Building=&lt;br /&gt;
&lt;br /&gt;
To build SourceMod, simply type:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ambuild&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In your build folder. Alternately, you can specify the path of the build folder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ambuild debug-build&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The full package layout that would be shipped for release is in the &amp;lt;tt&amp;gt;package&amp;lt;/tt&amp;gt; folder of the build.&lt;br /&gt;
&lt;br /&gt;
=Deprecated Tools=&lt;br /&gt;
==Visual Studio Project Files==&lt;br /&gt;
In the future, we will use AMBuild to automatically generate project files, and the existing project files will be removed from the SourceMod tree. In the meantime however, it is possible to use these files. Unfortunately, they require a bit of extra work to use.&lt;br /&gt;
&lt;br /&gt;
First, make sure you've downloaded all necessary dependencies (SDKs, Metamod:Source source code, and MySQL) via the &amp;lt;tt&amp;gt;checkout-windows-deps.bat&amp;lt;/tt&amp;gt; script. Next,&lt;br /&gt;
#Open the Control Panel (for example, via Start -&amp;gt; Settings).&lt;br /&gt;
#Open the System control.  If you don't see it, you may need to switch to &amp;quot;Classic view&amp;quot; (either via the left-hand pane or by going to Tools -&amp;gt; Folder Options).&lt;br /&gt;
#Click the Advanced tab.&lt;br /&gt;
#Click the Environment Variables button.&lt;br /&gt;
&lt;br /&gt;
Now, add your environment variables to either your User settings or your System settings. Create a new variable for each item in the list below. You may omit SDKs that you do not plan to build against. The item names are in &amp;lt;tt&amp;gt;fixed-width font&amp;lt;/tt&amp;gt; and their value descriptions follow.&lt;br /&gt;
*&amp;lt;tt&amp;gt;MMSOURCE19&amp;lt;/tt&amp;gt; - Path to Metamod:Source 1.10+&lt;br /&gt;
*&amp;lt;tt&amp;gt;MMSOURCE18&amp;lt;/tt&amp;gt; - Path to Metamod:Source 1.10+&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDK&amp;lt;/tt&amp;gt; - Path to HL2SDK Ep1/Original&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDKOB&amp;lt;/tt&amp;gt; - Path to HL2SDK Ep2/OrangeBox for mods&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDKOBVALVE&amp;lt;/tt&amp;gt; - Path to HL2SDK Source 2009 (HL2:DM, DoD:S, TF2)&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDK-SWARM&amp;lt;/tt&amp;gt; - Path to HL2SDK Alien Swarm&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDK-BGT&amp;lt;/tt&amp;gt; - Path to HL2SDK for Bloody Good Time&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDKCSGO&amp;lt;/tt&amp;gt; - Path to HL2SDK CS:GO&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDKCSS&amp;lt;/tt&amp;gt; - Path to HL2SDK CS:S&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDK-DARKM&amp;lt;/tt&amp;gt; - Path to HL2SDK Dark Messiah&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDK-EYE&amp;lt;/tt&amp;gt; - Path to HL2SDK E.Y.E.: Divine Cybermancy&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDKL4D&amp;lt;/tt&amp;gt; - Path to HL2SDK L4D1&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDKL4D2&amp;lt;/tt&amp;gt; - Path to HL2SDK L4D2&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDK-DOTA&amp;lt;/tt&amp;gt; - Path to HL2SDK DOTA 2&lt;br /&gt;
*&amp;lt;tt&amp;gt;MYSQL5&amp;lt;/tt&amp;gt; - Path to the folder that contains MySQL's &amp;lt;tt&amp;gt;include&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; folders.&lt;br /&gt;
&lt;br /&gt;
==Makefiles==&lt;br /&gt;
Makefiles are deprecated and will be removed from the tree soon.&lt;br /&gt;
&lt;br /&gt;
[[Category:SourceMod Documentation]]&lt;br /&gt;
[[Category:SourceMod Development]]&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Building_SourceMod&amp;diff=9507</id>
		<title>Building SourceMod</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Building_SourceMod&amp;diff=9507"/>
		<updated>2014-02-16T17:08:20Z</updated>

		<summary type="html">&lt;p&gt;DS: /* Source and Dependencies */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Compiling SourceMod is not difficult, but requires a number of prerequisites.  This article details the requirements and steps to being able to build working SourceMod binaries.&lt;br /&gt;
&lt;br /&gt;
Note that specific compiler versions are required to maintain ABI compatibility with Source engine binaries.&lt;br /&gt;
&lt;br /&gt;
=Requirements=&lt;br /&gt;
&lt;br /&gt;
==Windows==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;You need one of the following Visual Studio versions:&lt;br /&gt;
  &amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Microsoft Visual C++ 2012 (Express or higher) will work for some games; notably, not Dota 2.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Microsoft Visual C++ 2010 (Express or higher) is supported and used for official builds.&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;/ul&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Next, you will need to start an environment capable of running Python, Mercurial, and interacting with the Visual Studio compiler. There are two ways to do this.&lt;br /&gt;
  &amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Recommended: Use [https://wiki.mozilla.org/MozillaBuild MozillaBuild]. MozillaBuild comes with Python, Mercurial, and a unix-like shell.&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
     &amp;lt;li&amp;gt;Install MozillaBuild.&amp;lt;/li&amp;gt;&lt;br /&gt;
     &amp;lt;li&amp;gt;Navigate to &amp;lt;tt&amp;gt;C:\mozilla-build&amp;lt;/tt&amp;gt; and run the batch file corresponding to your Visual Studio version. For example, &amp;lt;tt&amp;gt;start-msvc10.bat&amp;lt;/tt&amp;gt; for Visual Studio 2010 (10.0). Do not run an x64 version.&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
   &amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Or, you can manually set up a shell.&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
     &amp;lt;li&amp;gt;Install [http://mercurial.selenic.com/ Mercurial].&amp;lt;/li&amp;gt;&lt;br /&gt;
     &amp;lt;li&amp;gt;Add Python to your &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt; variable. Go to Control Panel, System, Advanced, Environment Variables. Add &amp;lt;tt&amp;gt;C:\Python27;C:\Python27\Scripts&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt; (or wherever your Python install is).&amp;lt;/li&amp;gt;&lt;br /&gt;
     &amp;lt;li&amp;gt;Under Start, Programs, Microsoft Visual Studio, select the &amp;quot;Visual Studio Tools&amp;quot; folder and run &amp;quot;Visual Studio Command Prompt&amp;quot;. Alternately, open a normal command prompt and run &amp;lt;tt&amp;gt;&amp;quot;C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\vcvars.bat&amp;quot;&amp;lt;/tt&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
   &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;/ul&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Linux==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Install Mercurial, via either system packages or the [http://mercurial.selenic.com/ Mercurial] distribution.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Install either the GNU C Compiler or the Clang compiler.&lt;br /&gt;
  &amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;For GCC, 4.4 or higher is required. On Debian/Ubuntu-based systems, the commands below will install GCC (the second set of packages is required for building on 64-bit systems).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install gcc g++&lt;br /&gt;
sudo apt-get install gcc-multilib g++-multilib&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
   &amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;For Clang, 3.2 or higher is required. On Debian/Ubuntu-based systems, the packages needed are:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install clang&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
   &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;/ul&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;If building on a 64-bit system, a few additional packages may be required. For example on Debian/Ubuntu they are:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install ia32-libs&lt;br /&gt;
sudo apt-get install lib32z1 lib32z1-dev&lt;br /&gt;
sudo apt-get install libc6-dev-i386 libc6-i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Mac OS X==&lt;br /&gt;
Mac OS X 10.7 or higher is required to build, however, SourceMod will work on 10.5. SourceMod will neither build nor run on older PPC Macs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Install Mercurial if you do not have it - there are a few ways to do this. Using the [http://mercurial.selenic.com/ Mercurial] distribution will work, or you can use [http://www.macports.org/ macports] or [http://brew.sh/ homebrew].&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Download and install XCode from the App Store. Launch XCode, then navigate to Preferences -&amp;gt; Downloads -&amp;gt; Command line tools -&amp;gt; Components -&amp;gt; Install. If you have recently upgraded XCode, you will need to perform this step again. SourceMod cannot build without XCode's command line tools.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Source and Dependencies=&lt;br /&gt;
&lt;br /&gt;
First, grab the SourceMod source tree. We recommend placing it inside its own folder, since we'll also need to download its dependencies.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p alliedmodders&lt;br /&gt;
cd alliedmodders&lt;br /&gt;
hg clone http://hg.alliedmods.net/sourcemod-central&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, run the &amp;lt;tt&amp;gt;checkout-deps.sh&amp;lt;/tt&amp;gt; script. This will download all dependencies and attempt to install AMBuild. If you are using Linux or OS X, it may prompt you for your sudo password at the very end. If you want to skip this and install AMBuild manually, just Ctrl+C. (Do not run the checkout script with sudo.)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bash sourcemod-central/tools/checkout-deps.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After it's done, you should see a large number of hl2sdk folders and other assorted dependencies, like MySQL, Metamod:Source, and AMBuild.&lt;br /&gt;
&lt;br /&gt;
If you are on Windows, but not using MozillaBuild, then you won't be able to use the checkout-deps script. Instead, you'll have to manually clone the following repositories:&lt;br /&gt;
* Everything in [http://hg.alliedmods.net/hl2sdks/ http://hg.alliedmods.net/hl2sdks/]&lt;br /&gt;
* [http://hg.alliedmods.net/releases/mmsource-1.10/ http://hg.alliedmods.net/releases/mmsource-1.10/]&lt;br /&gt;
* [http://hg.alliedmods.net/ambuild/ http://hg.alliedmods.net/ambuild/]&lt;br /&gt;
* ... and [http://cdn.mysql.com/archives/mysql-5.0/mysql-noinstall-5.0.24a-win32.zip mysql-noinstall-5.0.24a-win32]&lt;br /&gt;
&lt;br /&gt;
Note that you can skip MySQL and SDK versions you don't plan to build.&lt;br /&gt;
&lt;br /&gt;
=Configuring=&lt;br /&gt;
&lt;br /&gt;
The first time you are building a SourceMod tree, you must ''configure'' the build. This step initializes some basic information and allows some customization around how things get compiled.&lt;br /&gt;
&lt;br /&gt;
First create a build folder, and then run &amp;lt;tt&amp;gt;configure.py&amp;lt;/tt&amp;gt;. For example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir build&lt;br /&gt;
cd build&lt;br /&gt;
python ../sourcemod-central/configure.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is safe to reconfigure over an old build. However, it's probably a bad idea to configure inside a random, non-empty folder.&lt;br /&gt;
&lt;br /&gt;
There are a few extra options you can pass to &amp;lt;tt&amp;gt;configure&amp;lt;/tt&amp;gt;:&lt;br /&gt;
*--enable-debug - Compile with symbols and debug checks/assertions.&lt;br /&gt;
*--enable-optimize - Compile with optimizations.&lt;br /&gt;
*--no-sse - Disable floating point optimizations (if you have a very, very old CPU).&lt;br /&gt;
&lt;br /&gt;
=Building=&lt;br /&gt;
&lt;br /&gt;
To build SourceMod, simply type:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ambuild&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In your build folder. Alternately, you can specify the path of the build folder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ambuild debug-build&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The full package layout that would be shipped for release is in the &amp;lt;tt&amp;gt;package&amp;lt;/tt&amp;gt; folder of the build.&lt;br /&gt;
&lt;br /&gt;
=Deprecated Tools=&lt;br /&gt;
==Visual Studio Project Files==&lt;br /&gt;
In the future, we will use AMBuild to automatically generate project files, and the existing project files will be removed from the SourceMod tree. In the meantime however, it is possible to use these files. Unfortunately, they require a bit of extra work to use.&lt;br /&gt;
&lt;br /&gt;
First, make sure you've downloaded all necessary dependencies (SDKs, Metamod:Source source code, and MySQL) via the &amp;lt;tt&amp;gt;checkout-windows-deps.bat&amp;lt;/tt&amp;gt; script. Next,&lt;br /&gt;
#Open the Control Panel (for example, via Start -&amp;gt; Settings).&lt;br /&gt;
#Open the System control.  If you don't see it, you may need to switch to &amp;quot;Classic view&amp;quot; (either via the left-hand pane or by going to Tools -&amp;gt; Folder Options).&lt;br /&gt;
#Click the Advanced tab.&lt;br /&gt;
#Click the Environment Variables button.&lt;br /&gt;
&lt;br /&gt;
Now, add your environment variables to either your User settings or your System settings. Create a new variable for each item in the list below. You may omit SDKs that you do not plan to build against. The item names are in &amp;lt;tt&amp;gt;fixed-width font&amp;lt;/tt&amp;gt; and their value descriptions follow.&lt;br /&gt;
*&amp;lt;tt&amp;gt;MMSOURCE19&amp;lt;/tt&amp;gt; - Path to Metamod:Source 1.10+&lt;br /&gt;
*&amp;lt;tt&amp;gt;MMSOURCE18&amp;lt;/tt&amp;gt; - Path to Metamod:Source 1.10+&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDK&amp;lt;/tt&amp;gt; - Path to HL2SDK Ep1/Original&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDKOB&amp;lt;/tt&amp;gt; - Path to HL2SDK Ep2/OrangeBox for mods&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDKOBVALVE&amp;lt;/tt&amp;gt; - Path to HL2SDK Source 2009 (HL2:DM, DoD:S, TF2)&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDK-SWARM&amp;lt;/tt&amp;gt; - Path to HL2SDK Alien Swarm&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDK-BGT&amp;lt;/tt&amp;gt; - Path to HL2SDK for Bloody Good Time&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDKCSGO&amp;lt;/tt&amp;gt; - Path to HL2SDK CS:GO&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDKCSS&amp;lt;/tt&amp;gt; - Path to HL2SDK CS:S&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDK-DARKM&amp;lt;/tt&amp;gt; - Path to HL2SDK Dark Messiah&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDK-EYE&amp;lt;/tt&amp;gt; - Path to HL2SDK E.Y.E.: Divine Cybermancy&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDKL4D&amp;lt;/tt&amp;gt; - Path to HL2SDK L4D1&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDKL4D2&amp;lt;/tt&amp;gt; - Path to HL2SDK L4D2&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDK-DOTA&amp;lt;/tt&amp;gt; - Path to HL2SDK DOTA 2&lt;br /&gt;
*&amp;lt;tt&amp;gt;MYSQL5&amp;lt;/tt&amp;gt; - Path to the folder that contains MySQL's &amp;lt;tt&amp;gt;include&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; folders.&lt;br /&gt;
&lt;br /&gt;
==Makefiles==&lt;br /&gt;
Makefiles are deprecated and will be removed from the tree soon.&lt;br /&gt;
&lt;br /&gt;
[[Category:SourceMod Documentation]]&lt;br /&gt;
[[Category:SourceMod Development]]&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Git_Tutorial&amp;diff=9493</id>
		<title>Git Tutorial</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Git_Tutorial&amp;diff=9493"/>
		<updated>2014-02-11T09:10:47Z</updated>

		<summary type="html">&lt;p&gt;DS: /* Tips and Tricks */ BC has nothing to do with water!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;AlliedModders now hosts some of its repositories on Git, via GitHub. There are two ways you can browse these repositories:&lt;br /&gt;
* Via our GitHub page: [https://github.com/alliedmodders/ https://github.com/alliedmodders/]&lt;br /&gt;
* Via our read-only mirror: [https://git.alliedmods.net/ https://git.alliedmods.net/]&lt;br /&gt;
&lt;br /&gt;
=Getting Started=&lt;br /&gt;
==Introduction==&lt;br /&gt;
Git, like other version control systems, has a few concepts important to working with source code:&lt;br /&gt;
&lt;br /&gt;
*'''Repositories''' are where source code is stored.&lt;br /&gt;
*You download a repository via '''cloning'''.&lt;br /&gt;
*You update a repository by '''pulling''' or '''fetching'''.&lt;br /&gt;
*You add changes by '''committing'''.&lt;br /&gt;
*You upload changes to a remote repository by '''pushing'''.&lt;br /&gt;
*You resolve repository differences by '''merging'''.&lt;br /&gt;
&lt;br /&gt;
AlliedModders uses GitHub for repository hosting and code review. GitHub allows you to &amp;quot;forked&amp;quot; a repository, which gives you your own hosted copy where you have write access. After forking a project, you can make changes, then submit a &amp;quot;pull request&amp;quot; for the original developer to accept them back. For Git projects, we use this workflow instead of patches.&lt;br /&gt;
&lt;br /&gt;
==Installing==&lt;br /&gt;
&lt;br /&gt;
See [https://help.github.com/articles/set-up-git this article] on GitHub for how to install and setup Git. If you intend to send Pull Requests over GitHub, you should set your username and password as described.&lt;br /&gt;
&lt;br /&gt;
==Getting Code==&lt;br /&gt;
&lt;br /&gt;
If you have either forked an AlliedModders project on GitHub, or you are a developer with write-access to one of our repositories, you should clone a repository like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://USER@github.com/alliedmodders/repository&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Substitute your '''GitHub username''' for USER, and if you're cloning a fork, the path to your fork rather than the upstream repository.&lt;br /&gt;
&lt;br /&gt;
If you just want read-only access, you can use one of the following URL forms:&lt;br /&gt;
*&amp;lt;tt&amp;gt;git clone https://github.com/alliedmodders/amxmodx&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;git clone git://github.com/alliedmodders/amxmodx&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;git clone https://git.alliedmods.net/amxmodx&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;git clone git://git.alliedmods.net/amxmodx&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that &amp;lt;tt&amp;gt;git.alliedmods.net&amp;lt;/tt&amp;gt; is a read-only mirror of our GitHub repositories.&lt;br /&gt;
&lt;br /&gt;
=Workflow=&lt;br /&gt;
&lt;br /&gt;
Code reviews and patch submission should take place on GitHub. Bug reporting and issue tracking, if needed, should still occur on [https://bugs.alliedmods.net/ Bugzilla]. Most of the time, you will not need to use Bugzilla. If you just want code reviewed and checked in, you can use GitHub.&lt;br /&gt;
&lt;br /&gt;
With Git, all work is usually done in ''branches''. A branch is a separate line of development that exists alongside main development. Branches have their own commit history, and can be merged back to the main line of development (called '''master'''). Branches can be deleted or shared. The crux of the Git workflow is as follows:&lt;br /&gt;
* Create a new branch.&lt;br /&gt;
* Commit changes onto the new branch.&lt;br /&gt;
* Ask the upstream repository to merge the branch.&lt;br /&gt;
* Delete the local branch, switch back to master, and sync up.&lt;br /&gt;
&lt;br /&gt;
This is significantly less work than the Mercurial patch-sharing model, where patch files have to be exported into a bug tracker.&lt;br /&gt;
&lt;br /&gt;
Now for the details. There are two workflows, one for AlliedModders developers and one for contributors. The processes are basically the same, but official developers can skip a few steps. If you are a developer, you can also choose to use the contributor workflow.&lt;br /&gt;
&lt;br /&gt;
==Contributing via Forks==&lt;br /&gt;
This is the default workflow. GitHub can host personal copies of other repositories for you, called &amp;quot;forks&amp;quot;. To fork a project, log in to [https://github.com/ GitHub], then visit the project's page. For example, AMX Mod X is at [https://github.com/alliedmodders/amxmodx]. Just click the &amp;quot;Fork&amp;quot; button in the upper left, and you will have your own copy of the repository.&lt;br /&gt;
&lt;br /&gt;
===Setup===&lt;br /&gt;
Once you have a fork, you can clone it and add the upstream repository as a remote source:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://USER@github.com/USER/amxmodx&lt;br /&gt;
git remote add upstream https://github.com/alliedmodders/amxmodx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Branching===&lt;br /&gt;
Whenever you are about to work on something, it's a good idea to sync your local repository to make sure it's up to date. For a more in-depth look at this, see [https://help.github.com/articles/syncing-a-fork syncing a fork] at GitHub. In short, you just need to do:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git checkout master       # Switch to main branch&lt;br /&gt;
git merge upstream/master # Merge changes from upstream&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, let's say you want to work a new feature or bug called &amp;quot;EggAPI&amp;quot;. First, create a branch for your work:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git checkout -b eggapi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This creates and switches to a new &amp;lt;tt&amp;gt;eggapi&amp;lt;/tt&amp;gt; branch, forked from the position of the previous branch. Use &amp;lt;tt&amp;gt;git checkout&amp;lt;/tt&amp;gt; to switch branches, and &amp;lt;tt&amp;gt;-b&amp;lt;/tt&amp;gt; to create new ones.&lt;br /&gt;
&lt;br /&gt;
===Committing===&lt;br /&gt;
After you've made changes, use &amp;lt;tt&amp;gt;git commit&amp;lt;/tt&amp;gt; to commit them. Note that unlike Mercurial, git does not recognize changes unless you ''stage'' them. For example, let's say I modify &amp;lt;tt&amp;gt;amxmodx/string.cpp&amp;lt;/tt&amp;gt;. If I try to commit, or run &amp;lt;tt&amp;gt;git status&amp;lt;/tt&amp;gt;, I might see something like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# On branch eggapi&lt;br /&gt;
# Changes not staged for commit:&lt;br /&gt;
#   (use &amp;quot;git add &amp;lt;file&amp;gt;...&amp;quot; to update what will be committed)&lt;br /&gt;
#   (use &amp;quot;git checkout -- &amp;lt;file&amp;gt;...&amp;quot; to discard changes in working directory)&lt;br /&gt;
#&lt;br /&gt;
#	modified:   amxmodx/string.cpp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is because my changes are not yet staged as part of the next commit. To stage them, and then commit, I can do:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git add amxmodx/string.cpp&lt;br /&gt;
git commit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Pull Requests===&lt;br /&gt;
Once your branch is ready for submission, the next step is to create a pull request. First, push your branch back to GitHub:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git push origin eggapi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, visit your repository on GitHub. You should see something like:&lt;br /&gt;
&lt;br /&gt;
[[Image:Pullrequest.PNG]]&lt;br /&gt;
&lt;br /&gt;
Click &amp;quot;Compare &amp;amp; pull request&amp;quot;. This will send an e-mail to the development team, and a developer can then review your changes and merge them into the master branch. GitHub will then provide a button to delete your branch, and you can also remove it locally with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git checkout master&lt;br /&gt;
git branch -D eggapi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Congratulations! You're done. If a developer requests changes, you can commit, and push to your branch again. Note that '''GitHub won't tell the developer that you've updated your branch'''. It's a good idea posting a comment saying that your request is ready for re-review.&lt;br /&gt;
&lt;br /&gt;
==Developers==&lt;br /&gt;
If you're an AlliedModders developer and have write-access to the official upstream repositories, your workflow is basically the same as contributors'. However, you have extra options available:&lt;br /&gt;
*You can skip forking, and instead push your branches directly to the upstream repository. You can then create a pull request off the main project page, just as you would for a fork.&lt;br /&gt;
*You can push directly to the master branch of the upstream repository. This means you can continue to use the Bugzilla workflow of exporting patches, reviewing them in the bug tracker, and then pushing them after review is complete.&lt;br /&gt;
*You can merge pull requests yourself, rather than waiting on a developer.&lt;br /&gt;
&lt;br /&gt;
===Code Review===&lt;br /&gt;
&lt;br /&gt;
Git does not change the AlliedModders policy of requiring peer review for all code changes. Unless you are fixing a broken build, all patches should be reviewed by another AlliedModders developer. Previously, this meant exporting a patch file to Bugzilla. You can still do that, but it's a very burdensome process for both developers and contributors. For Git projects we recommend the Pull Request model via GitHub, explained earlier.&lt;br /&gt;
&lt;br /&gt;
*If you are submitting a pull request (PR), and you want a specific developer to review your changes: you can assign them to the PR, or just e-mail/message them the link. If they request changes, and you push new commits to the branch, the PR will update automatically. However, '''it will not send notifications'''. It's a good idea to post a comment saying that the changes are ready for re-review.&lt;br /&gt;
*If you are reviewing another developer's PR, in general it's best to let them be responsible for merging it. All you have to do is review the code, and once it looks good, say something in the comments like &amp;quot;r=me&amp;quot;, &amp;quot;:ship:&amp;quot;, &amp;quot;:+1:&amp;quot;, whatever tickles your fancy.&lt;br /&gt;
*If you are reviewing a contributor's PR, then they won't have access to perform the merge themselves. In this case, once the code has been reviewed, you can just merge it for them.&lt;br /&gt;
&lt;br /&gt;
'''YOU HAVE THE POWER!!!!''' If you think you're qualified to review and merge a contributor's PR, go ahead! The goal of using GitHub is to make the contribution process much more accessible, and fast response from developers is the best way, BY FAR, to keeping contributors.&lt;br /&gt;
&lt;br /&gt;
=Mercurial Commands=&lt;br /&gt;
&lt;br /&gt;
If you're coming from Mercurial, here are some Git command equivalents. The basics are the same:&lt;br /&gt;
*&amp;lt;tt&amp;gt;clone&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;commit&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;push&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;diff&amp;lt;/tt&amp;gt; ''(note: only shows unstaged diff)''&lt;br /&gt;
*&amp;lt;tt&amp;gt;status&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;add&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;log&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Others:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hg pull&lt;br /&gt;
git fetch&lt;br /&gt;
&lt;br /&gt;
hg pull -u&lt;br /&gt;
git pull&lt;br /&gt;
&lt;br /&gt;
hg strip tip&lt;br /&gt;
git reset --hard HEAD~1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Instead of mq, you can use branches, which are usually much more convenient anyway, since you can just commit changes as you go and easily switch between them. Exactly replacing mq is out of this article's scope, but the tools exist.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hg qnew xxx&lt;br /&gt;
git checkout -b xxx&lt;br /&gt;
&lt;br /&gt;
hg qpu xxx # if stack is empty&lt;br /&gt;
git checkout xxx&lt;br /&gt;
&lt;br /&gt;
hg qpop  # for 1-deep stack...&lt;br /&gt;
git checkout master&lt;br /&gt;
&lt;br /&gt;
hg qref&lt;br /&gt;
git add x y z &amp;amp;&amp;amp; git commit # or git stash&lt;br /&gt;
&lt;br /&gt;
hg qfin -a tip&lt;br /&gt;
# No equivalent, though you should switch back to master after a PR is done.&lt;br /&gt;
# You can also delete branches via: git branch -D xxx&lt;br /&gt;
&lt;br /&gt;
hg qdiff&lt;br /&gt;
git diff xxx..master   # e.g. git my-branch..master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=SSH Authentication=&lt;br /&gt;
If you have [[SSH_Keys|SSH Keys]], you can set your GitHub profile to accept them. This is '''HIGHLY RECOMMENDED''' for AlliedModders developers. You probably already have a key with us, even.&lt;br /&gt;
&lt;br /&gt;
=Tips and Tricks=&lt;br /&gt;
Set up a good merge tool. We really like [http://scootersoftware.com/ Beyond Compare], however, kdiff3 and meld are also good.&lt;br /&gt;
&lt;br /&gt;
If you accidentally commit to master, you can copy the commit to a new branch, then erase the commit off master:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git branch stuff&lt;br /&gt;
git reset --hard HEAD~1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can list branches with:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git branch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Version Control Systems]]&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Building_SourceMod&amp;diff=9475</id>
		<title>Building SourceMod</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Building_SourceMod&amp;diff=9475"/>
		<updated>2014-02-06T06:34:42Z</updated>

		<summary type="html">&lt;p&gt;DS: /* Mac OS X */ Update name and path of dependency script.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Compiling SourceMod is not difficult, but requires a number of prerequisites.  This article details the requirements and steps to being able to build working SourceMod binaries.&lt;br /&gt;
&lt;br /&gt;
Note that specific compiler versions are required to maintain ABI compatibility with Source engine binaries.&lt;br /&gt;
&lt;br /&gt;
=Requirements=&lt;br /&gt;
&lt;br /&gt;
==Windows==&lt;br /&gt;
You need one of the following Visual Studio versions:&lt;br /&gt;
 &amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;Microsoft Visual C++ 2012 (Express or higher) will work for some games; notably, not Dota 2.&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;Microsoft Visual C++ 2010 (Express or higher) is supported and used for official builds.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, you will need to start an environment capable of running Python, Mercurial, and interacting with the Visual Studio compiler. There are two ways to do this.&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Use [https://wiki.mozilla.org/MozillaBuild MozillaBuild]. MozillaBuild comes with Python, Mercurial, and a unix-like shell.&lt;br /&gt;
  &amp;lt;ol&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Install MozillaBuild.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Navigate to &amp;lt;tt&amp;gt;C:\mozilla-build&amp;lt;/tt&amp;gt; and run the batch file corresponding to your Visual Studio version. For example, &amp;lt;tt&amp;gt;start-msvc10.bat&amp;lt;/tt&amp;gt; for Visual Studio 2010 (10.0). Do not run an x64 version.&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;/ol&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Or, you can manually set up a shell.&lt;br /&gt;
  &amp;lt;ol&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Install [http://mercurial.selenic.com/ Mercurial].&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Add Python to your &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt; variable. Go to Control Panel, System, Advanced, Environment Variables. Add &amp;lt;tt&amp;gt;C:\Python27;C:\Python27\Scripts&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt; (or wherever your Python install is).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Under Start, Programs, Microsoft Visual Studio, select the &amp;quot;Visual Studio Tools&amp;quot; folder and run &amp;quot;Visual Studio Command Prompt&amp;quot;. Alternately, open a normal command prompt and run &amp;lt;tt&amp;gt;&amp;quot;C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\vcvars.bat&amp;quot;&amp;lt;/tt&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;/ol&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install AMBuild. If you are not using MozillaBuild, you may need to be Administrator.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hg clone http://hg.alliedmods.net/ambuild&lt;br /&gt;
cd ambuild&lt;br /&gt;
python setup.py install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, grab a copy of the SourceMod source tree. There are a few ways to do this but the easiest way is using Mercurial:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hg clone http://hg.alliedmods.net/sourcemod-central&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finally, grab the necessary Windows dependencies by running &amp;lt;tt&amp;gt;tools\buildbot\checkout-windows-deps.bat&amp;lt;/tt&amp;gt; (or &amp;lt;tt&amp;gt;.sh&amp;lt;/tt&amp;gt; if using MozillaBuild). You should be run it in the folder above sourcemod-central.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
C:\Users\dvander&amp;gt; sourcemod-central\tools\buildbot-checkout-windows-deps.bat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Linux==&lt;br /&gt;
Install Mercurial, via either system packages or the [http://mercurial.selenic.com/ Mercurial] distribution.&lt;br /&gt;
&lt;br /&gt;
Install either the GNU C Compiler or the Clang compiler.&lt;br /&gt;
  &amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;For GCC, 4.4 or higher is required. On Debian/Ubuntu-based systems, the commands below will install GCC (the second set of packages is required for building on 64-bit systems).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install gcc g++&lt;br /&gt;
sudo apt-get install gcc-multilib g++-multilib&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
   &amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;For Clang, 3.2 or higher is required. On Debian/Ubuntu-based systems, the packages needed are:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install clang&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
   &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If building on a 64-bit system, a few additional packages may be required. For example on Debian/Ubuntu they are:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install ia32-libs&lt;br /&gt;
sudo apt-get install lib32z1 lib32z1-dev&lt;br /&gt;
sudo apt-get install libc6-dev-i386 libc6-i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install AMBuild:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hg clone http://hg.alliedmods.net/ambuild&lt;br /&gt;
cd ambuild&lt;br /&gt;
sudo python setup.py install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, grab a copy of the SourceMod source tree. There are a few ways to do this but the easiest way is using Mercurial:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hg clone http://hg.alliedmods.net/sourcemod-central&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finally, the remaining necessary Linux dependencies by running &amp;lt;tt&amp;gt;tools/checkout-deps.sh&amp;lt;/tt&amp;gt;. It should be run in the folder above sourcemod-central. Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bash sourcemod-central/tools/checkout-deps.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Mac OS X==&lt;br /&gt;
Mac OS X 10.7 or higher is required to build, however, SourceMod will work on 10.5. SourceMod will neither build nor run on older PPC Macs.&lt;br /&gt;
&lt;br /&gt;
Install Mercurial if you do not have it - there are a few ways to do this. Using the [http://mercurial.selenic.com/ Mercurial] distribution will work, or you can use [http://www.macports.org/ macports] or [http://brew.sh/ homebrew].&lt;br /&gt;
&lt;br /&gt;
Download and install XCode from the App Store. Launch XCode, then navigate to Preferences -&amp;gt; Downloads -&amp;gt; Command line tools -&amp;gt; Components -&amp;gt; Install. If you have recently upgraded XCode, you will need to perform this step again. SourceMod cannot build without XCode's command line tools.&lt;br /&gt;
&lt;br /&gt;
Install AMBuild:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hg clone http://hg.alliedmods.net/ambuild&lt;br /&gt;
cd ambuild&lt;br /&gt;
sudo python setup.py install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, grab a copy of the SourceMod source tree. There are a few ways to do this but the easiest way is using Mercurial:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hg clone http://hg.alliedmods.net/sourcemod-central&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Grab the remaining necessary OS X dependencies by running &amp;lt;tt&amp;gt;tools/checkout-deps.sh&amp;lt;/tt&amp;gt;. It should be run in the folder above sourcemod-central. Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bash sourcemod-central/tools/checkout-deps.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Configuring=&lt;br /&gt;
&lt;br /&gt;
The first time you are building a SourceMod tree, you must ''configure'' the build. This step initializes some basic information and allows some customization around how things get compiled.&lt;br /&gt;
&lt;br /&gt;
First create a build folder, and then run &amp;lt;tt&amp;gt;configure.py&amp;lt;/tt&amp;gt;. For example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir build&lt;br /&gt;
cd build&lt;br /&gt;
python ../sourcemod-central/configure.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is safe to reconfigure over an old build. However, it's probably a bad idea to configure inside a random, non-empty folder.&lt;br /&gt;
&lt;br /&gt;
There are a few extra options you can pass to &amp;lt;tt&amp;gt;configure&amp;lt;/tt&amp;gt;:&lt;br /&gt;
*--enable-debug - Compile with symbols and debug checks/assertions.&lt;br /&gt;
*--enable-optimize - Compile with optimizations.&lt;br /&gt;
*--no-sse - Disable floating point optimizations (if you have a very, very old CPU).&lt;br /&gt;
&lt;br /&gt;
=Building=&lt;br /&gt;
&lt;br /&gt;
To build SourceMod, simply type:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ambuild&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In your build folder. Alternately, you can specify the path of the build folder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ambuild debug-build&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The full package layout that would be shipped for release is in the &amp;lt;tt&amp;gt;package&amp;lt;/tt&amp;gt; folder of the build.&lt;br /&gt;
&lt;br /&gt;
=Deprecated Tools=&lt;br /&gt;
==Visual Studio Project Files==&lt;br /&gt;
In the future, we will use AMBuild to automatically generate project files, and the existing project files will be removed from the SourceMod tree. In the meantime however, it is possible to use these files. Unfortunately, they require a bit of extra work to use.&lt;br /&gt;
&lt;br /&gt;
First, make sure you've downloaded all necessary dependencies (SDKs, Metamod:Source source code, and MySQL) via the &amp;lt;tt&amp;gt;checkout-windows-deps.bat&amp;lt;/tt&amp;gt; script. Next,&lt;br /&gt;
#Open the Control Panel (for example, via Start -&amp;gt; Settings).&lt;br /&gt;
#Open the System control.  If you don't see it, you may need to switch to &amp;quot;Classic view&amp;quot; (either via the left-hand pane or by going to Tools -&amp;gt; Folder Options).&lt;br /&gt;
#Click the Advanced tab.&lt;br /&gt;
#Click the Environment Variables button.&lt;br /&gt;
&lt;br /&gt;
Now, add your environment variables to either your User settings or your System settings. Create a new variable for each item in the list below. You may omit SDKs that you do not plan to build against. The item names are in &amp;lt;tt&amp;gt;fixed-width font&amp;lt;/tt&amp;gt; and their value descriptions follow.&lt;br /&gt;
*&amp;lt;tt&amp;gt;MMSOURCE19&amp;lt;/tt&amp;gt; - Path to Metamod:Source 1.10+&lt;br /&gt;
*&amp;lt;tt&amp;gt;MMSOURCE18&amp;lt;/tt&amp;gt; - Path to Metamod:Source 1.10+&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDK&amp;lt;/tt&amp;gt; - Path to HL2SDK Ep1/Original&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDKOB&amp;lt;/tt&amp;gt; - Path to HL2SDK Ep2/OrangeBox for mods&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDKOBVALVE&amp;lt;/tt&amp;gt; - Path to HL2SDK Source 2009 (HL2:DM, DoD:S, TF2)&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDK-SWARM&amp;lt;/tt&amp;gt; - Path to HL2SDK Alien Swarm&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDK-BGT&amp;lt;/tt&amp;gt; - Path to HL2SDK for Bloody Good Time&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDKCSGO&amp;lt;/tt&amp;gt; - Path to HL2SDK CS:GO&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDKCSS&amp;lt;/tt&amp;gt; - Path to HL2SDK CS:S&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDK-DARKM&amp;lt;/tt&amp;gt; - Path to HL2SDK Dark Messiah&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDK-EYE&amp;lt;/tt&amp;gt; - Path to HL2SDK E.Y.E.: Divine Cybermancy&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDKL4D&amp;lt;/tt&amp;gt; - Path to HL2SDK L4D1&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDKL4D2&amp;lt;/tt&amp;gt; - Path to HL2SDK L4D2&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDK-DOTA&amp;lt;/tt&amp;gt; - Path to HL2SDK DOTA 2&lt;br /&gt;
*&amp;lt;tt&amp;gt;MYSQL5&amp;lt;/tt&amp;gt; - Path to the folder that contains MySQL's &amp;lt;tt&amp;gt;include&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; folders.&lt;br /&gt;
&lt;br /&gt;
==Makefiles==&lt;br /&gt;
Makefiles are deprecated and will be removed from the tree soon.&lt;br /&gt;
&lt;br /&gt;
[[Category:SourceMod Documentation]]&lt;br /&gt;
[[Category:SourceMod Development]]&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Building_SourceMod&amp;diff=9474</id>
		<title>Building SourceMod</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Building_SourceMod&amp;diff=9474"/>
		<updated>2014-02-06T06:33:46Z</updated>

		<summary type="html">&lt;p&gt;DS: /* Linux */ Update name and path of dependency script.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Compiling SourceMod is not difficult, but requires a number of prerequisites.  This article details the requirements and steps to being able to build working SourceMod binaries.&lt;br /&gt;
&lt;br /&gt;
Note that specific compiler versions are required to maintain ABI compatibility with Source engine binaries.&lt;br /&gt;
&lt;br /&gt;
=Requirements=&lt;br /&gt;
&lt;br /&gt;
==Windows==&lt;br /&gt;
You need one of the following Visual Studio versions:&lt;br /&gt;
 &amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;Microsoft Visual C++ 2012 (Express or higher) will work for some games; notably, not Dota 2.&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;Microsoft Visual C++ 2010 (Express or higher) is supported and used for official builds.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, you will need to start an environment capable of running Python, Mercurial, and interacting with the Visual Studio compiler. There are two ways to do this.&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Use [https://wiki.mozilla.org/MozillaBuild MozillaBuild]. MozillaBuild comes with Python, Mercurial, and a unix-like shell.&lt;br /&gt;
  &amp;lt;ol&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Install MozillaBuild.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Navigate to &amp;lt;tt&amp;gt;C:\mozilla-build&amp;lt;/tt&amp;gt; and run the batch file corresponding to your Visual Studio version. For example, &amp;lt;tt&amp;gt;start-msvc10.bat&amp;lt;/tt&amp;gt; for Visual Studio 2010 (10.0). Do not run an x64 version.&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;/ol&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Or, you can manually set up a shell.&lt;br /&gt;
  &amp;lt;ol&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Install [http://mercurial.selenic.com/ Mercurial].&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Add Python to your &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt; variable. Go to Control Panel, System, Advanced, Environment Variables. Add &amp;lt;tt&amp;gt;C:\Python27;C:\Python27\Scripts&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt; (or wherever your Python install is).&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Under Start, Programs, Microsoft Visual Studio, select the &amp;quot;Visual Studio Tools&amp;quot; folder and run &amp;quot;Visual Studio Command Prompt&amp;quot;. Alternately, open a normal command prompt and run &amp;lt;tt&amp;gt;&amp;quot;C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\vcvars.bat&amp;quot;&amp;lt;/tt&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;/ol&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install AMBuild. If you are not using MozillaBuild, you may need to be Administrator.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hg clone http://hg.alliedmods.net/ambuild&lt;br /&gt;
cd ambuild&lt;br /&gt;
python setup.py install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, grab a copy of the SourceMod source tree. There are a few ways to do this but the easiest way is using Mercurial:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hg clone http://hg.alliedmods.net/sourcemod-central&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finally, grab the necessary Windows dependencies by running &amp;lt;tt&amp;gt;tools\buildbot\checkout-windows-deps.bat&amp;lt;/tt&amp;gt; (or &amp;lt;tt&amp;gt;.sh&amp;lt;/tt&amp;gt; if using MozillaBuild). You should be run it in the folder above sourcemod-central.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
C:\Users\dvander&amp;gt; sourcemod-central\tools\buildbot-checkout-windows-deps.bat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Linux==&lt;br /&gt;
Install Mercurial, via either system packages or the [http://mercurial.selenic.com/ Mercurial] distribution.&lt;br /&gt;
&lt;br /&gt;
Install either the GNU C Compiler or the Clang compiler.&lt;br /&gt;
  &amp;lt;ul&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;For GCC, 4.4 or higher is required. On Debian/Ubuntu-based systems, the commands below will install GCC (the second set of packages is required for building on 64-bit systems).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install gcc g++&lt;br /&gt;
sudo apt-get install gcc-multilib g++-multilib&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
   &amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;For Clang, 3.2 or higher is required. On Debian/Ubuntu-based systems, the packages needed are:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install clang&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
   &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If building on a 64-bit system, a few additional packages may be required. For example on Debian/Ubuntu they are:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get install ia32-libs&lt;br /&gt;
sudo apt-get install lib32z1 lib32z1-dev&lt;br /&gt;
sudo apt-get install libc6-dev-i386 libc6-i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install AMBuild:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hg clone http://hg.alliedmods.net/ambuild&lt;br /&gt;
cd ambuild&lt;br /&gt;
sudo python setup.py install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, grab a copy of the SourceMod source tree. There are a few ways to do this but the easiest way is using Mercurial:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hg clone http://hg.alliedmods.net/sourcemod-central&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finally, the remaining necessary Linux dependencies by running &amp;lt;tt&amp;gt;tools/checkout-deps.sh&amp;lt;/tt&amp;gt;. It should be run in the folder above sourcemod-central. Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bash sourcemod-central/tools/checkout-deps.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Mac OS X==&lt;br /&gt;
Mac OS X 10.7 or higher is required to build, however, SourceMod will work on 10.5. SourceMod will neither build nor run on older PPC Macs.&lt;br /&gt;
&lt;br /&gt;
Install Mercurial if you do not have it - there are a few ways to do this. Using the [http://mercurial.selenic.com/ Mercurial] distribution will work, or you can use [http://www.macports.org/ macports] or [http://brew.sh/ homebrew].&lt;br /&gt;
&lt;br /&gt;
Download and install XCode from the App Store. Launch XCode, then navigate to Preferences -&amp;gt; Downloads -&amp;gt; Command line tools -&amp;gt; Components -&amp;gt; Install. If you have recently upgraded XCode, you will need to perform this step again. SourceMod cannot build without XCode's command line tools.&lt;br /&gt;
&lt;br /&gt;
Install AMBuild:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hg clone http://hg.alliedmods.net/ambuild&lt;br /&gt;
cd ambuild&lt;br /&gt;
sudo python setup.py install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, grab a copy of the SourceMod source tree. There are a few ways to do this but the easiest way is using Mercurial:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hg clone http://hg.alliedmods.net/sourcemod-central&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Grab the remaining necessary OS X dependencies by running &amp;lt;tt&amp;gt;tools/buildbot/checkout-mac-deps.sh&amp;lt;/tt&amp;gt;. It should be run in the folder above sourcemod-central. Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bash sourcemod-central/tools/buildbot-checkout-mac-deps.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Configuring=&lt;br /&gt;
&lt;br /&gt;
The first time you are building a SourceMod tree, you must ''configure'' the build. This step initializes some basic information and allows some customization around how things get compiled.&lt;br /&gt;
&lt;br /&gt;
First create a build folder, and then run &amp;lt;tt&amp;gt;configure.py&amp;lt;/tt&amp;gt;. For example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir build&lt;br /&gt;
cd build&lt;br /&gt;
python ../sourcemod-central/configure.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is safe to reconfigure over an old build. However, it's probably a bad idea to configure inside a random, non-empty folder.&lt;br /&gt;
&lt;br /&gt;
There are a few extra options you can pass to &amp;lt;tt&amp;gt;configure&amp;lt;/tt&amp;gt;:&lt;br /&gt;
*--enable-debug - Compile with symbols and debug checks/assertions.&lt;br /&gt;
*--enable-optimize - Compile with optimizations.&lt;br /&gt;
*--no-sse - Disable floating point optimizations (if you have a very, very old CPU).&lt;br /&gt;
&lt;br /&gt;
=Building=&lt;br /&gt;
&lt;br /&gt;
To build SourceMod, simply type:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ambuild&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In your build folder. Alternately, you can specify the path of the build folder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ambuild debug-build&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The full package layout that would be shipped for release is in the &amp;lt;tt&amp;gt;package&amp;lt;/tt&amp;gt; folder of the build.&lt;br /&gt;
&lt;br /&gt;
=Deprecated Tools=&lt;br /&gt;
==Visual Studio Project Files==&lt;br /&gt;
In the future, we will use AMBuild to automatically generate project files, and the existing project files will be removed from the SourceMod tree. In the meantime however, it is possible to use these files. Unfortunately, they require a bit of extra work to use.&lt;br /&gt;
&lt;br /&gt;
First, make sure you've downloaded all necessary dependencies (SDKs, Metamod:Source source code, and MySQL) via the &amp;lt;tt&amp;gt;checkout-windows-deps.bat&amp;lt;/tt&amp;gt; script. Next,&lt;br /&gt;
#Open the Control Panel (for example, via Start -&amp;gt; Settings).&lt;br /&gt;
#Open the System control.  If you don't see it, you may need to switch to &amp;quot;Classic view&amp;quot; (either via the left-hand pane or by going to Tools -&amp;gt; Folder Options).&lt;br /&gt;
#Click the Advanced tab.&lt;br /&gt;
#Click the Environment Variables button.&lt;br /&gt;
&lt;br /&gt;
Now, add your environment variables to either your User settings or your System settings. Create a new variable for each item in the list below. You may omit SDKs that you do not plan to build against. The item names are in &amp;lt;tt&amp;gt;fixed-width font&amp;lt;/tt&amp;gt; and their value descriptions follow.&lt;br /&gt;
*&amp;lt;tt&amp;gt;MMSOURCE19&amp;lt;/tt&amp;gt; - Path to Metamod:Source 1.10+&lt;br /&gt;
*&amp;lt;tt&amp;gt;MMSOURCE18&amp;lt;/tt&amp;gt; - Path to Metamod:Source 1.10+&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDK&amp;lt;/tt&amp;gt; - Path to HL2SDK Ep1/Original&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDKOB&amp;lt;/tt&amp;gt; - Path to HL2SDK Ep2/OrangeBox for mods&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDKOBVALVE&amp;lt;/tt&amp;gt; - Path to HL2SDK Source 2009 (HL2:DM, DoD:S, TF2)&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDK-SWARM&amp;lt;/tt&amp;gt; - Path to HL2SDK Alien Swarm&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDK-BGT&amp;lt;/tt&amp;gt; - Path to HL2SDK for Bloody Good Time&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDKCSGO&amp;lt;/tt&amp;gt; - Path to HL2SDK CS:GO&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDKCSS&amp;lt;/tt&amp;gt; - Path to HL2SDK CS:S&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDK-DARKM&amp;lt;/tt&amp;gt; - Path to HL2SDK Dark Messiah&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDK-EYE&amp;lt;/tt&amp;gt; - Path to HL2SDK E.Y.E.: Divine Cybermancy&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDKL4D&amp;lt;/tt&amp;gt; - Path to HL2SDK L4D1&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDKL4D2&amp;lt;/tt&amp;gt; - Path to HL2SDK L4D2&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDK-DOTA&amp;lt;/tt&amp;gt; - Path to HL2SDK DOTA 2&lt;br /&gt;
*&amp;lt;tt&amp;gt;MYSQL5&amp;lt;/tt&amp;gt; - Path to the folder that contains MySQL's &amp;lt;tt&amp;gt;include&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; folders.&lt;br /&gt;
&lt;br /&gt;
==Makefiles==&lt;br /&gt;
Makefiles are deprecated and will be removed from the tree soon.&lt;br /&gt;
&lt;br /&gt;
[[Category:SourceMod Documentation]]&lt;br /&gt;
[[Category:SourceMod Development]]&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=AMBuild_API_(2.0)&amp;diff=9132</id>
		<title>AMBuild API (2.0)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=AMBuild_API_(2.0)&amp;diff=9132"/>
		<updated>2013-10-18T01:26:34Z</updated>

		<summary type="html">&lt;p&gt;DS: /* Contexts */ Fixed markup typo.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;AMBuild scripts have access to the following object types:&lt;br /&gt;
* '''Context''': Exposed as the &amp;lt;tt&amp;gt;builder&amp;lt;/tt&amp;gt;, this is the entry point for the API and is known as a ''configure context''.&lt;br /&gt;
* '''NodeBuilder''': Represents a node in the dependency graph that may or may not be committed to the database.&lt;br /&gt;
* '''Compiler''': An abstraction representing a C++ compiler environment.&lt;br /&gt;
* '''Vendor''': An abstraction representing a C++ compiler vendor (GCC, MSVC, Clang, etc).&lt;br /&gt;
* '''BinaryBuilder''': An abstraction for building C++ compilation jobs.&lt;br /&gt;
&lt;br /&gt;
As a general rule, AMBuild uses the following conventions:&lt;br /&gt;
* Methods starting with an upper-case letter are considered public API.&lt;br /&gt;
* Methods starting with a lower-case letter are considered private and should not be used.&lt;br /&gt;
* Properties and attributes ending with an underscore are considered private and should not be used.&lt;br /&gt;
* Spaces are used instead of tabs, and two-space indents are preferred.&lt;br /&gt;
&lt;br /&gt;
=Contexts=&lt;br /&gt;
&lt;br /&gt;
Contexts are implemented in &amp;lt;tt&amp;gt;ambuild2/frontend/base_gen.py&amp;lt;/tt&amp;gt;. They are the entry point for using AMBuild. They have the following properties:&lt;br /&gt;
&lt;br /&gt;
* ''compiler'' - An instance of a &amp;lt;tt&amp;gt;Compiler&amp;lt;/tt&amp;gt; object, or &amp;lt;tt&amp;gt;None&amp;lt;/tt&amp;gt; if &amp;lt;tt&amp;gt;DetectCompilers&amp;lt;/tt&amp;gt; was never called. Calling &amp;lt;tt&amp;gt;DetectCompilers&amp;lt;/tt&amp;gt; will set the &amp;lt;tt&amp;gt;compiler&amp;lt;/tt&amp;gt; field for this and all future contexts.&lt;br /&gt;
* ''parent'' - The context that loaded the current context.&lt;br /&gt;
* ''script'' - The path, relative to &amp;lt;tt&amp;gt;sourcePath&amp;lt;/tt&amp;gt;, of the current build script.&lt;br /&gt;
* ''sourcePath'' - The absolute path to the source tree.&lt;br /&gt;
* ''options'' - The result of evaluating command-line options from &amp;lt;tt&amp;gt;configure.py&amp;lt;/tt&amp;gt;, via the &amp;lt;tt&amp;gt;optparse&amp;lt;/tt&amp;gt; module.&lt;br /&gt;
* ''buildPath'' - The absolute path to the build folder.&lt;br /&gt;
* ''buildFolder'' - The working directory of jobs in this context, relative to &amp;lt;tt&amp;gt;buildPath&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Methods:&lt;br /&gt;
* ''SetBuildFolder(folder)'' - Sets the working directory of jobs in this context, relative to &amp;lt;tt&amp;gt;buildPath&amp;lt;/tt&amp;gt;.&lt;br /&gt;
** ''folder'' - A string representing the folder path. '.' and './' are allowed.&lt;br /&gt;
** Returns &amp;lt;tt&amp;gt;None&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* ''DetectCompilers()'' - Detects C and C++ compilers and raises an exception if neither are available or they do not match. Should only be called once.&lt;br /&gt;
** Returns a &amp;lt;tt&amp;gt;Compiler&amp;lt;/tt&amp;gt; object that is also accessible via the &amp;lt;tt&amp;gt;compiler&amp;lt;/tt&amp;gt; attribute.&lt;br /&gt;
* ''RunBuildScripts(files, vars={})'' - Runs additional build scripts.&lt;br /&gt;
** ''files'' - An iterable containing a list of file paths relative to path of the current build script, or a string containing such a path.&lt;br /&gt;
** ''vars'' - An optional dictionary of global variables to set in each child build script. The dictionary is merged with global variables passed into our current script.&lt;br /&gt;
** Returns &amp;lt;tt&amp;gt;None&amp;lt;/tt&amp;gt;.&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Mercurial_User_Repositories&amp;diff=9005</id>
		<title>Mercurial User Repositories</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Mercurial_User_Repositories&amp;diff=9005"/>
		<updated>2013-08-25T23:20:10Z</updated>

		<summary type="html">&lt;p&gt;DS: /* Creating a Repository */ Fixed typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;At AlliedModders, every developer who has commit access to a [[Mercurial Tutorial|Mercurial]] repository (or even an SVN repository that requires SSH access) is able to have their own Mercurial forest. These forests are located under the /users subdirectory and may contain multiple repository clones.&lt;br /&gt;
&lt;br /&gt;
=Configuring SSH=&lt;br /&gt;
So that you won't need to type your username every time, add the following lines to &amp;lt;tt&amp;gt;~/.ssh/config&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Host hg.alliedmods.net&lt;br /&gt;
User mailuser@domain.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
where &amp;lt;tt&amp;gt;mailuser@domain.com&amp;lt;/tt&amp;gt; refers to the e-mail address you use for Mercurial or SVN access.&lt;br /&gt;
&lt;br /&gt;
=Creating a Repository=&lt;br /&gt;
In order to create a repository, run the following command. You're going to be using the same command whether you are creating a new, empty repository or cloning an existing one.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh hg.alliedmods.net clone myrepo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Note:''' &amp;lt;tt&amp;gt;myrepo&amp;lt;/tt&amp;gt; refers to the name of the new repository you wish to create, not the repository you're trying to clone from.&lt;br /&gt;
&lt;br /&gt;
Runnning the above command will start an interactive script which will prompt you to make a few choices. It is mostly self-explanatory. The output of the command should look something like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ds@iroh ~ $ ssh hg.alliedmods.net clone myrepo&lt;br /&gt;
Making repo myrepo for ds@alliedmods.net.&lt;br /&gt;
This repo will appear as hg.alliedmods.net/users/ds_alliedmods.net/myrepo&lt;br /&gt;
&lt;br /&gt;
0) Exit&lt;br /&gt;
1) Yes&lt;br /&gt;
2) No&lt;br /&gt;
&lt;br /&gt;
Proceed?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you select &amp;lt;tt&amp;gt;Yes&amp;lt;/tt&amp;gt; it will proceed to ask you about which existing repository you want to clone from or whether you wish to create a new, empty repository.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' As a shortcut, you may add a second argument to the clone command in order to specify an existing repository if you already know which one you wish to clone from:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh hg.alliedmods.net clone myrepo sourcemod-central&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Editing a Repository=&lt;br /&gt;
Once your repository has been created, you can edit its description. This description will appear when you go to http://hg.alliedmods.net/users/mailuser_domain.com. In order to do this, use the &amp;lt;tt&amp;gt;edit&amp;lt;/tt&amp;gt; command:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ds@iroh ~ $ ssh hg.alliedmods.net edit myrepo&lt;br /&gt;
0) Exit&lt;br /&gt;
1) Delete the repository&lt;br /&gt;
2) Edit the description&lt;br /&gt;
&lt;br /&gt;
What would you like to do?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may also delete the repository using this command.&lt;br /&gt;
&lt;br /&gt;
=Access Via the Web=&lt;br /&gt;
Your Mercurial forest is visible at http://hg.alliedmods.net/users/mailuser_domain.com and you'll be able to browse repository history via a web interface.&lt;br /&gt;
&lt;br /&gt;
Everyone may clone a repository using the following format:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hg clone http://hg.alliedmods.net/users/mailuser_domain.com/myrepo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Pushing Changes=&lt;br /&gt;
In order to push changes, you must use SSH like so:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh://hg.alliedmods.net/users/mailuser_domain.com/myrepo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may wish to add this to your local repository's hgrc file so that you don't need to type it every time:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default-push = ssh://hg.alliedmods.net/users/mailuser_domain.com/myrepo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=AMX_Mod_X_1.8.2_Release_Notes&amp;diff=8850</id>
		<title>AMX Mod X 1.8.2 Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=AMX_Mod_X_1.8.2_Release_Notes&amp;diff=8850"/>
		<updated>2013-02-14T19:14:34Z</updated>

		<summary type="html">&lt;p&gt;DS: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;AMX Mod X 1.8.2 is a bug-fix release for compatibility with the February 2013 update to Half-Life Dedicated Servers. '''AMX Mod X 1.8.2 is not compatible with Counter-Strike: Condition Zero or versions of Counter-Strike 1.6 retrieved prior to [https://developer.valvesoftware.com/wiki/SteamCMD SteamCMD].'''&lt;br /&gt;
&lt;br /&gt;
=Upgrading=&lt;br /&gt;
We apologize that the upgrade process is both somewhat confusing and quite manual - we did not have time to build delta packages from 1.8.1 to 1.8.2.&lt;br /&gt;
&lt;br /&gt;
To upgrade from AMX Mod X 1.8.2, perform the following steps:&lt;br /&gt;
# On Windows, update &amp;lt;tt&amp;gt;addons\metamod\dlls\metamod.dll&amp;lt;/tt&amp;gt; to [http://www.amxmodx.org/dl.php?filename=metamod-1.20-am.zip Metamod 1.20-am].&lt;br /&gt;
# On Linux,&lt;br /&gt;
## Grab &amp;lt;tt&amp;gt;metamod.so&amp;lt;/tt&amp;gt; from [http://www.amxmodx.org/dl.php?filename=metamod-1.20-am.zip Metamod 1.20-am].&lt;br /&gt;
## Delete &amp;lt;tt&amp;gt;addons/metamod/dlls/metamod_i386.so&amp;lt;/tt&amp;gt;.&lt;br /&gt;
## Copy &amp;lt;tt&amp;gt;metamod.so&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;addons/metamod/dlls/&amp;lt;/tt&amp;gt;.&lt;br /&gt;
## Edit &amp;lt;tt&amp;gt;liblist.gam&amp;lt;/tt&amp;gt; to point to &amp;lt;tt&amp;gt;metamod.so&amp;lt;/tt&amp;gt; instead of &amp;lt;tt&amp;gt;metamod_i386.so&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Download the base AMX Mod X package and any mod addon packs that you need.&lt;br /&gt;
# Replace all &amp;lt;tt&amp;gt;.dll&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;.so&amp;lt;/tt&amp;gt;, and &amp;lt;tt&amp;gt;.amxx&amp;lt;/tt&amp;gt; files in your server install with the ones from the downloaded packages.&lt;br /&gt;
&lt;br /&gt;
=Changes=&lt;br /&gt;
* Increased the capacity of speech.ini {{bz|3553}}.&lt;br /&gt;
* Updated some Counter-Strike offsets for the Feb 2013 Counter-Strike 1.6 update.&lt;br /&gt;
* Fixed adminslots using an awkward loopback mechanism for kicking {{bz|3884}}.&lt;br /&gt;
* Fixed a bug in maps.ini parsing {{bz|5005}}.&lt;br /&gt;
* Fixed get_team() sometimes being wrong for dead players {{bz|4656}}.&lt;br /&gt;
* Fixed strfind() ignoring its last parameter {{bz|4070}}.&lt;br /&gt;
* Fixed replace_all() returning the wrong result {{bz|5064}}.&lt;br /&gt;
* Fixed crash in EngFunc_TraceTexture {{bz|4576}}.&lt;br /&gt;
* Fixed TrieSetArray() reading the wrong parameter {{bz|3816}}.&lt;br /&gt;
* Fixed file-handle leak in mapsmenu {{bz|3957}}.&lt;br /&gt;
* Fixed bugs in amx_ban {{bz|4159}}.&lt;br /&gt;
* Lowered wait time in between threaded queries {{bz|3740}}.&lt;br /&gt;
* Added hamsandwich support for Adrenaline Gamer {{bz|4445}}.&lt;br /&gt;
* Removed scasm.&lt;br /&gt;
&lt;br /&gt;
=Credits=&lt;br /&gt;
Special thanks for this release goes to patch contributors Scott Ehlert, arkshine, Fysiks, Reuben Morais, Lev2001, joaquimandrade, Hawk552, and Ryan L.&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=AMX_Mod_X_1.8.2_Release_Notes&amp;diff=8849</id>
		<title>AMX Mod X 1.8.2 Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=AMX_Mod_X_1.8.2_Release_Notes&amp;diff=8849"/>
		<updated>2013-02-14T18:57:24Z</updated>

		<summary type="html">&lt;p&gt;DS: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;AMX Mod X 1.8.2 is a bug-fix release for compatibility with the February 2013 update to Half-Life Dedicated Servers. '''AMX Mod X 1.8.2 is not compatible with Day of Defeat, Counter-Strike: Condition Zero or versions of Counter-Strike 1.6 retrieved prior to [https://developer.valvesoftware.com/wiki/SteamCMD SteamCMD].'''&lt;br /&gt;
&lt;br /&gt;
=Upgrading=&lt;br /&gt;
We apologize that the upgrade process is both somewhat confusing and quite manual - we did not have time to build delta packages from 1.8.1 to 1.8.2.&lt;br /&gt;
&lt;br /&gt;
To upgrade from AMX Mod X 1.8.2, perform the following steps:&lt;br /&gt;
# On Windows, update &amp;lt;tt&amp;gt;addons\metamod\dlls\metamod.dll&amp;lt;/tt&amp;gt; to [http://www.amxmodx.org/dl.php?filename=metamod-1.20-am.zip Metamod 1.20-am].&lt;br /&gt;
# On Linux,&lt;br /&gt;
## Grab &amp;lt;tt&amp;gt;metamod.so&amp;lt;/tt&amp;gt; from [http://www.amxmodx.org/dl.php?filename=metamod-1.20-am.zip Metamod 1.20-am].&lt;br /&gt;
## Delete &amp;lt;tt&amp;gt;addons/metamod/dlls/metamod_i386.so&amp;lt;/tt&amp;gt;.&lt;br /&gt;
## Copy &amp;lt;tt&amp;gt;metamod.so&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;addons/metamod/dlls/&amp;lt;/tt&amp;gt;.&lt;br /&gt;
## Edit &amp;lt;tt&amp;gt;liblist.gam&amp;lt;/tt&amp;gt; to point to &amp;lt;tt&amp;gt;metamod.so&amp;lt;/tt&amp;gt; instead of &amp;lt;tt&amp;gt;metamod_i386.so&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Download the base AMX Mod X package and any mod addon packs that you need.&lt;br /&gt;
# Replace all &amp;lt;tt&amp;gt;.dll&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;.so&amp;lt;/tt&amp;gt;, and &amp;lt;tt&amp;gt;.amxx&amp;lt;/tt&amp;gt; files in your server install with the ones from the downloaded packages.&lt;br /&gt;
&lt;br /&gt;
=Changes=&lt;br /&gt;
* Increased the capacity of speech.ini {{bz|3553}}.&lt;br /&gt;
* Updated some Counter-Strike offsets for the Feb 2013 Counter-Strike 1.6 update.&lt;br /&gt;
* Fixed adminslots using an awkward loopback mechanism for kicking {{bz|3884}}.&lt;br /&gt;
* Fixed a bug in maps.ini parsing {{bz|5005}}.&lt;br /&gt;
* Fixed get_team() sometimes being wrong for dead players {{bz|4656}}.&lt;br /&gt;
* Fixed strfind() ignoring its last parameter {{bz|4070}}.&lt;br /&gt;
* Fixed replace_all() returning the wrong result {{bz|5064}}.&lt;br /&gt;
* Fixed crash in EngFunc_TraceTexture {{bz|4576}}.&lt;br /&gt;
* Fixed TrieSetArray() reading the wrong parameter {{bz|3816}}.&lt;br /&gt;
* Fixed file-handle leak in mapsmenu {{bz|3957}}.&lt;br /&gt;
* Fixed bugs in amx_ban {{bz|4159}}.&lt;br /&gt;
* Lowered wait time in between threaded queries {{bz|3740}}.&lt;br /&gt;
* Added hamsandwich support for Adrenaline Gamer {{bz|4445}}.&lt;br /&gt;
* Removed scasm.&lt;br /&gt;
&lt;br /&gt;
=Credits=&lt;br /&gt;
Special thanks for this release goes to patch contributors Scott Ehlert, arkshine, Fysiks, Reuben Morais, Lev2001, joaquimandrade, Hawk552, and Ryan L.&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=AMX_Mod_X_1.8.2_Release_Notes&amp;diff=8848</id>
		<title>AMX Mod X 1.8.2 Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=AMX_Mod_X_1.8.2_Release_Notes&amp;diff=8848"/>
		<updated>2013-02-14T18:56:06Z</updated>

		<summary type="html">&lt;p&gt;DS: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;AMX Mod X 1.8.2 is a bug-fix release for compatibility with the February 2013 update to Half-Life Dedicated Servers. '''AMX Mod X 1.8.2 is not compatible with Counter-Strike: Condition Zero or versions Counter-Strike 1.6 retrieved prior to [https://developer.valvesoftware.com/wiki/SteamCMD SteamCMD].'''&lt;br /&gt;
&lt;br /&gt;
=Upgrading=&lt;br /&gt;
We apologize that the upgrade process is both somewhat confusing and quite manual - we did not have time to build delta packages from 1.8.1 to 1.8.2.&lt;br /&gt;
&lt;br /&gt;
To upgrade from AMX Mod X 1.8.2, perform the following steps:&lt;br /&gt;
# On Windows, update &amp;lt;tt&amp;gt;addons\metamod\dlls\metamod.dll&amp;lt;/tt&amp;gt; to [http://www.amxmodx.org/dl.php?filename=metamod-1.20-am.zip Metamod 1.20-am].&lt;br /&gt;
# On Linux,&lt;br /&gt;
## Grab &amp;lt;tt&amp;gt;metamod.so&amp;lt;/tt&amp;gt; from [http://www.amxmodx.org/dl.php?filename=metamod-1.20-am.zip Metamod 1.20-am].&lt;br /&gt;
## Delete &amp;lt;tt&amp;gt;addons/metamod/dlls/metamod_i386.so&amp;lt;/tt&amp;gt;.&lt;br /&gt;
## Copy &amp;lt;tt&amp;gt;metamod.so&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;addons/metamod/dlls/&amp;lt;/tt&amp;gt;.&lt;br /&gt;
## Edit &amp;lt;tt&amp;gt;liblist.gam&amp;lt;/tt&amp;gt; to point to &amp;lt;tt&amp;gt;metamod.so&amp;lt;/tt&amp;gt; instead of &amp;lt;tt&amp;gt;metamod_i386.so&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Download the base AMX Mod X package and any mod addon packs that you need.&lt;br /&gt;
# Replace all &amp;lt;tt&amp;gt;.dll&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;.so&amp;lt;/tt&amp;gt;, and &amp;lt;tt&amp;gt;.amxx&amp;lt;/tt&amp;gt; files in your server install with the ones from the downloaded packages.&lt;br /&gt;
&lt;br /&gt;
=Changes=&lt;br /&gt;
* Increased the capacity of speech.ini {{bz|3553}}.&lt;br /&gt;
* Updated some Counter-Strike offsets for the Feb 2013 Counter-Strike 1.6 update.&lt;br /&gt;
* Fixed adminslots using an awkward loopback mechanism for kicking {{bz|3884}}.&lt;br /&gt;
* Fixed a bug in maps.ini parsing {{bz|5005}}.&lt;br /&gt;
* Fixed get_team() sometimes being wrong for dead players {{bz|4656}}.&lt;br /&gt;
* Fixed strfind() ignoring its last parameter {{bz|4070}}.&lt;br /&gt;
* Fixed replace_all() returning the wrong result {{bz|5064}}.&lt;br /&gt;
* Fixed crash in EngFunc_TraceTexture {{bz|4576}}.&lt;br /&gt;
* Fixed TrieSetArray() reading the wrong parameter {{bz|3816}}.&lt;br /&gt;
* Fixed file-handle leak in mapsmenu {{bz|3957}}.&lt;br /&gt;
* Fixed bugs in amx_ban {{bz|4159}}.&lt;br /&gt;
* Lowered wait time in between threaded queries {{bz|3740}}.&lt;br /&gt;
* Added hamsandwich support for Adrenaline Gamer {{bz|4445}}.&lt;br /&gt;
* Removed scasm.&lt;br /&gt;
&lt;br /&gt;
=Credits=&lt;br /&gt;
Special thanks for this release goes to patch contributors Scott Ehlert, arkshine, Fysiks, Reuben Morais, Lev2001, joaquimandrade, Hawk552, and Ryan L.&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Releasing_Products&amp;diff=7910</id>
		<title>Releasing Products</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Releasing_Products&amp;diff=7910"/>
		<updated>2010-12-20T04:58:24Z</updated>

		<summary type="html">&lt;p&gt;DS: /* Updating the Metamod:Source Site */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is an internal page for doing AlliedModders product releases.&lt;br /&gt;
&lt;br /&gt;
=Making Builds=&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Once you are '''absolutely sure''' the product is ready for a release...&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Jump to a Linux system, check out the source tree.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Update the changelog (&amp;lt;tt&amp;gt;changelog.txt&amp;lt;/tt&amp;gt; for SourceMod, &amp;lt;tt&amp;gt;support/changelog.txt&amp;lt;/tt&amp;gt; for Metamod:Source).&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Edit the build_type file and change the &amp;quot;dev&amp;quot; string to &amp;quot;rel&amp;quot; (&amp;lt;tt&amp;gt;tools/buildbot/build_type&amp;lt;/tt&amp;gt; for SourceMod, &amp;lt;tt&amp;gt;support/buildbot/build_type&amp;lt;/tt&amp;gt; for Metamod:Source).&lt;br /&gt;
 &amp;lt;li&amp;gt;Edit &amp;lt;tt&amp;gt;product.version&amp;lt;/tt&amp;gt; to remove the -dev tag.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;For SourceMod, edit &amp;lt;tt&amp;gt;plugins/include/version.inc&amp;lt;/tt&amp;gt; to remove the -dev tag.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Commit the changes.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Push.  Watch the waterfall page until builds are complete.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Post-Build Work=&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Grab the binaries from the drop site ([http://metamodsource.net/mmsdrop/ MM:S drop site], [http://sourcemod.net/smdrop/ SourceMod drop site]).  It will be the latest package.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Install the packages on both Linux and Windows.  '''MAKE SURE THE VERSIONS ARE CORRECT.  THERE SHOULD BE NO -dev TAG.'''&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Metamod:Source checks:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
meta version&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
SourceMod checks:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sm plugins list&lt;br /&gt;
sm exts list&lt;br /&gt;
sm version&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;If the versions are not correct, do not release.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;For SourceMod, you need to add the language translation packs.  &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  '''If this is a major release (1.X.0), there is no prior pack.  Make one:'''&lt;br /&gt;
  &amp;lt;ol&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Extract both the tar.gz and zip files to separate folders.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Visit the [http://www.sourcemod.net/translator/?go=translate&amp;amp;op=status translator status page].&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Click &amp;quot;export languages.cfg&amp;quot; - save the new version to &amp;lt;tt&amp;gt;addons/sourcemod/configs/&amp;lt;/tt&amp;gt;, overwriting the old one.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Click &amp;quot;export&amp;quot; next to each language that is finished.  Extract the folder to &amp;lt;tt&amp;gt;addons/sourcemod/translations/&amp;lt;/tt&amp;gt;.  For example, if you extract Spanish, you should have &amp;lt;tt&amp;gt;addons/sourcemod/translations/es/&amp;lt;/tt&amp;gt; complete with ML files.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Repackage thefolders using the correct compression types (.tar.gz for Linux, .zip for Windows).&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;If this is a minor release (1.X.Y where Y != 0), there is already a prior pack.  Add it in:&amp;lt;/b&amp;gt;&lt;br /&gt;
  &amp;lt;ol&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Extract both the tar.gz and zip files to separate folders.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Download the last minor release from the same branch as this release.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Copy the &amp;lt;tt&amp;gt;addons/sourcemod/configs/languages.cfg&amp;lt;/tt&amp;gt; file from the old release over the new one.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Copy the &amp;lt;tt&amp;gt;addons/sourcemod/translations/&amp;lt;/tt&amp;gt; sub-folders from the old release over to the new one.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Repackage thefolders using the correct compression types (.tar.gz for Linux, .zip for Windows).&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;/ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;The build is done!&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Releasing to Mirrors=&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Log into iroh as yourself.  Upload your final builds to your home directory.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Run:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/scripts/amjump mirror&lt;br /&gt;
cd /scripts/mirror&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Copy your final builds from your home directory into the mirror folder.  Rename them to release names, for example: &amp;lt;tt&amp;gt;sourcemod-1.1.2.zip&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;mmsource-1.8.0.zip&amp;lt;/tt&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Mirror distribution is done with the following command:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./mirror.pl &amp;lt;projectID&amp;gt; &amp;lt;releaseName&amp;gt; &amp;lt;file&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Metamod:Source's ID is 4, SourceMod's ID is 2.  For example, these commands mirrored the Metamod:Source 1.7.0 release:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./mirror.pl 4 1.7.0 mmsource-1.7.0.zip&lt;br /&gt;
./mirror.pl 4 1.7.0 mmsource-1.7.0.tar.gz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
These commands mirrored the last SourceMod release:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./mirror.pl 2 1.1.1 sourcemod-1.1.1.tar.gz&lt;br /&gt;
./mirror.pl 2 1.1.1 sourcemod-1.1.1.zip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Type &amp;lt;tt&amp;gt;exit&amp;lt;/tt&amp;gt; to get back to your user account.  You're done!&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Cleaning up the Tree=&lt;br /&gt;
It's time to make sure the tree is set for future development.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Run &amp;lt;tt&amp;gt;hg tag&amp;lt;/tt&amp;gt; on the last revision of the release.  Usually this is the changeset that bumped versions, and usually this is &amp;lt;tt&amp;gt;tip&amp;lt;/tt&amp;gt;.  For example, Metamod:Source:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg tag mmsource-1.7.2&amp;lt;/pre&amp;gt;&lt;br /&gt;
SourceMod:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg tag sourcemod-1.1.2&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Bump the minor version in &amp;lt;tt&amp;gt;product.version&amp;lt;/tt&amp;gt;. Don't forget to add -dev.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Change the &amp;lt;tt&amp;gt;tools/buildbot/build_type&amp;lt;/tt&amp;gt; (SourceMod) or &amp;lt;tt&amp;gt;support/buildbot/build_type&amp;lt;/tt&amp;gt; (Metamod:Source) contents back to &amp;quot;dev&amp;quot;.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;For SourceMod, bump the two minor versions in &amp;lt;tt&amp;gt;plugins/include/version.inc&amp;lt;/tt&amp;gt; and re-add the -dev tag to the version string.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Commit and push.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Updating the SourceMod Site=&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Visit a [http://wiki.alliedmods.net/SourceMod_Release_Notes Release Notes] page.  Copy the contents, make a new one for your specific release.  Update the changelog, relnote anything big and important.  Link back to it from the &amp;quot;main&amp;quot; relnotes page.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Jump to the sourcemod account by logging into iroh as yourself:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/scripts/amjump sourcemod&lt;br /&gt;
cd /groups/sourcemod&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Edit the &amp;lt;tt&amp;gt;public_html/downloads.php&amp;lt;/tt&amp;gt; file with your favorite text editor.  Edit all instances of the old version with the new one.  Make sure to get every link, including relnotes.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Update ~/compiler-1.x to the latest minor version, where x is the major version number.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Run &amp;lt;tt&amp;gt;~/scripts/purge_old_builds.pl&amp;lt;/tt&amp;gt;, then edit its entry for 1.x.y, where x = this major release, and y = the new minor version.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Exit out of the sourcemod account.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Post news.  If you deviate from normal style, don't forget links for downloads, upgrading, and relnotes.  It also helps to say &amp;quot;this is backwards compatible&amp;quot; because users will always ask.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Updating the Metamod:Source Site=&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Jump to the alliedmodders account by logging into iroh as yourself:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/scripts/amjump alliedmodders&lt;br /&gt;
cd /groups/alliedmodders/hub/amhub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Edit the &amp;lt;tt&amp;gt;mmsource.py&amp;lt;/tt&amp;gt; file with your favorite text editor. Update the &amp;lt;tt&amp;gt;latest&amp;lt;/tt&amp;gt; version number in the &amp;lt;tt&amp;gt;downloads&amp;lt;/tt&amp;gt; function.  If this is a new major release (1.X.0), update the &amp;lt;tt&amp;gt;stable&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;devel&amp;lt;/tt&amp;gt; version numbers in the &amp;lt;tt&amp;gt;downloads&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;snapshots&amp;lt;/tt&amp;gt; functions.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Edit the &amp;lt;tt&amp;gt;templates/mmsource/downloads.html&amp;lt;/tt&amp;gt; file and update all Mercurial links with the tagged changeset ID for this release.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Edit the &amp;lt;tt&amp;gt;templates/mmsource/navbar.html&amp;lt;/tt&amp;gt; file and replace all instances of the old version with the new one.&lt;br /&gt;
 &amp;lt;li&amp;gt;Run the following command:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
touch ../run/apache.wsgi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Post news.  Do this by making a post in [https://forums.alliedmods.net/forumdisplay.php?f=124 this forum], which is private.  LOOK AT OLDER POSTS - you need to write valid XHTML!&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Exit out of the alliedmodders account.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Releasing_Products&amp;diff=7909</id>
		<title>Releasing Products</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Releasing_Products&amp;diff=7909"/>
		<updated>2010-12-20T04:54:45Z</updated>

		<summary type="html">&lt;p&gt;DS: /* Updating the SourceMod Site */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is an internal page for doing AlliedModders product releases.&lt;br /&gt;
&lt;br /&gt;
=Making Builds=&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Once you are '''absolutely sure''' the product is ready for a release...&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Jump to a Linux system, check out the source tree.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Update the changelog (&amp;lt;tt&amp;gt;changelog.txt&amp;lt;/tt&amp;gt; for SourceMod, &amp;lt;tt&amp;gt;support/changelog.txt&amp;lt;/tt&amp;gt; for Metamod:Source).&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Edit the build_type file and change the &amp;quot;dev&amp;quot; string to &amp;quot;rel&amp;quot; (&amp;lt;tt&amp;gt;tools/buildbot/build_type&amp;lt;/tt&amp;gt; for SourceMod, &amp;lt;tt&amp;gt;support/buildbot/build_type&amp;lt;/tt&amp;gt; for Metamod:Source).&lt;br /&gt;
 &amp;lt;li&amp;gt;Edit &amp;lt;tt&amp;gt;product.version&amp;lt;/tt&amp;gt; to remove the -dev tag.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;For SourceMod, edit &amp;lt;tt&amp;gt;plugins/include/version.inc&amp;lt;/tt&amp;gt; to remove the -dev tag.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Commit the changes.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Push.  Watch the waterfall page until builds are complete.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Post-Build Work=&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Grab the binaries from the drop site ([http://metamodsource.net/mmsdrop/ MM:S drop site], [http://sourcemod.net/smdrop/ SourceMod drop site]).  It will be the latest package.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Install the packages on both Linux and Windows.  '''MAKE SURE THE VERSIONS ARE CORRECT.  THERE SHOULD BE NO -dev TAG.'''&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Metamod:Source checks:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
meta version&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
SourceMod checks:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sm plugins list&lt;br /&gt;
sm exts list&lt;br /&gt;
sm version&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;If the versions are not correct, do not release.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;For SourceMod, you need to add the language translation packs.  &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  '''If this is a major release (1.X.0), there is no prior pack.  Make one:'''&lt;br /&gt;
  &amp;lt;ol&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Extract both the tar.gz and zip files to separate folders.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Visit the [http://www.sourcemod.net/translator/?go=translate&amp;amp;op=status translator status page].&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Click &amp;quot;export languages.cfg&amp;quot; - save the new version to &amp;lt;tt&amp;gt;addons/sourcemod/configs/&amp;lt;/tt&amp;gt;, overwriting the old one.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Click &amp;quot;export&amp;quot; next to each language that is finished.  Extract the folder to &amp;lt;tt&amp;gt;addons/sourcemod/translations/&amp;lt;/tt&amp;gt;.  For example, if you extract Spanish, you should have &amp;lt;tt&amp;gt;addons/sourcemod/translations/es/&amp;lt;/tt&amp;gt; complete with ML files.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Repackage thefolders using the correct compression types (.tar.gz for Linux, .zip for Windows).&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;If this is a minor release (1.X.Y where Y != 0), there is already a prior pack.  Add it in:&amp;lt;/b&amp;gt;&lt;br /&gt;
  &amp;lt;ol&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Extract both the tar.gz and zip files to separate folders.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Download the last minor release from the same branch as this release.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Copy the &amp;lt;tt&amp;gt;addons/sourcemod/configs/languages.cfg&amp;lt;/tt&amp;gt; file from the old release over the new one.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Copy the &amp;lt;tt&amp;gt;addons/sourcemod/translations/&amp;lt;/tt&amp;gt; sub-folders from the old release over to the new one.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Repackage thefolders using the correct compression types (.tar.gz for Linux, .zip for Windows).&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;/ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;The build is done!&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Releasing to Mirrors=&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Log into iroh as yourself.  Upload your final builds to your home directory.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Run:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/scripts/amjump mirror&lt;br /&gt;
cd /scripts/mirror&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Copy your final builds from your home directory into the mirror folder.  Rename them to release names, for example: &amp;lt;tt&amp;gt;sourcemod-1.1.2.zip&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;mmsource-1.8.0.zip&amp;lt;/tt&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Mirror distribution is done with the following command:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./mirror.pl &amp;lt;projectID&amp;gt; &amp;lt;releaseName&amp;gt; &amp;lt;file&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Metamod:Source's ID is 4, SourceMod's ID is 2.  For example, these commands mirrored the Metamod:Source 1.7.0 release:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./mirror.pl 4 1.7.0 mmsource-1.7.0.zip&lt;br /&gt;
./mirror.pl 4 1.7.0 mmsource-1.7.0.tar.gz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
These commands mirrored the last SourceMod release:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./mirror.pl 2 1.1.1 sourcemod-1.1.1.tar.gz&lt;br /&gt;
./mirror.pl 2 1.1.1 sourcemod-1.1.1.zip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Type &amp;lt;tt&amp;gt;exit&amp;lt;/tt&amp;gt; to get back to your user account.  You're done!&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Cleaning up the Tree=&lt;br /&gt;
It's time to make sure the tree is set for future development.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Run &amp;lt;tt&amp;gt;hg tag&amp;lt;/tt&amp;gt; on the last revision of the release.  Usually this is the changeset that bumped versions, and usually this is &amp;lt;tt&amp;gt;tip&amp;lt;/tt&amp;gt;.  For example, Metamod:Source:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg tag mmsource-1.7.2&amp;lt;/pre&amp;gt;&lt;br /&gt;
SourceMod:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg tag sourcemod-1.1.2&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Bump the minor version in &amp;lt;tt&amp;gt;product.version&amp;lt;/tt&amp;gt;. Don't forget to add -dev.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Change the &amp;lt;tt&amp;gt;tools/buildbot/build_type&amp;lt;/tt&amp;gt; (SourceMod) or &amp;lt;tt&amp;gt;support/buildbot/build_type&amp;lt;/tt&amp;gt; (Metamod:Source) contents back to &amp;quot;dev&amp;quot;.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;For SourceMod, bump the two minor versions in &amp;lt;tt&amp;gt;plugins/include/version.inc&amp;lt;/tt&amp;gt; and re-add the -dev tag to the version string.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Commit and push.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Updating the SourceMod Site=&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Visit a [http://wiki.alliedmods.net/SourceMod_Release_Notes Release Notes] page.  Copy the contents, make a new one for your specific release.  Update the changelog, relnote anything big and important.  Link back to it from the &amp;quot;main&amp;quot; relnotes page.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Jump to the sourcemod account by logging into iroh as yourself:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/scripts/amjump sourcemod&lt;br /&gt;
cd /groups/sourcemod&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Edit the &amp;lt;tt&amp;gt;public_html/downloads.php&amp;lt;/tt&amp;gt; file with your favorite text editor.  Edit all instances of the old version with the new one.  Make sure to get every link, including relnotes.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Update ~/compiler-1.x to the latest minor version, where x is the major version number.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Run &amp;lt;tt&amp;gt;~/scripts/purge_old_builds.pl&amp;lt;/tt&amp;gt;, then edit its entry for 1.x.y, where x = this major release, and y = the new minor version.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Exit out of the sourcemod account.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Post news.  If you deviate from normal style, don't forget links for downloads, upgrading, and relnotes.  It also helps to say &amp;quot;this is backwards compatible&amp;quot; because users will always ask.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Updating the Metamod:Source Site=&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Jump to the alliedmodders account by logging into iroh as yourself:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/scripts/amjump alliedmodders&lt;br /&gt;
cd /groups/alliedmodders/hub/amhub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Edit the &amp;lt;tt&amp;gt;mmsource.py&amp;lt;/tt&amp;gt; file with your favorite text editor. Update the &amp;lt;tt&amp;gt;latest&amp;lt;/tt&amp;gt; version number in the &amp;lt;tt&amp;gt;downloads&amp;lt;/tt&amp;gt; function.  If this is a new major release (1.X.0), update the &amp;lt;tt&amp;gt;stable&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;devel&amp;lt;/tt&amp;gt; version numbers in the &amp;lt;tt&amp;gt;downloads&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;snapshots&amp;lt;/tt&amp;gt; functions.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Edit the &amp;lt;tt&amp;gt;templates/mmsource/downloads.html&amp;lt;/tt&amp;gt; file and update all Mercurial links with the tagged changeset ID for this release.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Edit the &amp;lt;tt&amp;gt;templates/mmsource/navbar.html&amp;lt;/tt&amp;gt; file and replace all instances of the old version with the new one.&lt;br /&gt;
 &amp;lt;li&amp;gt;Post news.  Do this by making a post in [https://forums.alliedmods.net/forumdisplay.php?f=124 this forum], which is private.  LOOK AT OLDER POSTS - you need to write valid XHTML!&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Exit out of the alliedmodders account.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Releasing_Products&amp;diff=7908</id>
		<title>Releasing Products</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Releasing_Products&amp;diff=7908"/>
		<updated>2010-12-20T04:54:09Z</updated>

		<summary type="html">&lt;p&gt;DS: /* Updating the Metamod:Source Site */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is an internal page for doing AlliedModders product releases.&lt;br /&gt;
&lt;br /&gt;
=Making Builds=&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Once you are '''absolutely sure''' the product is ready for a release...&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Jump to a Linux system, check out the source tree.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Update the changelog (&amp;lt;tt&amp;gt;changelog.txt&amp;lt;/tt&amp;gt; for SourceMod, &amp;lt;tt&amp;gt;support/changelog.txt&amp;lt;/tt&amp;gt; for Metamod:Source).&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Edit the build_type file and change the &amp;quot;dev&amp;quot; string to &amp;quot;rel&amp;quot; (&amp;lt;tt&amp;gt;tools/buildbot/build_type&amp;lt;/tt&amp;gt; for SourceMod, &amp;lt;tt&amp;gt;support/buildbot/build_type&amp;lt;/tt&amp;gt; for Metamod:Source).&lt;br /&gt;
 &amp;lt;li&amp;gt;Edit &amp;lt;tt&amp;gt;product.version&amp;lt;/tt&amp;gt; to remove the -dev tag.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;For SourceMod, edit &amp;lt;tt&amp;gt;plugins/include/version.inc&amp;lt;/tt&amp;gt; to remove the -dev tag.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Commit the changes.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Push.  Watch the waterfall page until builds are complete.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Post-Build Work=&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Grab the binaries from the drop site ([http://metamodsource.net/mmsdrop/ MM:S drop site], [http://sourcemod.net/smdrop/ SourceMod drop site]).  It will be the latest package.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Install the packages on both Linux and Windows.  '''MAKE SURE THE VERSIONS ARE CORRECT.  THERE SHOULD BE NO -dev TAG.'''&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Metamod:Source checks:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
meta version&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
SourceMod checks:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sm plugins list&lt;br /&gt;
sm exts list&lt;br /&gt;
sm version&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;If the versions are not correct, do not release.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;For SourceMod, you need to add the language translation packs.  &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  '''If this is a major release (1.X.0), there is no prior pack.  Make one:'''&lt;br /&gt;
  &amp;lt;ol&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Extract both the tar.gz and zip files to separate folders.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Visit the [http://www.sourcemod.net/translator/?go=translate&amp;amp;op=status translator status page].&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Click &amp;quot;export languages.cfg&amp;quot; - save the new version to &amp;lt;tt&amp;gt;addons/sourcemod/configs/&amp;lt;/tt&amp;gt;, overwriting the old one.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Click &amp;quot;export&amp;quot; next to each language that is finished.  Extract the folder to &amp;lt;tt&amp;gt;addons/sourcemod/translations/&amp;lt;/tt&amp;gt;.  For example, if you extract Spanish, you should have &amp;lt;tt&amp;gt;addons/sourcemod/translations/es/&amp;lt;/tt&amp;gt; complete with ML files.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Repackage thefolders using the correct compression types (.tar.gz for Linux, .zip for Windows).&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;If this is a minor release (1.X.Y where Y != 0), there is already a prior pack.  Add it in:&amp;lt;/b&amp;gt;&lt;br /&gt;
  &amp;lt;ol&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Extract both the tar.gz and zip files to separate folders.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Download the last minor release from the same branch as this release.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Copy the &amp;lt;tt&amp;gt;addons/sourcemod/configs/languages.cfg&amp;lt;/tt&amp;gt; file from the old release over the new one.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Copy the &amp;lt;tt&amp;gt;addons/sourcemod/translations/&amp;lt;/tt&amp;gt; sub-folders from the old release over to the new one.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Repackage thefolders using the correct compression types (.tar.gz for Linux, .zip for Windows).&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;/ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;The build is done!&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Releasing to Mirrors=&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Log into iroh as yourself.  Upload your final builds to your home directory.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Run:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/scripts/amjump mirror&lt;br /&gt;
cd /scripts/mirror&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Copy your final builds from your home directory into the mirror folder.  Rename them to release names, for example: &amp;lt;tt&amp;gt;sourcemod-1.1.2.zip&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;mmsource-1.8.0.zip&amp;lt;/tt&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Mirror distribution is done with the following command:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./mirror.pl &amp;lt;projectID&amp;gt; &amp;lt;releaseName&amp;gt; &amp;lt;file&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Metamod:Source's ID is 4, SourceMod's ID is 2.  For example, these commands mirrored the Metamod:Source 1.7.0 release:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./mirror.pl 4 1.7.0 mmsource-1.7.0.zip&lt;br /&gt;
./mirror.pl 4 1.7.0 mmsource-1.7.0.tar.gz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
These commands mirrored the last SourceMod release:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./mirror.pl 2 1.1.1 sourcemod-1.1.1.tar.gz&lt;br /&gt;
./mirror.pl 2 1.1.1 sourcemod-1.1.1.zip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Type &amp;lt;tt&amp;gt;exit&amp;lt;/tt&amp;gt; to get back to your user account.  You're done!&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Cleaning up the Tree=&lt;br /&gt;
It's time to make sure the tree is set for future development.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Run &amp;lt;tt&amp;gt;hg tag&amp;lt;/tt&amp;gt; on the last revision of the release.  Usually this is the changeset that bumped versions, and usually this is &amp;lt;tt&amp;gt;tip&amp;lt;/tt&amp;gt;.  For example, Metamod:Source:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg tag mmsource-1.7.2&amp;lt;/pre&amp;gt;&lt;br /&gt;
SourceMod:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg tag sourcemod-1.1.2&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Bump the minor version in &amp;lt;tt&amp;gt;product.version&amp;lt;/tt&amp;gt;. Don't forget to add -dev.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Change the &amp;lt;tt&amp;gt;tools/buildbot/build_type&amp;lt;/tt&amp;gt; (SourceMod) or &amp;lt;tt&amp;gt;support/buildbot/build_type&amp;lt;/tt&amp;gt; (Metamod:Source) contents back to &amp;quot;dev&amp;quot;.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;For SourceMod, bump the two minor versions in &amp;lt;tt&amp;gt;plugins/include/version.inc&amp;lt;/tt&amp;gt; and re-add the -dev tag to the version string.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Commit and push.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Updating the SourceMod Site=&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Visit a [http://wiki.alliedmods.net/SourceMod_Release_Notes Release Notes] page.  Copy the contents, make a new one for your specific release.  Update the changelog, relnote anything big and important.  Link back to it from the &amp;quot;main&amp;quot; relnotes page.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Jump to the sourcemod account by logging into iroh as yourself:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/scripts/amjump sourcemod&lt;br /&gt;
cd /home/groups/sourcemod&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Edit the &amp;lt;tt&amp;gt;public_html/downloads.php&amp;lt;/tt&amp;gt; file with your favorite text editor.  Edit all instances of the old version with the new one.  Make sure to get every link, including relnotes.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Update ~/compiler-1.x to the latest minor version, where x is the major version number.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Run &amp;lt;tt&amp;gt;~/scripts/purge_old_builds.pl&amp;lt;/tt&amp;gt;, then edit its entry for 1.x.y, where x = this major release, and y = the new minor version.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Exit out of the sourcemod account.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Post news.  If you deviate from normal style, don't forget links for downloads, upgrading, and relnotes.  It also helps to say &amp;quot;this is backwards compatible&amp;quot; because users will always ask.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Updating the Metamod:Source Site=&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Jump to the alliedmodders account by logging into iroh as yourself:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/scripts/amjump alliedmodders&lt;br /&gt;
cd /groups/alliedmodders/hub/amhub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Edit the &amp;lt;tt&amp;gt;mmsource.py&amp;lt;/tt&amp;gt; file with your favorite text editor. Update the &amp;lt;tt&amp;gt;latest&amp;lt;/tt&amp;gt; version number in the &amp;lt;tt&amp;gt;downloads&amp;lt;/tt&amp;gt; function.  If this is a new major release (1.X.0), update the &amp;lt;tt&amp;gt;stable&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;devel&amp;lt;/tt&amp;gt; version numbers in the &amp;lt;tt&amp;gt;downloads&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;snapshots&amp;lt;/tt&amp;gt; functions.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Edit the &amp;lt;tt&amp;gt;templates/mmsource/downloads.html&amp;lt;/tt&amp;gt; file and update all Mercurial links with the tagged changeset ID for this release.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Edit the &amp;lt;tt&amp;gt;templates/mmsource/navbar.html&amp;lt;/tt&amp;gt; file and replace all instances of the old version with the new one.&lt;br /&gt;
 &amp;lt;li&amp;gt;Post news.  Do this by making a post in [https://forums.alliedmods.net/forumdisplay.php?f=124 this forum], which is private.  LOOK AT OLDER POSTS - you need to write valid XHTML!&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Exit out of the alliedmodders account.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Releasing_Products&amp;diff=7907</id>
		<title>Releasing Products</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Releasing_Products&amp;diff=7907"/>
		<updated>2010-12-20T04:12:38Z</updated>

		<summary type="html">&lt;p&gt;DS: /* Cleaning up the Tree */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is an internal page for doing AlliedModders product releases.&lt;br /&gt;
&lt;br /&gt;
=Making Builds=&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Once you are '''absolutely sure''' the product is ready for a release...&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Jump to a Linux system, check out the source tree.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Update the changelog (&amp;lt;tt&amp;gt;changelog.txt&amp;lt;/tt&amp;gt; for SourceMod, &amp;lt;tt&amp;gt;support/changelog.txt&amp;lt;/tt&amp;gt; for Metamod:Source).&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Edit the build_type file and change the &amp;quot;dev&amp;quot; string to &amp;quot;rel&amp;quot; (&amp;lt;tt&amp;gt;tools/buildbot/build_type&amp;lt;/tt&amp;gt; for SourceMod, &amp;lt;tt&amp;gt;support/buildbot/build_type&amp;lt;/tt&amp;gt; for Metamod:Source).&lt;br /&gt;
 &amp;lt;li&amp;gt;Edit &amp;lt;tt&amp;gt;product.version&amp;lt;/tt&amp;gt; to remove the -dev tag.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;For SourceMod, edit &amp;lt;tt&amp;gt;plugins/include/version.inc&amp;lt;/tt&amp;gt; to remove the -dev tag.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Commit the changes.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Push.  Watch the waterfall page until builds are complete.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Post-Build Work=&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Grab the binaries from the drop site ([http://metamodsource.net/mmsdrop/ MM:S drop site], [http://sourcemod.net/smdrop/ SourceMod drop site]).  It will be the latest package.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Install the packages on both Linux and Windows.  '''MAKE SURE THE VERSIONS ARE CORRECT.  THERE SHOULD BE NO -dev TAG.'''&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Metamod:Source checks:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
meta version&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
SourceMod checks:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sm plugins list&lt;br /&gt;
sm exts list&lt;br /&gt;
sm version&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;If the versions are not correct, do not release.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;For SourceMod, you need to add the language translation packs.  &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  '''If this is a major release (1.X.0), there is no prior pack.  Make one:'''&lt;br /&gt;
  &amp;lt;ol&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Extract both the tar.gz and zip files to separate folders.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Visit the [http://www.sourcemod.net/translator/?go=translate&amp;amp;op=status translator status page].&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Click &amp;quot;export languages.cfg&amp;quot; - save the new version to &amp;lt;tt&amp;gt;addons/sourcemod/configs/&amp;lt;/tt&amp;gt;, overwriting the old one.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Click &amp;quot;export&amp;quot; next to each language that is finished.  Extract the folder to &amp;lt;tt&amp;gt;addons/sourcemod/translations/&amp;lt;/tt&amp;gt;.  For example, if you extract Spanish, you should have &amp;lt;tt&amp;gt;addons/sourcemod/translations/es/&amp;lt;/tt&amp;gt; complete with ML files.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Repackage thefolders using the correct compression types (.tar.gz for Linux, .zip for Windows).&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;If this is a minor release (1.X.Y where Y != 0), there is already a prior pack.  Add it in:&amp;lt;/b&amp;gt;&lt;br /&gt;
  &amp;lt;ol&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Extract both the tar.gz and zip files to separate folders.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Download the last minor release from the same branch as this release.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Copy the &amp;lt;tt&amp;gt;addons/sourcemod/configs/languages.cfg&amp;lt;/tt&amp;gt; file from the old release over the new one.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Copy the &amp;lt;tt&amp;gt;addons/sourcemod/translations/&amp;lt;/tt&amp;gt; sub-folders from the old release over to the new one.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Repackage thefolders using the correct compression types (.tar.gz for Linux, .zip for Windows).&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;/ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;The build is done!&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Releasing to Mirrors=&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Log into iroh as yourself.  Upload your final builds to your home directory.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Run:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/scripts/amjump mirror&lt;br /&gt;
cd /scripts/mirror&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Copy your final builds from your home directory into the mirror folder.  Rename them to release names, for example: &amp;lt;tt&amp;gt;sourcemod-1.1.2.zip&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;mmsource-1.8.0.zip&amp;lt;/tt&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Mirror distribution is done with the following command:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./mirror.pl &amp;lt;projectID&amp;gt; &amp;lt;releaseName&amp;gt; &amp;lt;file&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Metamod:Source's ID is 4, SourceMod's ID is 2.  For example, these commands mirrored the Metamod:Source 1.7.0 release:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./mirror.pl 4 1.7.0 mmsource-1.7.0.zip&lt;br /&gt;
./mirror.pl 4 1.7.0 mmsource-1.7.0.tar.gz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
These commands mirrored the last SourceMod release:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./mirror.pl 2 1.1.1 sourcemod-1.1.1.tar.gz&lt;br /&gt;
./mirror.pl 2 1.1.1 sourcemod-1.1.1.zip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Type &amp;lt;tt&amp;gt;exit&amp;lt;/tt&amp;gt; to get back to your user account.  You're done!&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Cleaning up the Tree=&lt;br /&gt;
It's time to make sure the tree is set for future development.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Run &amp;lt;tt&amp;gt;hg tag&amp;lt;/tt&amp;gt; on the last revision of the release.  Usually this is the changeset that bumped versions, and usually this is &amp;lt;tt&amp;gt;tip&amp;lt;/tt&amp;gt;.  For example, Metamod:Source:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg tag mmsource-1.7.2&amp;lt;/pre&amp;gt;&lt;br /&gt;
SourceMod:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg tag sourcemod-1.1.2&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Bump the minor version in &amp;lt;tt&amp;gt;product.version&amp;lt;/tt&amp;gt;. Don't forget to add -dev.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Change the &amp;lt;tt&amp;gt;tools/buildbot/build_type&amp;lt;/tt&amp;gt; (SourceMod) or &amp;lt;tt&amp;gt;support/buildbot/build_type&amp;lt;/tt&amp;gt; (Metamod:Source) contents back to &amp;quot;dev&amp;quot;.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;For SourceMod, bump the two minor versions in &amp;lt;tt&amp;gt;plugins/include/version.inc&amp;lt;/tt&amp;gt; and re-add the -dev tag to the version string.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Commit and push.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Updating the SourceMod Site=&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Visit a [http://wiki.alliedmods.net/SourceMod_Release_Notes Release Notes] page.  Copy the contents, make a new one for your specific release.  Update the changelog, relnote anything big and important.  Link back to it from the &amp;quot;main&amp;quot; relnotes page.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Jump to the sourcemod account by logging into iroh as yourself:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/scripts/amjump sourcemod&lt;br /&gt;
cd /home/groups/sourcemod&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Edit the &amp;lt;tt&amp;gt;public_html/downloads.php&amp;lt;/tt&amp;gt; file with your favorite text editor.  Edit all instances of the old version with the new one.  Make sure to get every link, including relnotes.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Update ~/compiler-1.x to the latest minor version, where x is the major version number.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Run &amp;lt;tt&amp;gt;~/scripts/purge_old_builds.pl&amp;lt;/tt&amp;gt;, then edit its entry for 1.x.y, where x = this major release, and y = the new minor version.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Exit out of the sourcemod account.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Post news.  If you deviate from normal style, don't forget links for downloads, upgrading, and relnotes.  It also helps to say &amp;quot;this is backwards compatible&amp;quot; because users will always ask.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Updating the Metamod:Source Site=&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Jump to the sourcemm account by logging into iroh as yourself:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/scripts/amjump sourcemm&lt;br /&gt;
cd /home/groups/sourcemm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Edit the &amp;lt;tt&amp;gt;public_html/templates/content_downloads.tpl&amp;lt;/tt&amp;gt; file with your favorite text editor.  Edit all instances of the old version with the new one.  Update all Mercurial links with the tagged changeset ID for this release.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Post news.  Do this by making a post in [https://forums.alliedmods.net/forumdisplay.php?f=124 this forum], which is private.  LOOK AT OLDER POSTS - you need to write valid XHTML!&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Exit out of the sourcemm account.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Releasing_Products&amp;diff=7906</id>
		<title>Releasing Products</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Releasing_Products&amp;diff=7906"/>
		<updated>2010-12-20T04:10:09Z</updated>

		<summary type="html">&lt;p&gt;DS: /* Making Builds */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is an internal page for doing AlliedModders product releases.&lt;br /&gt;
&lt;br /&gt;
=Making Builds=&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Once you are '''absolutely sure''' the product is ready for a release...&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Jump to a Linux system, check out the source tree.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Update the changelog (&amp;lt;tt&amp;gt;changelog.txt&amp;lt;/tt&amp;gt; for SourceMod, &amp;lt;tt&amp;gt;support/changelog.txt&amp;lt;/tt&amp;gt; for Metamod:Source).&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Edit the build_type file and change the &amp;quot;dev&amp;quot; string to &amp;quot;rel&amp;quot; (&amp;lt;tt&amp;gt;tools/buildbot/build_type&amp;lt;/tt&amp;gt; for SourceMod, &amp;lt;tt&amp;gt;support/buildbot/build_type&amp;lt;/tt&amp;gt; for Metamod:Source).&lt;br /&gt;
 &amp;lt;li&amp;gt;Edit &amp;lt;tt&amp;gt;product.version&amp;lt;/tt&amp;gt; to remove the -dev tag.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;For SourceMod, edit &amp;lt;tt&amp;gt;plugins/include/version.inc&amp;lt;/tt&amp;gt; to remove the -dev tag.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Commit the changes.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Push.  Watch the waterfall page until builds are complete.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Post-Build Work=&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Grab the binaries from the drop site ([http://metamodsource.net/mmsdrop/ MM:S drop site], [http://sourcemod.net/smdrop/ SourceMod drop site]).  It will be the latest package.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Install the packages on both Linux and Windows.  '''MAKE SURE THE VERSIONS ARE CORRECT.  THERE SHOULD BE NO -dev TAG.'''&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Metamod:Source checks:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
meta version&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
SourceMod checks:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sm plugins list&lt;br /&gt;
sm exts list&lt;br /&gt;
sm version&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;If the versions are not correct, do not release.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;For SourceMod, you need to add the language translation packs.  &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  '''If this is a major release (1.X.0), there is no prior pack.  Make one:'''&lt;br /&gt;
  &amp;lt;ol&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Extract both the tar.gz and zip files to separate folders.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Visit the [http://www.sourcemod.net/translator/?go=translate&amp;amp;op=status translator status page].&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Click &amp;quot;export languages.cfg&amp;quot; - save the new version to &amp;lt;tt&amp;gt;addons/sourcemod/configs/&amp;lt;/tt&amp;gt;, overwriting the old one.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Click &amp;quot;export&amp;quot; next to each language that is finished.  Extract the folder to &amp;lt;tt&amp;gt;addons/sourcemod/translations/&amp;lt;/tt&amp;gt;.  For example, if you extract Spanish, you should have &amp;lt;tt&amp;gt;addons/sourcemod/translations/es/&amp;lt;/tt&amp;gt; complete with ML files.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Repackage thefolders using the correct compression types (.tar.gz for Linux, .zip for Windows).&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;If this is a minor release (1.X.Y where Y != 0), there is already a prior pack.  Add it in:&amp;lt;/b&amp;gt;&lt;br /&gt;
  &amp;lt;ol&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Extract both the tar.gz and zip files to separate folders.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Download the last minor release from the same branch as this release.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Copy the &amp;lt;tt&amp;gt;addons/sourcemod/configs/languages.cfg&amp;lt;/tt&amp;gt; file from the old release over the new one.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Copy the &amp;lt;tt&amp;gt;addons/sourcemod/translations/&amp;lt;/tt&amp;gt; sub-folders from the old release over to the new one.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Repackage thefolders using the correct compression types (.tar.gz for Linux, .zip for Windows).&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;/ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;The build is done!&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Releasing to Mirrors=&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Log into iroh as yourself.  Upload your final builds to your home directory.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Run:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/scripts/amjump mirror&lt;br /&gt;
cd /scripts/mirror&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Copy your final builds from your home directory into the mirror folder.  Rename them to release names, for example: &amp;lt;tt&amp;gt;sourcemod-1.1.2.zip&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;mmsource-1.8.0.zip&amp;lt;/tt&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Mirror distribution is done with the following command:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./mirror.pl &amp;lt;projectID&amp;gt; &amp;lt;releaseName&amp;gt; &amp;lt;file&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Metamod:Source's ID is 4, SourceMod's ID is 2.  For example, these commands mirrored the Metamod:Source 1.7.0 release:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./mirror.pl 4 1.7.0 mmsource-1.7.0.zip&lt;br /&gt;
./mirror.pl 4 1.7.0 mmsource-1.7.0.tar.gz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
These commands mirrored the last SourceMod release:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./mirror.pl 2 1.1.1 sourcemod-1.1.1.tar.gz&lt;br /&gt;
./mirror.pl 2 1.1.1 sourcemod-1.1.1.zip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Type &amp;lt;tt&amp;gt;exit&amp;lt;/tt&amp;gt; to get back to your user account.  You're done!&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Cleaning up the Tree=&lt;br /&gt;
It's time to make sure the tree is set for future development.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Run &amp;lt;tt&amp;gt;hg tag&amp;lt;/tt&amp;gt; on the last revision of the release.  Usually this is the changeset that bumped versions, and usually this is &amp;lt;tt&amp;gt;tip&amp;lt;/tt&amp;gt;.  For example, Metamod:Source:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg tag mmsource-1.7.2&amp;lt;/pre&amp;gt;&lt;br /&gt;
SourceMod:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg tag sourcemod-1.1.2&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Bump the minor version in &amp;lt;tt&amp;gt;product.version&amp;lt;/tt&amp;gt;. Don't forget to add -dev.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Change the &amp;lt;tt&amp;gt;tools/buildbot/build_type&amp;lt;/tt&amp;gt; contents back to &amp;quot;dev&amp;quot;.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;For SourceMod, bump the two minor versions in &amp;lt;tt&amp;gt;plugins/include/version.inc&amp;lt;/tt&amp;gt; and re-add the -dev tag to the version string.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Commit and push.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Updating the SourceMod Site=&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Visit a [http://wiki.alliedmods.net/SourceMod_Release_Notes Release Notes] page.  Copy the contents, make a new one for your specific release.  Update the changelog, relnote anything big and important.  Link back to it from the &amp;quot;main&amp;quot; relnotes page.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Jump to the sourcemod account by logging into iroh as yourself:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/scripts/amjump sourcemod&lt;br /&gt;
cd /home/groups/sourcemod&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Edit the &amp;lt;tt&amp;gt;public_html/downloads.php&amp;lt;/tt&amp;gt; file with your favorite text editor.  Edit all instances of the old version with the new one.  Make sure to get every link, including relnotes.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Update ~/compiler-1.x to the latest minor version, where x is the major version number.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Run &amp;lt;tt&amp;gt;~/scripts/purge_old_builds.pl&amp;lt;/tt&amp;gt;, then edit its entry for 1.x.y, where x = this major release, and y = the new minor version.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Exit out of the sourcemod account.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Post news.  If you deviate from normal style, don't forget links for downloads, upgrading, and relnotes.  It also helps to say &amp;quot;this is backwards compatible&amp;quot; because users will always ask.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Updating the Metamod:Source Site=&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Jump to the sourcemm account by logging into iroh as yourself:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/scripts/amjump sourcemm&lt;br /&gt;
cd /home/groups/sourcemm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Edit the &amp;lt;tt&amp;gt;public_html/templates/content_downloads.tpl&amp;lt;/tt&amp;gt; file with your favorite text editor.  Edit all instances of the old version with the new one.  Update all Mercurial links with the tagged changeset ID for this release.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Post news.  Do this by making a post in [https://forums.alliedmods.net/forumdisplay.php?f=124 this forum], which is private.  LOOK AT OLDER POSTS - you need to write valid XHTML!&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Exit out of the sourcemm account.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=SourceMod_1.3.6_Release_Notes&amp;diff=7874</id>
		<title>SourceMod 1.3.6 Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=SourceMod_1.3.6_Release_Notes&amp;diff=7874"/>
		<updated>2010-10-30T23:32:46Z</updated>

		<summary type="html">&lt;p&gt;DS: Fixed bug numbers&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__&lt;br /&gt;
SourceMod 1.3.6 is a minor bug-fix update. For the full SourceMod 1.3 release notes, [[SourceMod 1.3.0 Release Notes|click here]].&lt;br /&gt;
&lt;br /&gt;
=Changelog=&lt;br /&gt;
&lt;br /&gt;
User Changes:&lt;br /&gt;
&lt;br /&gt;
*Updated support for latest Left 4 Dead 1 ({{bz|4681}}).&lt;br /&gt;
&lt;br /&gt;
Developer Changes:&lt;br /&gt;
&lt;br /&gt;
*Updated TF2 custom kill defines ({{bz|4682}}).&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=CTFPlayer_Offset_List_(Team_Fortress_2)&amp;diff=7689</id>
		<title>CTFPlayer Offset List (Team Fortress 2)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=CTFPlayer_Offset_List_(Team_Fortress_2)&amp;diff=7689"/>
		<updated>2010-04-30T03:32:08Z</updated>

		<summary type="html">&lt;p&gt;DS: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Also for use when using [[Virtual Offsets (Source Mods)|virtual offsets]].&lt;br /&gt;
&lt;br /&gt;
These are the &amp;lt;b&amp;gt;Windows&amp;lt;/b&amp;gt; offsets. &amp;lt;b&amp;gt;Linux offsets are 1 greater.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The List ==&lt;br /&gt;
This comes from the symbol tables, so you'll have to look in the SDK for return types.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Last Updated 29 April 2010&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Auto reconstructed from vtable block @ 0x00BDC3A0&lt;br /&gt;
// from &amp;quot;server.so&amp;quot;, by ida_vtables.idc&lt;br /&gt;
0	CTFPlayer::~CTFPlayer()&lt;br /&gt;
1	CBaseEntity::SetRefEHandle(CBaseHandle  const&amp;amp;)&lt;br /&gt;
2	CBaseEntity::GetRefEHandle(void)const&lt;br /&gt;
3	CBaseEntity::GetCollideable(void)&lt;br /&gt;
4	CBaseEntity::GetNetworkable(void)&lt;br /&gt;
5	CBaseEntity::GetBaseEntity(void)&lt;br /&gt;
6	CBaseEntity::GetModelIndex(void)const&lt;br /&gt;
7	CBaseEntity::GetModelName(void)const&lt;br /&gt;
8	CBaseEntity::SetModelIndex(int)&lt;br /&gt;
9	CTFPlayer::GetServerClass(void)&lt;br /&gt;
10	CTFPlayer::YouForgotToImplementOrDeclareServerClass(void)&lt;br /&gt;
11	CTFPlayer::GetDataDescMap(void)&lt;br /&gt;
12	CBaseAnimating::TestCollision(Ray_t  const&amp;amp;,unsigned int,CGameTrace &amp;amp;)&lt;br /&gt;
13	CBaseAnimating::TestHitboxes(Ray_t  const&amp;amp;,unsigned int,CGameTrace &amp;amp;)&lt;br /&gt;
14	CBaseEntity::ComputeWorldSpaceSurroundingBox(Vector *,Vector *)&lt;br /&gt;
15	CTFPlayer::ShouldCollide(int,int)const&lt;br /&gt;
16	CBaseEntity::SetOwnerEntity(CBaseEntity*)&lt;br /&gt;
17	CBasePlayer::ShouldTransmit(CCheckTransmitInfo  const*)&lt;br /&gt;
18	CBasePlayer::UpdateTransmitState(void)&lt;br /&gt;
19	CBaseCombatCharacter::SetTransmit(CCheckTransmitInfo *,bool)&lt;br /&gt;
20	CBasePlayer::GetTracerType(void)&lt;br /&gt;
21	CTFPlayer::Spawn(void)&lt;br /&gt;
22	CTFPlayer::Precache(void)&lt;br /&gt;
23	CBasePlayer::SetModel(char  const*)&lt;br /&gt;
24	CBaseMultiplayerPlayer::PostConstructor(char  const*)&lt;br /&gt;
25	CBaseEntity::PostClientActive(void)&lt;br /&gt;
26	CBaseEntity::ParseMapData(CEntityMapData *)&lt;br /&gt;
27	CBaseEntity::KeyValue(char  const*,char  const*)&lt;br /&gt;
28	CBaseEntity::KeyValue(char  const*,float)&lt;br /&gt;
29	CBaseEntity::KeyValue(char  const*,Vector  const&amp;amp;)&lt;br /&gt;
30	CBaseEntity::GetKeyValue(char  const*,char *,int)&lt;br /&gt;
31	CBasePlayer::Activate(void)&lt;br /&gt;
32	CBaseEntity::SetParent(CBaseEntity*,int)&lt;br /&gt;
33	CBasePlayer::ObjectCaps(void)&lt;br /&gt;
34	CBaseEntity::AcceptInput(char  const*,CBaseEntity*,CBaseEntity*,variant_t,int)&lt;br /&gt;
35	CBaseAnimating::GetInputDispatchEffectPosition(char  const*,Vector &amp;amp;,QAngle &amp;amp;)&lt;br /&gt;
36	CBasePlayer::DrawDebugGeometryOverlays(void)&lt;br /&gt;
37	CTFPlayer::DrawDebugTextOverlays(void)&lt;br /&gt;
38	CBasePlayer::Save(ISave &amp;amp;)&lt;br /&gt;
39	CBasePlayer::Restore(IRestore &amp;amp;)&lt;br /&gt;
40	CBasePlayer::ShouldSavePhysics(void)&lt;br /&gt;
41	CBaseEntity::OnSave(IEntitySaveUtils *)&lt;br /&gt;
42	CBasePlayer::OnRestore(void)&lt;br /&gt;
43	CBasePlayer::RequiredEdictIndex(void)&lt;br /&gt;
44	CBaseEntity::MoveDone(void)&lt;br /&gt;
45	CBaseEntity::Think(void)&lt;br /&gt;
46	CBasePlayer::NetworkStateChanged_m_nNextThinkTick(void)&lt;br /&gt;
47	CBasePlayer::NetworkStateChanged_m_nNextThinkTick(void *)&lt;br /&gt;
48	CBaseAnimating::GetBaseAnimating(void)&lt;br /&gt;
49	CTFPlayer::GetResponseSystem(void)&lt;br /&gt;
50	CAI_ExpresserHost&amp;lt;CBasePlayer&amp;gt;::DispatchResponse(char  const*)&lt;br /&gt;
51	CBasePlayer::Classify(void)&lt;br /&gt;
52	CBaseEntity::DeathNotice(CBaseEntity*)&lt;br /&gt;
53	CBaseEntity::ShouldAttractAutoAim(CBaseEntity*)&lt;br /&gt;
54	CBaseEntity::GetAutoAimRadius(void)&lt;br /&gt;
55	CBaseEntity::GetAutoAimCenter(void)&lt;br /&gt;
56	CBaseEntity::GetBeamTraceFilter(void)&lt;br /&gt;
57	CBaseEntity::PassesDamageFilter(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
58	CTFPlayer::TraceAttack(CTakeDamageInfo  const&amp;amp;,Vector  const&amp;amp;,CGameTrace *)&lt;br /&gt;
59	CBaseEntity::CanBeHitByMeleeAttack(CBaseEntity*)&lt;br /&gt;
60	CTFPlayer::OnTakeDamage(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
61	CBaseEntity::AdjustDamageDirection(CTakeDamageInfo  const&amp;amp;,Vector &amp;amp;,CBaseEntity*)&lt;br /&gt;
62	CTFPlayer::TakeHealth(float,int)&lt;br /&gt;
63	CBaseEntity::IsAlive(void)&lt;br /&gt;
64	CTFPlayer::Event_Killed(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
65	CTFPlayer::Event_KilledOther(CBaseEntity *,CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
66	CBaseCombatCharacter::BloodColor(void)&lt;br /&gt;
67	CBaseEntity::IsTriggered(CBaseEntity*)&lt;br /&gt;
68	CBaseEntity::IsNPC(void)const&lt;br /&gt;
69	CBaseCombatCharacter::MyCombatCharacterPointer(void)&lt;br /&gt;
70	CBaseEntity::MyNextBotPointer(void)&lt;br /&gt;
71	CBaseEntity::GetDelay(void)&lt;br /&gt;
72	CBaseEntity::IsMoving(void)&lt;br /&gt;
73	CBaseEntity::DamageDecal(int,int)&lt;br /&gt;
74	CBaseEntity::DecalTrace(CGameTrace *,char  const*)&lt;br /&gt;
75	CBaseEntity::ImpactTrace(CGameTrace *,int,char *)&lt;br /&gt;
76	CBaseEntity::OnControls(CBaseEntity*)&lt;br /&gt;
77	CBaseEntity::HasTarget(string_t)&lt;br /&gt;
78	CBasePlayer::IsPlayer(void)const&lt;br /&gt;
79	CBasePlayer::IsNetClient(void)const&lt;br /&gt;
80	CBaseEntity::IsTemplate(void)&lt;br /&gt;
81	CBaseEntity::IsBaseObject(void)const&lt;br /&gt;
82	CBaseEntity::IsBaseTrain(void)const&lt;br /&gt;
83	CBaseEntity::IsBaseCombatWeapon(void)const&lt;br /&gt;
84	CBaseEntity::IsWearable(void)const&lt;br /&gt;
85	CBaseEntity::MyCombatWeaponPointer(void)&lt;br /&gt;
86	CBaseEntity::GetServerVehicle(void)&lt;br /&gt;
87	CBaseEntity::IsViewable(void)&lt;br /&gt;
88	CTFPlayer::ChangeTeam(int)&lt;br /&gt;
89	CBaseEntity::OnEntityEvent(EntityEvent_t,void *)&lt;br /&gt;
90	CBaseEntity::CanStandOn(CBaseEntity*)const&lt;br /&gt;
91	CBaseEntity::CanStandOn(edict_t *)const&lt;br /&gt;
92	CBaseEntity::GetEnemy(void)&lt;br /&gt;
93	CBaseEntity::GetEnemy(void)const&lt;br /&gt;
94	CBaseEntity::Use(CBaseEntity*,CBaseEntity*,USE_TYPE,float)&lt;br /&gt;
95	CBaseEntity::StartTouch(CBaseEntity*)&lt;br /&gt;
96	CTFPlayer::Touch(CBaseEntity *)&lt;br /&gt;
97	CBaseEntity::EndTouch(CBaseEntity*)&lt;br /&gt;
98	CBaseEntity::StartBlocked(CBaseEntity*)&lt;br /&gt;
99	CBaseEntity::Blocked(CBaseEntity*)&lt;br /&gt;
100	CBaseEntity::EndBlocked(void)&lt;br /&gt;
101	CBasePlayer::PhysicsSimulate(void)&lt;br /&gt;
102	CTFPlayer::UpdateOnRemove(void)&lt;br /&gt;
103	CBaseEntity::StopLoopingSounds(void)&lt;br /&gt;
104	CBaseEntity::SUB_AllowedToFade(void)&lt;br /&gt;
105	CBaseFlex::Teleport(Vector  const*,QAngle  const*,Vector  const*)&lt;br /&gt;
106	CBaseEntity::NotifySystemEvent(CBaseEntity*,notify_system_event_t,notify_system_event_params_t  const&amp;amp;)&lt;br /&gt;
107	CBasePlayer::MakeTracer(Vector  const&amp;amp;,CGameTrace  const&amp;amp;,int)&lt;br /&gt;
108	CBaseEntity::GetTracerAttachment(void)&lt;br /&gt;
109	CBaseEntity::FireBullets(FireBulletsInfo_t  const&amp;amp;)&lt;br /&gt;
110	CBasePlayer::DoImpactEffect(CGameTrace &amp;amp;,int)&lt;br /&gt;
111	CBaseEntity::ModifyFireBulletsDamage(CTakeDamageInfo *)&lt;br /&gt;
112	CBaseEntity::Respawn(void)&lt;br /&gt;
113	CBaseEntity::IsLockedByMaster(void)&lt;br /&gt;
114	CTFPlayer::GetMaxHealth(void)const&lt;br /&gt;
115	CTFPlayer::ModifyOrAppendCriteria(AI_CriteriaSet &amp;amp;)&lt;br /&gt;
116	CBaseEntity::NetworkStateChanged_m_iMaxHealth(void)&lt;br /&gt;
117	CBaseEntity::NetworkStateChanged_m_iMaxHealth(void *)&lt;br /&gt;
118	CBasePlayer::NetworkStateChanged_m_iHealth(void)&lt;br /&gt;
119	CBasePlayer::NetworkStateChanged_m_iHealth(void *)&lt;br /&gt;
120	CBasePlayer::NetworkStateChanged_m_lifeState(void)&lt;br /&gt;
121	CBasePlayer::NetworkStateChanged_m_lifeState(void *)&lt;br /&gt;
122	CBaseEntity::NetworkStateChanged_m_takedamage(void)&lt;br /&gt;
123	CBaseEntity::NetworkStateChanged_m_takedamage(void *)&lt;br /&gt;
124	CBaseEntity::GetDamageType(void)const&lt;br /&gt;
125	CBaseEntity::GetDamage(void)&lt;br /&gt;
126	CBaseEntity::SetDamage(float)&lt;br /&gt;
127	CBasePlayer::EyePosition(void)&lt;br /&gt;
128	CBasePlayer::EyeAngles(void)&lt;br /&gt;
129	CBasePlayer::LocalEyeAngles(void)&lt;br /&gt;
130	CBaseEntity::EarPosition(void)&lt;br /&gt;
131	CBasePlayer::BodyTarget(Vector  const&amp;amp;,bool)&lt;br /&gt;
132	CBaseEntity::HeadTarget(Vector  const&amp;amp;)&lt;br /&gt;
133	CBaseEntity::GetVectors(Vector *,Vector *,Vector *)const&lt;br /&gt;
134	CBaseEntity::GetViewOffset(void)const&lt;br /&gt;
135	CBaseEntity::SetViewOffset(Vector  const&amp;amp;)&lt;br /&gt;
136	CBasePlayer::GetSmoothedVelocity(void)&lt;br /&gt;
137	CBaseAnimating::GetVelocity(Vector *,Vector *)&lt;br /&gt;
138	CBaseCombatCharacter::FVisible(CBaseEntity *,int,CBaseEntity **)&lt;br /&gt;
139	CBaseCombatCharacter::FVisible(Vector  const&amp;amp;,int,CBaseEntity **)&lt;br /&gt;
140	CBaseEntity::CanBeSeenBy(CAI_BaseNPC *)&lt;br /&gt;
141	CBaseEntity::GetAttackDamageScale(CBaseEntity*)&lt;br /&gt;
142	CBaseEntity::GetReceivedDamageScale(CBaseEntity*)&lt;br /&gt;
143	CBaseEntity::GetGroundVelocityToApply(Vector &amp;amp;)&lt;br /&gt;
144	CBaseEntity::PhysicsSplash(Vector  const&amp;amp;,Vector  const&amp;amp;,float,float)&lt;br /&gt;
145	CBaseEntity::Splash(void)&lt;br /&gt;
146	CBaseEntity::WorldSpaceCenter(void)const&lt;br /&gt;
147	CBaseEntity::GetSoundEmissionOrigin(void)const&lt;br /&gt;
148	CTFPlayer::IsDeflectable(void)&lt;br /&gt;
149	CBaseEntity::Deflected(CBaseEntity*,Vector &amp;amp;)&lt;br /&gt;
150	CBaseEntity::CreateVPhysics(void)&lt;br /&gt;
151	CBaseEntity::ForceVPhysicsCollide(CBaseEntity*)&lt;br /&gt;
152	CBasePlayer::VPhysicsDestroyObject(void)&lt;br /&gt;
153	CBasePlayer::VPhysicsUpdate(IPhysicsObject *)&lt;br /&gt;
154	CBaseEntity::VPhysicsTakeDamage(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
155	CBaseCombatCharacter::VPhysicsShadowCollision(int,gamevcollisionevent_t *)&lt;br /&gt;
156	CBasePlayer::VPhysicsShadowUpdate(IPhysicsObject *)&lt;br /&gt;
157	CBasePlayer::VPhysicsCollision(int,gamevcollisionevent_t *)&lt;br /&gt;
158	CBaseEntity::VPhysicsFriction(IPhysicsObject *,float,int,int)&lt;br /&gt;
159	CBaseEntity::UpdatePhysicsShadowToCurrentPosition(float)&lt;br /&gt;
160	CBaseEntity::VPhysicsGetObjectList(IPhysicsObject **,int)&lt;br /&gt;
161	CBaseEntity::VPhysicsIsFlesh(void)&lt;br /&gt;
162	CBaseEntity::HasPhysicsAttacker(float)&lt;br /&gt;
163	CBasePlayer::PhysicsSolidMaskForEntity(void)const&lt;br /&gt;
164	CBaseEntity::ResolveFlyCollisionCustom(CGameTrace &amp;amp;,Vector &amp;amp;)&lt;br /&gt;
165	CBaseEntity::PerformCustomPhysics(Vector *,Vector *,QAngle *,QAngle *)&lt;br /&gt;
166	CBaseAnimating::GetStepOrigin(void)const&lt;br /&gt;
167	CBaseAnimating::GetStepAngles(void)const&lt;br /&gt;
168	CBaseEntity::ShouldDrawWaterImpacts(void)&lt;br /&gt;
169	CBasePlayer::NetworkStateChanged_m_fFlags(void)&lt;br /&gt;
170	CBasePlayer::NetworkStateChanged_m_fFlags(void *)&lt;br /&gt;
171	CBasePlayer::NetworkStateChanged_m_nWaterLevel(void)&lt;br /&gt;
172	CBasePlayer::NetworkStateChanged_m_nWaterLevel(void *)&lt;br /&gt;
173	CBasePlayer::NetworkStateChanged_m_hGroundEntity(void)&lt;br /&gt;
174	CBasePlayer::NetworkStateChanged_m_hGroundEntity(void *)&lt;br /&gt;
175	CBasePlayer::NetworkStateChanged_m_vecBaseVelocity(void)&lt;br /&gt;
176	CBasePlayer::NetworkStateChanged_m_vecBaseVelocity(void *)&lt;br /&gt;
177	CBasePlayer::NetworkStateChanged_m_flFriction(void)&lt;br /&gt;
178	CBasePlayer::NetworkStateChanged_m_flFriction(void *)&lt;br /&gt;
179	CBasePlayer::NetworkStateChanged_m_vecVelocity(void)&lt;br /&gt;
180	CBasePlayer::NetworkStateChanged_m_vecVelocity(void *)&lt;br /&gt;
181	CBasePlayer::NetworkStateChanged_m_vecViewOffset(void)&lt;br /&gt;
182	CBasePlayer::NetworkStateChanged_m_vecViewOffset(void *)&lt;br /&gt;
183	CBaseAnimating::GetIdealSpeed(void)const&lt;br /&gt;
184	CBaseAnimating::GetIdealAccel(void)const&lt;br /&gt;
185	CBaseAnimatingOverlay::StudioFrameAdvance(void)&lt;br /&gt;
186	CBaseAnimating::IsActivityFinished(void)&lt;br /&gt;
187	CBaseAnimating::GetSequenceGroundSpeed(CStudioHdr *,int)&lt;br /&gt;
188	CBaseAnimating::ClampRagdollForce(Vector  const&amp;amp;,Vector*)&lt;br /&gt;
189	CBaseAnimating::BecomeRagdollOnClient(Vector  const&amp;amp;)&lt;br /&gt;
190	CBaseAnimating::IsRagdoll(void)&lt;br /&gt;
191	CBaseAnimating::CanBecomeRagdoll(void)&lt;br /&gt;
192	CBaseAnimatingOverlay::GetSkeleton(CStudioHdr *,Vector *,Quaternion *,int)&lt;br /&gt;
193	CBaseAnimating::GetBoneTransform(int,matrix3x4_t &amp;amp;)&lt;br /&gt;
194	CBaseAnimating::SetupBones(matrix3x4_t *,int)&lt;br /&gt;
195	CBaseAnimating::CalculateIKLocks(float)&lt;br /&gt;
196	CBaseAnimatingOverlay::DispatchAnimEvents(CBaseAnimating *)&lt;br /&gt;
197	CBasePlayer::HandleAnimEvent(animevent_t *)&lt;br /&gt;
198	CBaseAnimating::PopulatePoseParameters(void)&lt;br /&gt;
199	CBaseAnimating::GetAttachment(int,matrix3x4_t &amp;amp;)&lt;br /&gt;
200	CBaseAnimating::InitBoneControllers(void)&lt;br /&gt;
201	CBaseAnimating::GetGroundSpeedVelocity(void)&lt;br /&gt;
202	CBaseAnimating::Ignite(float,bool,float,bool)&lt;br /&gt;
203	CBaseAnimating::IgniteLifetime(float)&lt;br /&gt;
204	CBaseAnimating::IgniteNumHitboxFires(int)&lt;br /&gt;
205	CBaseAnimating::IgniteHitboxFireScale(float)&lt;br /&gt;
206	CBaseAnimating::Extinguish(void)&lt;br /&gt;
207	CBaseCombatCharacter::SetLightingOriginRelative(CBaseEntity *)&lt;br /&gt;
208	CBaseAnimating::SetLightingOrigin(CBaseEntity *)&lt;br /&gt;
209	CBaseFlex::SetViewtarget(Vector  const&amp;amp;)&lt;br /&gt;
210	CBaseFlex::StartSceneEvent(CSceneEventInfo *,CChoreoScene *,CChoreoEvent *,CChoreoActor *,CBaseEntity *)&lt;br /&gt;
211	CBaseFlex::ProcessSceneEvents(void)&lt;br /&gt;
212	CBaseFlex::ProcessSceneEvent(CSceneEventInfo *,CChoreoScene *,CChoreoEvent *)&lt;br /&gt;
213	CBaseFlex::ClearSceneEvent(CSceneEventInfo *,bool,bool)&lt;br /&gt;
214	CBaseFlex::CheckSceneEventCompletion(CSceneEventInfo *,float,CChoreoScene *,CChoreoEvent *)&lt;br /&gt;
215	CTFPlayer::PlayScene(char  const*,float,AI_Response *,IRecipientFilter *)&lt;br /&gt;
216	CBaseFlex::PlayAutoGeneratedSoundScene(char  const*)&lt;br /&gt;
217	CBasePlayer::GetPhysicsImpactDamageTable(void)&lt;br /&gt;
218	CBaseCombatCharacter::FInViewCone(CBaseEntity *)&lt;br /&gt;
219	CBaseCombatCharacter::FInViewCone(Vector  const&amp;amp;)&lt;br /&gt;
220	CBaseCombatCharacter::FInAimCone(CBaseEntity *)&lt;br /&gt;
221	CBaseCombatCharacter::FInAimCone(Vector  const&amp;amp;)&lt;br /&gt;
222	CBaseCombatCharacter::ShouldShootMissTarget(CBaseCombatCharacter*)&lt;br /&gt;
223	CBaseCombatCharacter::FindMissTarget(void)&lt;br /&gt;
224	CBaseCombatCharacter::HandleInteraction(int,void *,CBaseCombatCharacter*)&lt;br /&gt;
225	CBasePlayer::BodyAngles(void)&lt;br /&gt;
226	CBaseCombatCharacter::BodyDirection2D(void)&lt;br /&gt;
227	CBaseCombatCharacter::BodyDirection3D(void)&lt;br /&gt;
228	CBaseCombatCharacter::HeadDirection2D(void)&lt;br /&gt;
229	CBaseCombatCharacter::HeadDirection3D(void)&lt;br /&gt;
230	CBaseCombatCharacter::EyeDirection2D(void)&lt;br /&gt;
231	CBaseCombatCharacter::EyeDirection3D(void)&lt;br /&gt;
232	CBaseCombatCharacter::IsHiddenByFog(Vector  const&amp;amp;)const&lt;br /&gt;
233	CBaseCombatCharacter::IsHiddenByFog(CBaseEntity *)const&lt;br /&gt;
234	CBaseCombatCharacter::IsHiddenByFog(float)const&lt;br /&gt;
235	CBaseCombatCharacter::GetFogObscuredRatio(Vector  const&amp;amp;)const&lt;br /&gt;
236	CBaseCombatCharacter::GetFogObscuredRatio(CBaseEntity *)const&lt;br /&gt;
237	CBaseCombatCharacter::GetFogObscuredRatio(float)const&lt;br /&gt;
238	CBaseCombatCharacter::IsLookingTowards(CBaseEntity  const*,float)const&lt;br /&gt;
239	CBaseCombatCharacter::IsLookingTowards(Vector  const&amp;amp;,float)const&lt;br /&gt;
240	CBaseCombatCharacter::IsInFieldOfView(CBaseEntity *)const&lt;br /&gt;
241	CBaseCombatCharacter::IsInFieldOfView(Vector  const&amp;amp;)const&lt;br /&gt;
242	CBaseCombatCharacter::IsLineOfSightClear(CBaseEntity *,CBaseCombatCharacter::LineOfSightCheckType)const&lt;br /&gt;
243	CBaseCombatCharacter::IsLineOfSightClear(Vector  const&amp;amp;,CBaseCombatCharacter::LineOfSightCheckType,CBaseEntity *)const&lt;br /&gt;
244	CTFPlayer::GiveAmmo(int,int,bool)&lt;br /&gt;
245	CBaseCombatCharacter::NPC_TranslateActivity(Activity)&lt;br /&gt;
246	CBaseCombatCharacter::Weapon_TranslateActivity(Activity,bool *)&lt;br /&gt;
247	CTFPlayer::Weapon_FrameUpdate(void)&lt;br /&gt;
248	CTFPlayer::Weapon_HandleAnimEvent(animevent_t *)&lt;br /&gt;
249	CBasePlayer::Weapon_CanUse(CBaseCombatWeapon *)&lt;br /&gt;
250	CBasePlayer::Weapon_Equip(CBaseCombatWeapon *)&lt;br /&gt;
251	CBaseCombatCharacter::Weapon_EquipAmmoOnly(CBaseCombatWeapon *)&lt;br /&gt;
252	CTFPlayer::Weapon_Drop(CBaseCombatWeapon *,Vector  const*,Vector  const*)&lt;br /&gt;
253	CTFPlayer::Weapon_Switch(CBaseCombatWeapon *,int)&lt;br /&gt;
254	CBasePlayer::Weapon_ShootPosition(void)&lt;br /&gt;
255	CBaseCombatCharacter::Weapon_CanSwitchTo(CBaseCombatWeapon *)&lt;br /&gt;
256	CBaseCombatCharacter::Weapon_SlotOccupied(CBaseCombatWeapon *)&lt;br /&gt;
257	CBaseCombatCharacter::Weapon_GetSlot(int)const&lt;br /&gt;
258	CBaseCombatCharacter::AddPlayerItem(CBaseCombatWeapon *)&lt;br /&gt;
259	CBasePlayer::RemovePlayerItem(CBaseCombatWeapon *)&lt;br /&gt;
260	CBaseCombatCharacter::CanBecomeServerRagdoll(void)&lt;br /&gt;
261	CTFPlayer::OnTakeDamage_Alive(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
262	CBaseCombatCharacter::OnTakeDamage_Dying(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
263	CBaseCombatCharacter::OnTakeDamage_Dead(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
264	CBaseCombatCharacter::GetAliveDuration(void)const&lt;br /&gt;
265	CBaseCombatCharacter::OnFriendDamaged(CBaseCombatCharacter*,CBaseEntity *)&lt;br /&gt;
266	CBaseCombatCharacter::NotifyFriendsOfDamage(CBaseEntity *)&lt;br /&gt;
267	CBaseCombatCharacter::HasEverBeenInjured(int)const&lt;br /&gt;
268	CBaseCombatCharacter::GetTimeSinceLastInjury(int)const&lt;br /&gt;
269	CBaseCombatCharacter::OnPlayerKilledOther(CBaseEntity *,CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
270	CBaseCombatCharacter::GetDeathActivity(void)&lt;br /&gt;
271	CBaseCombatCharacter::CorpseGib(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
272	CBaseCombatCharacter::CorpseFade(void)&lt;br /&gt;
273	CBaseCombatCharacter::HasHumanGibs(void)&lt;br /&gt;
274	CBaseCombatCharacter::HasAlienGibs(void)&lt;br /&gt;
275	CBaseCombatCharacter::ShouldGib(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
276	CBaseCombatCharacter::OnKilledNPC(CBaseCombatCharacter*)&lt;br /&gt;
277	CBaseCombatCharacter::Event_Gibbed(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
278	CBasePlayer::Event_Dying(void)&lt;br /&gt;
279	CBaseCombatCharacter::BecomeRagdoll(CTakeDamageInfo  const&amp;amp;,Vector  const&amp;amp;)&lt;br /&gt;
280	CBaseCombatCharacter::FixupBurningServerRagdoll(CBaseEntity *)&lt;br /&gt;
281	CBaseCombatCharacter::BecomeRagdollBoogie(CBaseEntity *,Vector  const&amp;amp;,float,int)&lt;br /&gt;
282	CBaseCombatCharacter::CheckTraceHullAttack(float,Vector  const&amp;amp;,Vector  const&amp;amp;,int,int,float,bool)&lt;br /&gt;
283	CBaseCombatCharacter::CheckTraceHullAttack(Vector  const&amp;amp;,Vector  const&amp;amp;,Vector  const&amp;amp;,Vector  const&amp;amp;,int,int,float,bool)&lt;br /&gt;
284	CBaseCombatCharacter::PushawayTouch(CBaseEntity *)&lt;br /&gt;
285	CBaseCombatCharacter::IRelationType(CBaseEntity *)&lt;br /&gt;
286	CBaseCombatCharacter::IRelationPriority(CBaseEntity *)&lt;br /&gt;
287	CBasePlayer::IsInAVehicle(void)const&lt;br /&gt;
288	CBasePlayer::GetVehicle(void)&lt;br /&gt;
289	CBasePlayer::GetVehicleEntity(void)&lt;br /&gt;
290	CBaseCombatCharacter::ExitVehicle(void)&lt;br /&gt;
291	CTFPlayer::RemoveAllWeapons(void)&lt;br /&gt;
292	CBaseCombatCharacter::CalcWeaponProficiency(CBaseCombatWeapon *)&lt;br /&gt;
293	CBaseCombatCharacter::GetAttackSpread(CBaseCombatWeapon *,CBaseEntity *)&lt;br /&gt;
294	CBaseCombatCharacter::GetSpreadBias(CBaseCombatWeapon *,CBaseEntity *)&lt;br /&gt;
295	CBasePlayer::DoMuzzleFlash(void)&lt;br /&gt;
296	CBaseCombatCharacter::AddEntityRelationship(CBaseEntity *,Disposition_t,int)&lt;br /&gt;
297	CBaseCombatCharacter::RemoveEntityRelationship(CBaseEntity *)&lt;br /&gt;
298	CBaseCombatCharacter::AddClassRelationship(Class_T,Disposition_t,int)&lt;br /&gt;
299	CBaseCombatCharacter::OnChangeActiveWeapon(CBaseCombatWeapon *,CBaseCombatWeapon *)&lt;br /&gt;
300	CBaseCombatCharacter::GetLastKnownArea(void)const&lt;br /&gt;
301	CBaseCombatCharacter::IsAreaTraversable(CNavArea  const*)const&lt;br /&gt;
302	CBaseCombatCharacter::ClearLastKnownArea(void)&lt;br /&gt;
303	CBaseCombatCharacter::UpdateLastKnownArea(void)&lt;br /&gt;
304	CTFPlayer::OnNavAreaChanged(CNavArea *,CNavArea *)&lt;br /&gt;
305	CBaseCombatCharacter::OnNavAreaRemoved(CNavArea *)&lt;br /&gt;
306	CBaseCombatCharacter::OnPursuedBy(INextBot *)&lt;br /&gt;
307	CBasePlayer::NetworkStateChanged_m_iAmmo(void)&lt;br /&gt;
308	CBasePlayer::NetworkStateChanged_m_iAmmo(void *)&lt;br /&gt;
309	CTFPlayer::CreateViewModel(int)&lt;br /&gt;
310	CBasePlayer::SetupVisibility(CBaseEntity *,unsigned char *,int)&lt;br /&gt;
311	CTFPlayer::WantsLagCompensationOnEntity(CBasePlayer  const*,CUserCmd  const*,CBitVec&amp;lt;2048&amp;gt;  const*)const&lt;br /&gt;
312	CBasePlayer::SharedSpawn(void)&lt;br /&gt;
313	CTFPlayer::ForceRespawn(void)&lt;br /&gt;
314	CTFPlayer::InitialSpawn(void)&lt;br /&gt;
315	CBasePlayer::InitHUD(void)&lt;br /&gt;
316	CBasePlayer::ShowViewPortPanel(char  const*,bool,KeyValues *)&lt;br /&gt;
317	CTFPlayer::PlayerDeathThink(void)&lt;br /&gt;
318	CBasePlayer::Jump(void)&lt;br /&gt;
319	CBasePlayer::Duck(void)&lt;br /&gt;
320	CTFPlayer::PreThink(void)&lt;br /&gt;
321	CTFPlayer::PostThink(void)&lt;br /&gt;
322	CTFPlayer::DamageEffect(float,int)&lt;br /&gt;
323	CTFPlayer::OnDamagedByExplosion(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
324	CBasePlayer::ShouldFadeOnDeath(void)&lt;br /&gt;
325	CBasePlayer::IsFakeClient(void)const&lt;br /&gt;
326	CBasePlayer::GetPlayerMins(void)const&lt;br /&gt;
327	CBasePlayer::GetPlayerMaxs(void)const&lt;br /&gt;
328	CBasePlayer::CalcRoll(QAngle  const&amp;amp;,Vector  const&amp;amp;,float,float)&lt;br /&gt;
329	CBasePlayer::PackDeadPlayerItems(void)&lt;br /&gt;
330	CTFPlayer::RemoveAllItems(bool)&lt;br /&gt;
331	CBasePlayer::Weapon_SetLast(CBaseCombatWeapon *)&lt;br /&gt;
332	CTFPlayer::Weapon_ShouldSetLast(CBaseCombatWeapon *,CBaseCombatWeapon *)&lt;br /&gt;
333	CBasePlayer::Weapon_ShouldSelectItem(CBaseCombatWeapon *)&lt;br /&gt;
334	CBasePlayer::OnMyWeaponFired(CBaseCombatWeapon *)&lt;br /&gt;
335	CBasePlayer::GetTimeSinceWeaponFired(void)const&lt;br /&gt;
336	CBasePlayer::IsFiringWeapon(void)const&lt;br /&gt;
337	CBasePlayer::UpdateClientData(void)&lt;br /&gt;
338	CBasePlayer::ExitLadder(void)&lt;br /&gt;
339	CBasePlayer::GetLadderSurface(Vector  const&amp;amp;)&lt;br /&gt;
340	CBasePlayer::SetFlashlightEnabled(bool)&lt;br /&gt;
341	CTFPlayer::FlashlightIsOn(void)&lt;br /&gt;
342	CTFPlayer::FlashlightTurnOn(void)&lt;br /&gt;
343	CTFPlayer::FlashlightTurnOff(void)&lt;br /&gt;
344	CBasePlayer::IsIlluminatedByFlashlight(CBaseEntity *,float *)&lt;br /&gt;
345	CBasePlayer::UpdateStepSound(surfacedata_t *,Vector  const&amp;amp;,Vector  const&amp;amp;)&lt;br /&gt;
346	CBasePlayer::PlayStepSound(Vector &amp;amp;,surfacedata_t *,float,bool)&lt;br /&gt;
347	CTFPlayer::GetStepSoundVelocities(float *,float *)&lt;br /&gt;
348	CTFPlayer::SetStepSoundTime(stepsoundtimes_t,bool)&lt;br /&gt;
349	CTFPlayer::DeathSound(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
350	CTFPlayer::SetAnimation(PLAYER_ANIM)&lt;br /&gt;
351	CBasePlayer::ImpulseCommands(void)&lt;br /&gt;
352	CTFPlayer::CheatImpulseCommands(int)&lt;br /&gt;
353	CTFPlayer::ClientCommand(CCommand  const&amp;amp;)&lt;br /&gt;
354	CBasePlayer::StartObserverMode(int)&lt;br /&gt;
355	CBasePlayer::StopObserverMode(void)&lt;br /&gt;
356	CTFPlayer::ModeWantsSpectatorGUI(int)&lt;br /&gt;
357	CTFPlayer::SetObserverMode(int)&lt;br /&gt;
358	CBasePlayer::GetObserverMode(void)&lt;br /&gt;
359	CTFPlayer::SetObserverTarget(CBaseEntity *)&lt;br /&gt;
360	CBasePlayer::ObserverUse(bool)&lt;br /&gt;
361	CBasePlayer::GetObserverTarget(void)&lt;br /&gt;
362	CTFPlayer::FindNextObserverTarget(bool)&lt;br /&gt;
363	CTFPlayer::GetNextObserverSearchStartPoint(bool)&lt;br /&gt;
364	CTFPlayer::IsValidObserverTarget(CBaseEntity *)&lt;br /&gt;
365	CTFPlayer::CheckObserverSettings(void)&lt;br /&gt;
366	CBasePlayer::JumptoPosition(Vector  const&amp;amp;,QAngle  const&amp;amp;)&lt;br /&gt;
367	CBasePlayer::ForceObserverMode(int)&lt;br /&gt;
368	CBasePlayer::ResetObserverMode(void)&lt;br /&gt;
369	CTFPlayer::ValidateCurrentObserverTarget(void)&lt;br /&gt;
370	CTFPlayer::AttemptToExitFreezeCam(void)&lt;br /&gt;
371	CBasePlayer::StartReplayMode(float,float,int)&lt;br /&gt;
372	CBasePlayer::StopReplayMode(void)&lt;br /&gt;
373	CBasePlayer::GetDelayTicks(void)&lt;br /&gt;
374	CBasePlayer::GetReplayEntity(void)&lt;br /&gt;
375	CBasePlayer::CreateCorpse(void)&lt;br /&gt;
376	CTFPlayer::EntSelectSpawnPoint(void)&lt;br /&gt;
377	CBasePlayer::GetInVehicle(IServerVehicle *,int)&lt;br /&gt;
378	CBasePlayer::LeaveVehicle(Vector  const&amp;amp;,QAngle  const&amp;amp;)&lt;br /&gt;
379	CBasePlayer::OnVehicleStart(void)&lt;br /&gt;
380	CBasePlayer::OnVehicleEnd(Vector &amp;amp;)&lt;br /&gt;
381	CTFPlayer::BumpWeapon(CBaseCombatWeapon *)&lt;br /&gt;
382	CBasePlayer::SelectLastItem(void)&lt;br /&gt;
383	CBasePlayer::SelectItem(char  const*,int)&lt;br /&gt;
384	CTFPlayer::ItemPostFrame(void)&lt;br /&gt;
385	CBasePlayer::GiveNamedItem(char  const*,int)&lt;br /&gt;
386	CBasePlayer::CheckTrainUpdate(void)&lt;br /&gt;
387	CBasePlayer::SetPlayerUnderwater(bool)&lt;br /&gt;
388	CBasePlayer::CanBreatheUnderwater(void)const&lt;br /&gt;
389	CTFPlayer::PlayerUse(void)&lt;br /&gt;
390	CBasePlayer::PlayUseDenySound(void)&lt;br /&gt;
391	CBasePlayer::FindUseEntity(void)&lt;br /&gt;
392	CBasePlayer::IsUseableEntity(CBaseEntity *,unsigned int)&lt;br /&gt;
393	CBasePlayer::PickupObject(CBaseEntity *,bool)&lt;br /&gt;
394	CBasePlayer::ForceDropOfCarriedPhysObjects(CBaseEntity *)&lt;br /&gt;
395	CBasePlayer::GetHeldObjectMass(IPhysicsObject *)&lt;br /&gt;
396	CBasePlayer::UpdateGeigerCounter(void)&lt;br /&gt;
397	CBasePlayer::GetAutoaimVector(float)&lt;br /&gt;
398	CBasePlayer::GetAutoaimVector(float,float)&lt;br /&gt;
399	CBasePlayer::GetAutoaimVector(autoaim_params_t &amp;amp;)&lt;br /&gt;
400	CBasePlayer::ShouldAutoaim(void)&lt;br /&gt;
401	CBasePlayer::ForceClientDllUpdate(void)&lt;br /&gt;
402	CBasePlayer::ProcessUsercmds(CUserCmd *,int,int,int,bool)&lt;br /&gt;
403	CBasePlayer::PlayerRunCommand(CUserCmd *,IMoveHelper *)&lt;br /&gt;
404	CTFPlayer::ChangeTeam(int,bool,bool)&lt;br /&gt;
405	CTFPlayer::CanHearAndReadChatFrom(CBasePlayer *)&lt;br /&gt;
406	CBaseMultiplayerPlayer::CanSpeak(void)&lt;br /&gt;
407	CBasePlayer::ModifyOrAppendPlayerCriteria(AI_CriteriaSet &amp;amp;)&lt;br /&gt;
408	CBasePlayer::CheckChatText(char *,int)&lt;br /&gt;
409	CTFPlayer::CreateRagdollEntity(void)&lt;br /&gt;
410	CTFPlayer::ShouldAnnounceAchievement(void)&lt;br /&gt;
411	CBasePlayer::EquipWearable(CWearableItem *)&lt;br /&gt;
412	CBasePlayer::RemoveWearable(CWearableItem *)&lt;br /&gt;
413	CBasePlayer::IsFollowingPhysics(void)&lt;br /&gt;
414	CBasePlayer::InitVCollision(Vector  const&amp;amp;,Vector  const&amp;amp;)&lt;br /&gt;
415	CBasePlayer::UpdatePhysicsShadowToCurrentPosition(void)&lt;br /&gt;
416	CBasePlayer::Hints(void)&lt;br /&gt;
417	CTFPlayer::IsReadyToPlay(void)&lt;br /&gt;
418	CTFPlayer::IsReadyToSpawn(void)&lt;br /&gt;
419	CTFPlayer::ShouldGainInstantSpawn(void)&lt;br /&gt;
420	CTFPlayer::ResetPerRoundStats(void)&lt;br /&gt;
421	CTFPlayer::ResetScores(void)&lt;br /&gt;
422	CBasePlayer::EquipSuit(bool)&lt;br /&gt;
423	CBasePlayer::RemoveSuit(void)&lt;br /&gt;
424	CTFPlayer::CommitSuicide(bool,bool)&lt;br /&gt;
425	CBasePlayer::CommitSuicide(Vector  const&amp;amp;,bool,bool)&lt;br /&gt;
426	CBasePlayer::IsBot(void)const&lt;br /&gt;
427	CBaseMultiplayerPlayer::GetExpresser(void)&lt;br /&gt;
428	CBasePlayer::SpawnArmorValue(void)const&lt;br /&gt;
429	CBasePlayer::NetworkStateChanged_m_ArmorValue(void)&lt;br /&gt;
430	CBasePlayer::NetworkStateChanged_m_ArmorValue(void *)&lt;br /&gt;
431	CBasePlayer::HasHaptics(void)&lt;br /&gt;
432	CBasePlayer::SetHaptics(bool)&lt;br /&gt;
433	CBasePlayer::PlayerSolidMask(bool)const&lt;br /&gt;
434	CAI_ExpresserHost&amp;lt;CBasePlayer&amp;gt;::NoteSpeaking(float,float)&lt;br /&gt;
435	CAI_ExpresserHost&amp;lt;CBasePlayer&amp;gt;::Speak(char  const*,char  const*,char *,unsigned int,IRecipientFilter *)&lt;br /&gt;
436	CAI_ExpresserHost&amp;lt;CBasePlayer&amp;gt;::PostSpeakDispatchResponse(char  const*,AI_Response *)&lt;br /&gt;
437	CBaseMultiplayerPlayer::SpeakIfAllowed(char  const*,char  const*,char *,unsigned int,IRecipientFilter *)&lt;br /&gt;
438	CTFPlayer::SpeakConceptIfAllowed(int,char  const*,char *,unsigned int,IRecipientFilter *)&lt;br /&gt;
439	CTFPlayer::CanSpeakVoiceCommand(void)&lt;br /&gt;
440	CTFPlayer::ShouldShowVoiceSubtitleToEnemy(void)&lt;br /&gt;
441	CTFPlayer::NoteSpokeVoiceCommand(char  const*)&lt;br /&gt;
442	CTFPlayer::OnAchievementEarned(int)&lt;br /&gt;
443	CBaseMultiplayerPlayer::GetMultiplayerExpresser(void)&lt;br /&gt;
444	CTFPlayer::CalculateTeamBalanceScore(void)&lt;br /&gt;
445	CBaseMultiplayerPlayer::CreateExpresser(void)&lt;br /&gt;
446	CTFPlayer::DetermineAssistForKill(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
447	CTFPlayer::SetNumberofDominations(int)&lt;br /&gt;
448	CTFPlayer::GetNumberofDominations(void)&lt;br /&gt;
449	CTFPlayer::ShouldGib(CTakeDamageInfo  const&amp;amp;,bool)&lt;br /&gt;
450	CTFPlayer::GetAttributeManager(void)&lt;br /&gt;
451	CTFPlayer::GetAttributeContainer(void)&lt;br /&gt;
452	CTFPlayer::GetAttributeOwner(void)&lt;br /&gt;
453	CTFPlayer::ReapplyProvision(void)&lt;br /&gt;
454	CTFPlayer::InventoryUpdated(CPlayerInventory *,EItemRequestResult)&lt;br /&gt;
455	CTFPlayer::SOCacheUnsubscribed(CSteamID  const&amp;amp;)&lt;br /&gt;
456	CTFPlayer::GiveNamedItem(char  const*,int,CScriptCreatedItem *,bool)&lt;br /&gt;
457	CTFPlayer::InitClass(void)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=CTerrorPlayer_Offset_List_(Left_4_Dead_2)&amp;diff=7684</id>
		<title>CTerrorPlayer Offset List (Left 4 Dead 2)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=CTerrorPlayer_Offset_List_(Left_4_Dead_2)&amp;diff=7684"/>
		<updated>2010-04-23T11:10:48Z</updated>

		<summary type="html">&lt;p&gt;DS: Updated offsets for DLC (The Passing)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Also for use when using [[Virtual Offsets (Source Mods)|virtual offsets]].&lt;br /&gt;
&lt;br /&gt;
These are the &amp;lt;b&amp;gt;Windows&amp;lt;/b&amp;gt; offsets. &amp;lt;b&amp;gt;Linux offsets are 1 greater.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The List ==&lt;br /&gt;
This comes from the symbol tables, so you'll have to look in the SDK for return types.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Last Updated 23 April 2010&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Auto reconstructed from vtable block @ 0x00D2DEC0&lt;br /&gt;
// from &amp;quot;server.so&amp;quot;, by ida_vtables.idc&lt;br /&gt;
0	CTerrorPlayer::~CTerrorPlayer()&lt;br /&gt;
1	CBaseEntity::SetRefEHandle(CBaseHandle  const&amp;amp;)&lt;br /&gt;
2	CBaseEntity::GetRefEHandle(void)const&lt;br /&gt;
3	CBaseEntity::GetCollideable(void)&lt;br /&gt;
4	CBaseEntity::GetNetworkable(void)&lt;br /&gt;
5	CBaseEntity::GetBaseEntity(void)&lt;br /&gt;
6	CBaseEntity::GetModelIndex(void)const&lt;br /&gt;
7	CBaseEntity::GetModelName(void)const&lt;br /&gt;
8	CCSPlayer::SetModelIndex(int)&lt;br /&gt;
9	CTerrorPlayer::GetServerClass(void)&lt;br /&gt;
10	CTerrorPlayer::YouForgotToImplementOrDeclareServerClass(void)&lt;br /&gt;
11	CTerrorPlayer::GetDataDescMap(void)&lt;br /&gt;
12	CBaseAnimating::GetScriptDesc(void)&lt;br /&gt;
13	CBaseEntity::GetAIAddOn(void)const&lt;br /&gt;
14	CBaseAnimating::TestCollision(Ray_t  const&amp;amp;,unsigned int,CGameTrace &amp;amp;)&lt;br /&gt;
15	CTerrorPlayer::TestHitboxes(Ray_t  const&amp;amp;,unsigned int,CGameTrace &amp;amp;)&lt;br /&gt;
16	CBaseEntity::ComputeWorldSpaceSurroundingBox(Vector *,Vector *)&lt;br /&gt;
17	CTerrorPlayer::ShouldCollide(int,int)const&lt;br /&gt;
18	CBaseEntity::SetOwnerEntity(CBaseEntity*)&lt;br /&gt;
19	CTerrorPlayer::ShouldTransmit(CCheckTransmitInfo  const*)&lt;br /&gt;
20	CBasePlayer::UpdateTransmitState(void)&lt;br /&gt;
21	CBaseCombatCharacter::SetTransmit(CCheckTransmitInfo *,bool)&lt;br /&gt;
22	CBasePlayer::GetTracerType(void)&lt;br /&gt;
23	CTerrorPlayer::Spawn(void)&lt;br /&gt;
24	CBaseEntity::ShouldPrecache(void)&lt;br /&gt;
25	CTerrorPlayer::Precache(void)&lt;br /&gt;
26	CBasePlayer::SetModel(char  const*)&lt;br /&gt;
27	CBaseEntity::InitSharedVars(void)&lt;br /&gt;
28	CBaseMultiplayerPlayer::PostConstructor(char  const*)&lt;br /&gt;
29	CBaseEntity::PostClientActive(void)&lt;br /&gt;
30	CBaseEntity::OnParseMapDataFinished(void)&lt;br /&gt;
31	CBaseEntity::KeyValue(char  const*,char  const*)&lt;br /&gt;
32	CBaseEntity::KeyValue(char  const*,float)&lt;br /&gt;
33	CBaseEntity::KeyValue(char  const*,Vector  const&amp;amp;)&lt;br /&gt;
34	CBaseEntity::GetKeyValue(char  const*,char *,int)&lt;br /&gt;
35	CBasePlayer::Activate(void)&lt;br /&gt;
36	CBaseEntity::SetParent(CBaseEntity*,int)&lt;br /&gt;
37	CBaseEntity::SetStasis(bool)&lt;br /&gt;
38	CBaseEntity::IsInStasis(void)const&lt;br /&gt;
39	CTerrorPlayer::ObjectCaps(void)&lt;br /&gt;
40	CTerrorPlayer::GetUsePriority(CBaseEntity *)&lt;br /&gt;
41	CBaseEntity::GetGlowEntity(void)&lt;br /&gt;
42	CBaseEntity::GetUseType(CBaseEntity*)&lt;br /&gt;
43	CBaseEntity::AcceptInput(char  const*,CBaseEntity*,CBaseEntity*,variant_t,int)&lt;br /&gt;
44	CBasePlayer::GetPlayerName(void)const&lt;br /&gt;
45	CBasePlayer::DrawDebugGeometryOverlays(void)&lt;br /&gt;
46	CTerrorPlayer::DrawDebugTextOverlays(void)&lt;br /&gt;
47	CBasePlayer::Save(ISave &amp;amp;)&lt;br /&gt;
48	CBasePlayer::Restore(IRestore &amp;amp;)&lt;br /&gt;
49	CBasePlayer::ShouldSavePhysics(void)&lt;br /&gt;
50	CBaseEntity::OnSave(IEntitySaveUtils *)&lt;br /&gt;
51	CBasePlayer::OnRestore(void)&lt;br /&gt;
52	CBasePlayer::GetDemoRecordingState(KeyValues *)&lt;br /&gt;
53	CBasePlayer::RequiredEdictIndex(void)&lt;br /&gt;
54	CBaseEntity::MoveDone(void)&lt;br /&gt;
55	CBaseEntity::Think(void)&lt;br /&gt;
56	CBasePlayer::NetworkStateChanged_m_nNextThinkTick(void)&lt;br /&gt;
57	CBasePlayer::NetworkStateChanged_m_nNextThinkTick(void *)&lt;br /&gt;
58	CBaseAnimating::GetBaseAnimating(void)&lt;br /&gt;
59	CBaseAnimatingOverlay::GetBaseAnimatingOverlay(void)&lt;br /&gt;
60	CTerrorPlayer::GetResponseSystem(void)&lt;br /&gt;
61	CAI_ExpresserHost&amp;lt;CBasePlayer&amp;gt;::DispatchResponse(char  const*)&lt;br /&gt;
62	CBasePlayer::Classify(void)&lt;br /&gt;
63	CBaseEntity::DeathNotice(CBaseEntity*)&lt;br /&gt;
64	CTerrorPlayer::ShouldAttractAutoAim(CBaseEntity *)&lt;br /&gt;
65	CTerrorPlayer::GetAutoAimRadius(void)&lt;br /&gt;
66	CBaseEntity::GetAutoAimCenter(void)&lt;br /&gt;
67	CBaseEntity::GetBeamTraceFilter(void)&lt;br /&gt;
68	CBaseEntity::PassesDamageFilter(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
69	CCSPlayer::TraceAttack(CTakeDamageInfo  const&amp;amp;,Vector  const&amp;amp;,CGameTrace *)&lt;br /&gt;
70	CBaseEntity::CanBeHitByMeleeAttack(CBaseEntity*)&lt;br /&gt;
71	CTerrorPlayer::OnTakeDamage(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
72	CTerrorPlayer::TakeHealth(float,int)&lt;br /&gt;
73	CBaseEntity::IsAlive(void)const&lt;br /&gt;
74	CTerrorPlayer::Event_Killed(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
75	CBasePlayer::Event_KilledOther(CBaseEntity *,CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
76	CBaseCombatCharacter::BloodColor(void)&lt;br /&gt;
77	CBaseEntity::IsTriggered(CBaseEntity*)&lt;br /&gt;
78	CBaseEntity::IsNPC(void)const&lt;br /&gt;
79	CBaseCombatCharacter::MyCombatCharacterPointer(void)&lt;br /&gt;
80	CBaseEntity::MyNextBotPointer(void)&lt;br /&gt;
81	CBaseEntity::MyInfectedPointer(void)&lt;br /&gt;
82	CBaseEntity::GetDelay(void)&lt;br /&gt;
83	CBaseEntity::IsMoving(void)&lt;br /&gt;
84	CBaseEntity::DamageDecal(int,int)&lt;br /&gt;
85	CBaseEntity::DecalTrace(CGameTrace *,char  const*)&lt;br /&gt;
86	CBaseEntity::ImpactTrace(CGameTrace *,int,char *)&lt;br /&gt;
87	CBaseEntity::OnControls(CBaseEntity*)&lt;br /&gt;
88	CBaseEntity::HasTarget(string_t)&lt;br /&gt;
89	CBasePlayer::IsPlayer(void)const&lt;br /&gt;
90	CBasePlayer::IsNetClient(void)const&lt;br /&gt;
91	CBaseEntity::IsTemplate(void)&lt;br /&gt;
92	CBaseEntity::IsBaseObject(void)const&lt;br /&gt;
93	CBaseEntity::IsBaseTrain(void)const&lt;br /&gt;
94	CBaseEntity::IsElevator(void)const&lt;br /&gt;
95	CBaseEntity::IsBaseCombatWeapon(void)const&lt;br /&gt;
96	CBaseEntity::MyCombatWeaponPointer(void)&lt;br /&gt;
97	CBaseEntity::GetServerVehicle(void)&lt;br /&gt;
98	CBaseEntity::IsViewable(void)&lt;br /&gt;
99	CTerrorPlayer::ChangeTeam(int)&lt;br /&gt;
100	CBaseEntity::OnEntityEvent(EntityEvent_t,void *)&lt;br /&gt;
101	CBaseEntity::CanStandOn(CBaseEntity*)const&lt;br /&gt;
102	CBaseEntity::CanStandOn(edict_t *)const&lt;br /&gt;
103	CBaseEntity::GetEnemy(void)&lt;br /&gt;
104	CBaseEntity::GetEnemy(void)const&lt;br /&gt;
105	CBaseEntity::Use(CBaseEntity*,CBaseEntity*,USE_TYPE,float)&lt;br /&gt;
106	CBaseEntity::StartTouch(CBaseEntity*)&lt;br /&gt;
107	CTerrorPlayer::Touch(CBaseEntity *)&lt;br /&gt;
108	CBaseEntity::EndTouch(CBaseEntity*)&lt;br /&gt;
109	CBaseEntity::StartBlocked(CBaseEntity*)&lt;br /&gt;
110	CBaseEntity::Blocked(CBaseEntity*)&lt;br /&gt;
111	CBaseEntity::EndBlocked(void)&lt;br /&gt;
112	CBasePlayer::PhysicsSimulate(void)&lt;br /&gt;
113	CBaseEntity::PhysicsLandedOnGround(float)&lt;br /&gt;
114	CBasePlayer::UpdateOnRemove(void)&lt;br /&gt;
115	CBaseEntity::StopLoopingSounds(void)&lt;br /&gt;
116	CBaseEntity::SUB_AllowedToFade(void)&lt;br /&gt;
117	CTerrorPlayer::Teleport(Vector  const*,QAngle  const*,Vector  const*)&lt;br /&gt;
118	CBaseEntity::NotifySystemEvent(CBaseEntity*,notify_system_event_t,notify_system_event_params_t  const&amp;amp;)&lt;br /&gt;
119	CTerrorPlayer::MakeTracer(Vector  const&amp;amp;,CGameTrace  const&amp;amp;,int)&lt;br /&gt;
120	CBaseEntity::GetTracerAttachment(void)&lt;br /&gt;
121	CBaseEntity::FireBullets(FireBulletsInfo_t  const&amp;amp;)&lt;br /&gt;
122	CBasePlayer::DoImpactEffect(CGameTrace &amp;amp;,int)&lt;br /&gt;
123	CBaseEntity::Respawn(void)&lt;br /&gt;
124	CBaseEntity::IsLockedByMaster(void)&lt;br /&gt;
125	CBaseEntity::GetMaxHealth(void)const&lt;br /&gt;
126	CTerrorPlayer::ModifyOrAppendCriteria(AI_CriteriaSet &amp;amp;)&lt;br /&gt;
127	CTerrorPlayer::ModifyOrAppendDerivedCriteria(AI_CriteriaSet &amp;amp;)&lt;br /&gt;
128	CTerrorPlayer::NetworkStateChanged_m_iMaxHealth(void)&lt;br /&gt;
129	CTerrorPlayer::NetworkStateChanged_m_iMaxHealth(void *)&lt;br /&gt;
130	CBasePlayer::NetworkStateChanged_m_iHealth(void)&lt;br /&gt;
131	CBasePlayer::NetworkStateChanged_m_iHealth(void *)&lt;br /&gt;
132	CBasePlayer::NetworkStateChanged_m_lifeState(void)&lt;br /&gt;
133	CBasePlayer::NetworkStateChanged_m_lifeState(void *)&lt;br /&gt;
134	CBaseEntity::NetworkStateChanged_m_takedamage(void)&lt;br /&gt;
135	CBaseEntity::NetworkStateChanged_m_takedamage(void *)&lt;br /&gt;
136	CBaseEntity::GetDamageType(void)const&lt;br /&gt;
137	CBaseEntity::GetDamage(void)&lt;br /&gt;
138	CBaseEntity::SetDamage(float)&lt;br /&gt;
139	CBasePlayer::EyePosition(void)&lt;br /&gt;
140	CBasePlayer::EyeAngles(void)&lt;br /&gt;
141	CBasePlayer::LocalEyeAngles(void)&lt;br /&gt;
142	CBaseEntity::EarPosition(void)&lt;br /&gt;
143	CBasePlayer::BodyTarget(Vector  const&amp;amp;,bool)&lt;br /&gt;
144	CBaseEntity::HeadTarget(Vector  const&amp;amp;)&lt;br /&gt;
145	CBaseEntity::GetVectors(Vector *,Vector *,Vector *)const&lt;br /&gt;
146	CBaseEntity::GetViewOffset(void)const&lt;br /&gt;
147	CBaseEntity::SetViewOffset(Vector  const&amp;amp;)&lt;br /&gt;
148	CBasePlayer::GetSmoothedVelocity(void)&lt;br /&gt;
149	CBaseAnimating::GetVelocity(Vector *,Vector *)&lt;br /&gt;
150	CTerrorPlayer::GetFriction(void)const&lt;br /&gt;
151	CBaseCombatCharacter::FVisible(CBaseEntity *,int,CBaseEntity **)&lt;br /&gt;
152	CBaseCombatCharacter::FVisible(Vector  const&amp;amp;,int,CBaseEntity **)&lt;br /&gt;
153	CBaseEntity::CanBeSeenBy(CAI_BaseNPC *)&lt;br /&gt;
154	CBaseEntity::GetAttackDamageScale(CBaseEntity*)&lt;br /&gt;
155	CBaseEntity::GetReceivedDamageScale(CBaseEntity*)&lt;br /&gt;
156	CTerrorPlayer::OnGroundChanged(CBaseEntity *,CBaseEntity *)&lt;br /&gt;
157	CBaseEntity::GetGroundVelocityToApply(Vector &amp;amp;)&lt;br /&gt;
158	CBaseEntity::PhysicsSplash(Vector  const&amp;amp;,Vector  const&amp;amp;,float,float)&lt;br /&gt;
159	CBaseEntity::Splash(void)&lt;br /&gt;
160	CBaseEntity::WorldSpaceCenter(void)const&lt;br /&gt;
161	CCSPlayer::GetSoundEmissionOrigin(void)const&lt;br /&gt;
162	CBaseEntity::CreateVPhysics(void)&lt;br /&gt;
163	CBaseEntity::ForceVPhysicsCollide(CBaseEntity*)&lt;br /&gt;
164	CBasePlayer::VPhysicsDestroyObject(void)&lt;br /&gt;
165	CBasePlayer::VPhysicsUpdate(IPhysicsObject *)&lt;br /&gt;
166	CBaseEntity::VPhysicsTakeDamage(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
167	CBaseCombatCharacter::VPhysicsShadowCollision(int,gamevcollisionevent_t *)&lt;br /&gt;
168	CTerrorPlayer::VPhysicsShadowUpdate(IPhysicsObject *)&lt;br /&gt;
169	CBasePlayer::VPhysicsCollision(int,gamevcollisionevent_t *)&lt;br /&gt;
170	CBaseEntity::VPhysicsFriction(IPhysicsObject *,float,int,int)&lt;br /&gt;
171	CBaseEntity::UpdatePhysicsShadowToCurrentPosition(float)&lt;br /&gt;
172	CBaseEntity::VPhysicsGetObjectList(IPhysicsObject **,int)&lt;br /&gt;
173	CBaseEntity::VPhysicsIsFlesh(void)&lt;br /&gt;
174	CBaseEntity::CanPushEntity(CBaseEntity*)const&lt;br /&gt;
175	CBaseEntity::HasPhysicsAttacker(float)&lt;br /&gt;
176	CBasePlayer::PhysicsSolidMaskForEntity(void)const&lt;br /&gt;
177	CBaseEntity::ResolveFlyCollisionCustom(CGameTrace &amp;amp;,Vector &amp;amp;)&lt;br /&gt;
178	CBaseEntity::PerformCustomPhysics(Vector *,Vector *,QAngle *,QAngle *)&lt;br /&gt;
179	CBaseAnimating::GetStepOrigin(void)const&lt;br /&gt;
180	CBaseAnimating::GetStepAngles(void)const&lt;br /&gt;
181	CBaseEntity::ShouldDrawWaterImpacts(void)&lt;br /&gt;
182	CBasePlayer::NetworkStateChanged_m_fFlags(void)&lt;br /&gt;
183	CBasePlayer::NetworkStateChanged_m_fFlags(void *)&lt;br /&gt;
184	CBasePlayer::NetworkStateChanged_m_nWaterLevel(void)&lt;br /&gt;
185	CBasePlayer::NetworkStateChanged_m_nWaterLevel(void *)&lt;br /&gt;
186	CBasePlayer::NetworkStateChanged_m_hGroundEntity(void)&lt;br /&gt;
187	CBasePlayer::NetworkStateChanged_m_hGroundEntity(void *)&lt;br /&gt;
188	CBasePlayer::NetworkStateChanged_m_vecBaseVelocity(void)&lt;br /&gt;
189	CBasePlayer::NetworkStateChanged_m_vecBaseVelocity(void *)&lt;br /&gt;
190	CBasePlayer::NetworkStateChanged_m_flFriction(void)&lt;br /&gt;
191	CBasePlayer::NetworkStateChanged_m_flFriction(void *)&lt;br /&gt;
192	CBasePlayer::NetworkStateChanged_m_vecVelocity(void)&lt;br /&gt;
193	CBasePlayer::NetworkStateChanged_m_vecVelocity(void *)&lt;br /&gt;
194	CBaseEntity::NetworkStateChanged_m_bClientSideRagdoll(void)&lt;br /&gt;
195	CBaseEntity::NetworkStateChanged_m_bClientSideRagdoll(void *)&lt;br /&gt;
196	CBasePlayer::NetworkStateChanged_m_vecViewOffset(void)&lt;br /&gt;
197	CBasePlayer::NetworkStateChanged_m_vecViewOffset(void *)&lt;br /&gt;
198	CBaseEntity::RunVScripts(void)&lt;br /&gt;
199	CBaseAnimating::GetIdealSpeed(void)const&lt;br /&gt;
200	CBaseAnimating::GetIdealAccel(void)const&lt;br /&gt;
201	CBaseAnimatingOverlay::StudioFrameAdvance(void)&lt;br /&gt;
202	CBaseAnimating::ReachedEndOfSequence(void)&lt;br /&gt;
203	CBaseAnimating::OnSequenceSet(int)&lt;br /&gt;
204	CBaseAnimating::IsActivityFinished(void)&lt;br /&gt;
205	CBaseAnimating::GetSequenceGroundSpeed(CStudioHdr *,int)&lt;br /&gt;
206	CBaseAnimating::ClampRagdollForce(Vector  const&amp;amp;,Vector*)&lt;br /&gt;
207	CBaseAnimating::BecomeRagdollOnClient(Vector  const&amp;amp;)&lt;br /&gt;
208	CBaseAnimating::IsRagdoll(void)&lt;br /&gt;
209	CBaseAnimating::CanBecomeRagdoll(void)&lt;br /&gt;
210	CBaseAnimatingOverlay::GetSkeleton(CStudioHdr *,matrix3x4_t  const&amp;amp;,Vector *,QuaternionAligned *,int)&lt;br /&gt;
211	CBaseAnimating::GetBoneTransform(int,matrix3x4_t &amp;amp;)&lt;br /&gt;
212	CBaseAnimating::SetupBones(matrix3x4_t *,int)&lt;br /&gt;
213	CBaseAnimating::CalculateIKLocks(float)&lt;br /&gt;
214	CBaseAnimatingOverlay::DispatchAnimEvents(CBaseAnimating *)&lt;br /&gt;
215	CTerrorPlayer::HandleAnimEvent(animevent_t *)&lt;br /&gt;
216	CBaseAnimating::PopulatePoseParameters(void)&lt;br /&gt;
217	CBaseAnimating::GetAttachment(int,matrix3x4_t &amp;amp;)&lt;br /&gt;
218	CBaseAnimating::InitBoneControllers(void)&lt;br /&gt;
219	CBaseAnimating::GetGroundSpeedVelocity(void)&lt;br /&gt;
220	CBaseAnimating::IsViewModel(void)const&lt;br /&gt;
221	CTerrorPlayer::Ignite(float,bool,float,bool)&lt;br /&gt;
222	CBaseAnimating::IgniteLifetime(float)&lt;br /&gt;
223	CBaseAnimating::IgniteUseCheapEffect(bool)&lt;br /&gt;
224	CTerrorPlayer::Extinguish(void)&lt;br /&gt;
225	CBaseAnimating::IsFrozen(void)&lt;br /&gt;
226	CBaseAnimating::Freeze(float,CBaseEntity *,Ray_t *)&lt;br /&gt;
227	CBaseAnimating::Unfreeze(void)&lt;br /&gt;
228	CBaseAnimating::Dissolve(char  const*,float,bool,int,Vector,int)&lt;br /&gt;
229	CBaseAnimating::SetLightingOrigin(CBaseEntity *)&lt;br /&gt;
230	CBaseFlex::SetViewtarget(Vector  const&amp;amp;)&lt;br /&gt;
231	CBaseFlex::StartSceneEvent(CSceneEventInfo *,CChoreoScene *,CChoreoEvent *,CChoreoActor *,CBaseEntity *)&lt;br /&gt;
232	CBaseFlex::ProcessSceneEvents(void)&lt;br /&gt;
233	CBaseFlex::ProcessSceneEvent(CSceneEventInfo *,CChoreoScene *,CChoreoEvent *)&lt;br /&gt;
234	CBaseFlex::ClearSceneEvent(CSceneEventInfo *,bool,bool)&lt;br /&gt;
235	CBaseFlex::CheckSceneEventCompletion(CSceneEventInfo *,float,CChoreoScene *,CChoreoEvent *)&lt;br /&gt;
236	CTerrorPlayer::PlayScene(char  const*,float,AI_Response *,IRecipientFilter *)&lt;br /&gt;
237	CBaseFlex::PlayAutoGeneratedSoundScene(char  const*)&lt;br /&gt;
238	CBasePlayer::GetPhysicsImpactDamageTable(void)&lt;br /&gt;
239	CBaseCombatCharacter::FInViewCone(CBaseEntity *)&lt;br /&gt;
240	CBaseCombatCharacter::FInViewCone(Vector  const&amp;amp;)&lt;br /&gt;
241	CBaseCombatCharacter::FInAimCone(CBaseEntity *)&lt;br /&gt;
242	CBaseCombatCharacter::FInAimCone(Vector  const&amp;amp;)&lt;br /&gt;
243	CBaseCombatCharacter::ShouldShootMissTarget(CBaseCombatCharacter*)&lt;br /&gt;
244	CBaseCombatCharacter::FindMissTarget(void)&lt;br /&gt;
245	CBaseCombatCharacter::HandleInteraction(int,void *,CBaseCombatCharacter*)&lt;br /&gt;
246	CBasePlayer::BodyAngles(void)&lt;br /&gt;
247	CBaseCombatCharacter::BodyDirection2D(void)&lt;br /&gt;
248	CBaseCombatCharacter::BodyDirection3D(void)&lt;br /&gt;
249	CBaseCombatCharacter::HeadDirection2D(void)&lt;br /&gt;
250	CBaseCombatCharacter::HeadDirection3D(void)&lt;br /&gt;
251	CBaseCombatCharacter::EyeDirection2D(void)&lt;br /&gt;
252	CBaseCombatCharacter::EyeDirection3D(void)&lt;br /&gt;
253	CBaseCombatCharacter::IsHiddenByFog(Vector  const&amp;amp;)const&lt;br /&gt;
254	CBaseCombatCharacter::IsHiddenByFog(CBaseEntity *)const&lt;br /&gt;
255	CBaseCombatCharacter::IsHiddenByFog(float)const&lt;br /&gt;
256	CBaseCombatCharacter::GetFogObscuredRatio(Vector  const&amp;amp;)const&lt;br /&gt;
257	CBaseCombatCharacter::GetFogObscuredRatio(CBaseEntity *)const&lt;br /&gt;
258	CBaseCombatCharacter::GetFogObscuredRatio(float)const&lt;br /&gt;
259	CBaseCombatCharacter::GetFogParams(fogparams_t *)const&lt;br /&gt;
260	CBaseCombatCharacter::IsLookingTowards(CBaseEntity  const*,float)const&lt;br /&gt;
261	CBaseCombatCharacter::IsLookingTowards(Vector  const&amp;amp;,float)const&lt;br /&gt;
262	CBaseCombatCharacter::IsInFieldOfView(CBaseEntity *)const&lt;br /&gt;
263	CBaseCombatCharacter::IsInFieldOfView(Vector  const&amp;amp;)const&lt;br /&gt;
264	CBaseCombatCharacter::IsLineOfSightClear(CBaseEntity *,CBaseCombatCharacter::LineOfSightCheckType)const&lt;br /&gt;
265	CBaseCombatCharacter::IsLineOfSightClear(Vector  const&amp;amp;,CBaseCombatCharacter::LineOfSightCheckType,CBaseEntity *)const&lt;br /&gt;
266	CTerrorPlayer::OnFootstep(Vector  const&amp;amp;,bool,bool)&lt;br /&gt;
267	CCSPlayer::GetGroundSurface(void)const&lt;br /&gt;
268	CTerrorPlayer::GetFootstepSound(char  const*,bool,float,bool)const&lt;br /&gt;
269	CTerrorPlayer::AreFootstepsAudible(void)const&lt;br /&gt;
270	CTerrorPlayer::IsFootstepAudible(float,bool)const&lt;br /&gt;
271	CBaseCombatCharacter::GetFootstepRunThreshold(void)const&lt;br /&gt;
272	CBaseCombatCharacter::GiveAmmo(int,int,bool)&lt;br /&gt;
273	CTerrorPlayer::RemoveAmmo(int,int)&lt;br /&gt;
274	CBaseCombatCharacter::NPC_TranslateActivity(Activity)&lt;br /&gt;
275	CBaseCombatCharacter::Weapon_TranslateActivity(Activity,bool *)&lt;br /&gt;
276	CBaseCombatCharacter::Weapon_FrameUpdate(void)&lt;br /&gt;
277	CBaseCombatCharacter::Weapon_HandleAnimEvent(animevent_t *)&lt;br /&gt;
278	CTerrorPlayer::Weapon_CanUse(CBaseCombatWeapon *)&lt;br /&gt;
279	CTerrorPlayer::Weapon_Equip(CBaseCombatWeapon *)&lt;br /&gt;
280	CBaseCombatCharacter::Weapon_EquipAmmoOnly(CBaseCombatWeapon *)&lt;br /&gt;
281	CTerrorPlayer::Weapon_Drop(CBaseCombatWeapon *,Vector  const*,Vector  const*)&lt;br /&gt;
282	CCSPlayer::Weapon_Switch(CBaseCombatWeapon *,int)&lt;br /&gt;
283	CTerrorPlayer::Weapon_ShootPosition(void)&lt;br /&gt;
284	CTerrorPlayer::Weapon_CanSwitchTo(CBaseCombatWeapon *)&lt;br /&gt;
285	CBaseCombatCharacter::Weapon_SlotOccupied(CBaseCombatWeapon *)&lt;br /&gt;
286	CBaseCombatCharacter::Weapon_GetSlot(int)const&lt;br /&gt;
287	CBaseCombatCharacter::AddPlayerItem(CBaseCombatWeapon *)&lt;br /&gt;
288	CBasePlayer::RemovePlayerItem(CBaseCombatWeapon *)&lt;br /&gt;
289	CBaseCombatCharacter::CanBecomeServerRagdoll(void)&lt;br /&gt;
290	CTerrorPlayer::OnTakeDamage_Alive(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
291	CBaseCombatCharacter::OnTakeDamage_Dying(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
292	CBaseCombatCharacter::OnTakeDamage_Dead(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
293	CBaseCombatCharacter::GetAliveDuration(void)const&lt;br /&gt;
294	CBaseCombatCharacter::OnFriendDamaged(CBaseCombatCharacter*,CBaseEntity *)&lt;br /&gt;
295	CBaseCombatCharacter::NotifyFriendsOfDamage(CBaseEntity *)&lt;br /&gt;
296	CBaseCombatCharacter::HasEverBeenInjured(int)const&lt;br /&gt;
297	CBaseCombatCharacter::GetTimeSinceLastInjury(int)const&lt;br /&gt;
298	CBaseCombatCharacter::OnPlayerKilledOther(CBaseEntity *,CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
299	CBaseCombatCharacter::GetDeathActivity(void)&lt;br /&gt;
300	CBaseCombatCharacter::CorpseGib(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
301	CBaseCombatCharacter::CorpseFade(void)&lt;br /&gt;
302	CBaseCombatCharacter::HasHumanGibs(void)&lt;br /&gt;
303	CBaseCombatCharacter::HasAlienGibs(void)&lt;br /&gt;
304	CBaseCombatCharacter::ShouldGib(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
305	CBaseCombatCharacter::OnKilledNPC(CBaseCombatCharacter*)&lt;br /&gt;
306	CBaseCombatCharacter::Event_Gibbed(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
307	CBasePlayer::Event_Dying(void)&lt;br /&gt;
308	CBaseCombatCharacter::BecomeRagdoll(CTakeDamageInfo  const&amp;amp;,Vector  const&amp;amp;)&lt;br /&gt;
309	CBaseCombatCharacter::FixupBurningServerRagdoll(CBaseEntity *)&lt;br /&gt;
310	CBaseCombatCharacter::BecomeRagdollBoogie(CBaseEntity *,Vector  const&amp;amp;,float,int)&lt;br /&gt;
311	CBaseCombatCharacter::CheckTraceHullAttack(float,Vector  const&amp;amp;,Vector  const&amp;amp;,int,int,float,bool)&lt;br /&gt;
312	CBaseCombatCharacter::CheckTraceHullAttack(Vector  const&amp;amp;,Vector  const&amp;amp;,Vector  const&amp;amp;,Vector  const&amp;amp;,int,int,float,bool)&lt;br /&gt;
313	CBaseCombatCharacter::PushawayTouch(CBaseEntity *)&lt;br /&gt;
314	CBaseCombatCharacter::IRelationType(CBaseEntity *)&lt;br /&gt;
315	CBaseCombatCharacter::IRelationPriority(CBaseEntity *)&lt;br /&gt;
316	CBasePlayer::IsInAVehicle(void)const&lt;br /&gt;
317	CBasePlayer::GetVehicle(void)&lt;br /&gt;
318	CBasePlayer::GetVehicleEntity(void)&lt;br /&gt;
319	CBaseCombatCharacter::ExitVehicle(void)&lt;br /&gt;
320	CBaseCombatCharacter::CalcWeaponProficiency(CBaseCombatWeapon *)&lt;br /&gt;
321	CBaseCombatCharacter::GetAttackSpread(CBaseCombatWeapon *,CBaseEntity *)&lt;br /&gt;
322	CBaseCombatCharacter::GetSpreadBias(CBaseCombatWeapon *,CBaseEntity *)&lt;br /&gt;
323	CBasePlayer::DoMuzzleFlash(void)&lt;br /&gt;
324	CBaseCombatCharacter::AddEntityRelationship(CBaseEntity *,Disposition_t,int)&lt;br /&gt;
325	CBaseCombatCharacter::RemoveEntityRelationship(CBaseEntity *)&lt;br /&gt;
326	CBaseCombatCharacter::AddClassRelationship(Class_T,Disposition_t,int)&lt;br /&gt;
327	CBaseCombatCharacter::OnChangeActiveWeapon(CBaseCombatWeapon *,CBaseCombatWeapon *)&lt;br /&gt;
328	CTerrorPlayer::GetLastKnownArea(void)const&lt;br /&gt;
329	CTerrorPlayer::IsAreaTraversable(CNavArea  const*)const&lt;br /&gt;
330	CBaseCombatCharacter::ClearLastKnownArea(void)&lt;br /&gt;
331	CBaseCombatCharacter::UpdateLastKnownArea(void)&lt;br /&gt;
332	CTerrorPlayer::OnNavAreaChanged(CNavArea *,CNavArea *)&lt;br /&gt;
333	CTerrorPlayer::OnNavAreaRemoved(CNavArea *)&lt;br /&gt;
334	CTerrorPlayer::GetClass(void)const&lt;br /&gt;
335	CTerrorPlayer::CanBeA(ZombieClassType)const&lt;br /&gt;
336	CTerrorPlayer::OnHitByVomitJar(CBaseCombatCharacter *)&lt;br /&gt;
337	CTerrorPlayer::IsIT(void)const&lt;br /&gt;
338	CTerrorPlayer::OnPursuedBy(INextBot *)&lt;br /&gt;
339	CTerrorPlayer::IsGhost(void)const&lt;br /&gt;
340	CBasePlayer::NetworkStateChanged_m_iAmmo(void)&lt;br /&gt;
341	CBasePlayer::NetworkStateChanged_m_iAmmo(void *)&lt;br /&gt;
342	CCSPlayer::CreateViewModel(int)&lt;br /&gt;
343	CCSPlayer::SetupVisibility(CBaseEntity *,unsigned char *,int)&lt;br /&gt;
344	CTerrorPlayer::WantsLagCompensationOnEntity(CBaseEntity  const*,CUserCmd  const*,CBitVec&amp;lt;2048&amp;gt;  const*)const&lt;br /&gt;
345	CBasePlayer::SharedSpawn(void)&lt;br /&gt;
346	CBasePlayer::ForceRespawn(void)&lt;br /&gt;
347	CTerrorPlayer::InitialSpawn(void)&lt;br /&gt;
348	CBasePlayer::InitHUD(void)&lt;br /&gt;
349	CCSPlayer::ShowViewPortPanel(char  const*,bool,KeyValues *)&lt;br /&gt;
350	CCSPlayer::PlayerDeathThink(void)&lt;br /&gt;
351	CBasePlayer::Jump(void)&lt;br /&gt;
352	CBasePlayer::Duck(void)&lt;br /&gt;
353	CTerrorPlayer::Cough(CBasePlayer *)&lt;br /&gt;
354	CTerrorPlayer::PreThink(void)&lt;br /&gt;
355	CTerrorPlayer::PostThink(void)&lt;br /&gt;
356	CBasePlayer::DamageEffect(float,int)&lt;br /&gt;
357	CCSPlayer::OnDamagedByExplosion(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
358	CBasePlayer::ShouldFadeOnDeath(void)&lt;br /&gt;
359	CBasePlayer::IsFakeClient(void)const&lt;br /&gt;
360	CTerrorPlayer::GetCharacterDisplayName(void)&lt;br /&gt;
361	CBasePlayer::GetPlayerMins(void)const&lt;br /&gt;
362	CBasePlayer::GetPlayerMaxs(void)const&lt;br /&gt;
363	CTerrorPlayer::UpdateCollisionBounds(void)&lt;br /&gt;
364	CBasePlayer::CalcRoll(QAngle  const&amp;amp;,Vector  const&amp;amp;,float,float)&lt;br /&gt;
365	CBasePlayer::PackDeadPlayerItems(void)&lt;br /&gt;
366	CCSPlayer::RemoveAllItems(bool)&lt;br /&gt;
367	CTerrorPlayer::IsRunning(void)const&lt;br /&gt;
368	CBasePlayer::Weapon_SetLast(CBaseCombatWeapon *)&lt;br /&gt;
369	CBasePlayer::Weapon_ShouldSetLast(CBaseCombatWeapon *,CBaseCombatWeapon *)&lt;br /&gt;
370	CBasePlayer::Weapon_ShouldSelectItem(CBaseCombatWeapon *)&lt;br /&gt;
371	CBasePlayer::HasUnlockableWeapons(int)&lt;br /&gt;
372	CBasePlayer::UpdateClientData(void)&lt;br /&gt;
373	CBasePlayer::UpdateBattery(void)&lt;br /&gt;
374	CBasePlayer::ExitLadder(void)&lt;br /&gt;
375	CBasePlayer::GetLadderSurface(Vector  const&amp;amp;)&lt;br /&gt;
376	CTerrorPlayer::IsAbleToAutoCenterOnLadders(void)const&lt;br /&gt;
377	CBasePlayer::SetFlashlightEnabled(bool)&lt;br /&gt;
378	CCSPlayer::FlashlightIsOn(void)&lt;br /&gt;
379	CTerrorPlayer::FlashlightTurnOn(bool)&lt;br /&gt;
380	CTerrorPlayer::FlashlightTurnOff(bool)&lt;br /&gt;
381	CBasePlayer::IsIlluminatedByFlashlight(CBaseEntity *,float *)&lt;br /&gt;
382	CCSPlayer::UpdateStepSound(surfacedata_t *,Vector  const&amp;amp;,Vector  const&amp;amp;)&lt;br /&gt;
383	CCSPlayer::PlayStepSound(Vector &amp;amp;,surfacedata_t *,float,bool)&lt;br /&gt;
384	CBasePlayer::GetStepSoundVelocities(float *,float *)&lt;br /&gt;
385	CBasePlayer::SetStepSoundTime(stepsoundtimes_t,bool)&lt;br /&gt;
386	CTerrorPlayer::DeathSound(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
387	CBasePlayer::GetSoundscapeListener(void)&lt;br /&gt;
388	CTerrorPlayer::WeaponHasInfiniteAmmo(CBaseCombatWeapon *)&lt;br /&gt;
389	CCSPlayer::SetAnimation(PLAYER_ANIM)&lt;br /&gt;
390	CBasePlayer::OnMainActivityComplete(Activity,Activity)&lt;br /&gt;
391	CBasePlayer::OnMainActivityInterrupted(Activity,Activity)&lt;br /&gt;
392	CTerrorPlayer::ImpulseCommands(void)&lt;br /&gt;
393	CTerrorPlayer::CheatImpulseCommands(int)&lt;br /&gt;
394	CTerrorPlayer::ClientCommand(CCommand  const&amp;amp;)&lt;br /&gt;
395	CBasePlayer::StartObserverMode(int)&lt;br /&gt;
396	CBasePlayer::StopObserverMode(void)&lt;br /&gt;
397	CBasePlayer::ModeWantsSpectatorGUI(int)&lt;br /&gt;
398	CTerrorPlayer::SetObserverMode(int)&lt;br /&gt;
399	CBasePlayer::GetObserverMode(void)&lt;br /&gt;
400	CTerrorPlayer::SetObserverTarget(CBaseEntity *)&lt;br /&gt;
401	CBasePlayer::ObserverUse(bool)&lt;br /&gt;
402	CBasePlayer::GetObserverTarget(void)&lt;br /&gt;
403	CTerrorPlayer::FindNextObserverTarget(bool)&lt;br /&gt;
404	CCSPlayer::GetNextObserverSearchStartPoint(bool)&lt;br /&gt;
405	CTerrorPlayer::PassesObserverFilter(CBaseEntity  const*)&lt;br /&gt;
406	CTerrorPlayer::IsValidObserverTarget(CBaseEntity *)&lt;br /&gt;
407	CBasePlayer::CheckObserverSettings(void)&lt;br /&gt;
408	CBasePlayer::JumptoPosition(Vector  const&amp;amp;,QAngle  const&amp;amp;)&lt;br /&gt;
409	CBasePlayer::ForceObserverMode(int)&lt;br /&gt;
410	CCSPlayer::ResetObserverMode(void)&lt;br /&gt;
411	CBasePlayer::ValidateCurrentObserverTarget(void)&lt;br /&gt;
412	CBasePlayer::AttemptToExitFreezeCam(void)&lt;br /&gt;
413	CTerrorPlayer::WantsRoamingObserverMode(void)const&lt;br /&gt;
414	CCSPlayer::StartReplayMode(float,float,int)&lt;br /&gt;
415	CCSPlayer::StopReplayMode(void)&lt;br /&gt;
416	CBasePlayer::GetDelayTicks(void)&lt;br /&gt;
417	CBasePlayer::GetReplayEntity(void)&lt;br /&gt;
418	CBasePlayer::CreateCorpse(void)&lt;br /&gt;
419	CTerrorPlayer::EntSelectSpawnPoint(void)&lt;br /&gt;
420	CBasePlayer::GetInVehicle(IServerVehicle *,int)&lt;br /&gt;
421	CBasePlayer::LeaveVehicle(Vector  const&amp;amp;,QAngle  const&amp;amp;)&lt;br /&gt;
422	CBasePlayer::OnVehicleStart(void)&lt;br /&gt;
423	CBasePlayer::OnVehicleEnd(Vector &amp;amp;)&lt;br /&gt;
424	CTerrorPlayer::BumpWeapon(CBaseCombatWeapon *)&lt;br /&gt;
425	CBasePlayer::SelectLastItem(void)&lt;br /&gt;
426	CBasePlayer::SelectItem(char  const*,int)&lt;br /&gt;
427	CBasePlayer::SelectItem(CBaseCombatWeapon *)&lt;br /&gt;
428	CTerrorPlayer::ItemPostFrame(void)&lt;br /&gt;
429	CTerrorPlayer::GiveNamedItem(char  const*,int,bool)&lt;br /&gt;
430	CBasePlayer::CheckTrainUpdate(void)&lt;br /&gt;
431	CBasePlayer::SetPlayerUnderwater(bool)&lt;br /&gt;
432	CTerrorPlayer::PlayWadeSound(void)&lt;br /&gt;
433	CTerrorPlayer::CanBreatheUnderwater(void)const&lt;br /&gt;
434	CTerrorPlayer::CanRecoverCurrentDrowningDamage(void)const&lt;br /&gt;
435	CTerrorPlayer::PlayerUse(CBaseEntity *)&lt;br /&gt;
436	CCSPlayer::PlayUseDenySound(void)&lt;br /&gt;
437	CTerrorPlayer::FindUseEntity(float,float,float,bool *,bool)&lt;br /&gt;
438	CTerrorPlayer::IsUseableEntity(CBaseEntity *,unsigned int)&lt;br /&gt;
439	CTerrorPlayer::OnUseEntity(CBaseEntity *,USE_TYPE)&lt;br /&gt;
440	CTerrorPlayer::PickupObject(CBaseEntity *,bool)&lt;br /&gt;
441	CTerrorPlayer::ForceDropOfCarriedPhysObjects(CBaseEntity *)&lt;br /&gt;
442	CTerrorPlayer::GetHeldObjectMass(IPhysicsObject *)&lt;br /&gt;
443	CTerrorPlayer::IsHoldingEntity(CBaseEntity *)&lt;br /&gt;
444	CBasePlayer::UpdateGeigerCounter(void)&lt;br /&gt;
445	CBasePlayer::GetAutoaimVector(float)&lt;br /&gt;
446	CBasePlayer::GetAutoaimVector(float,float)&lt;br /&gt;
447	CBasePlayer::GetAutoaimVector(float,float,float,AimResults *)&lt;br /&gt;
448	CBasePlayer::GetAutoaimVector(autoaim_params_t &amp;amp;)&lt;br /&gt;
449	CBasePlayer::ShouldAutoaim(void)&lt;br /&gt;
450	CBasePlayer::ForceClientDllUpdate(void)&lt;br /&gt;
451	CBasePlayer::ProcessUsercmds(CUserCmd *,int,int,int,bool)&lt;br /&gt;
452	CTerrorPlayer::PlayerRunCommand(CUserCmd *,IMoveHelper *)&lt;br /&gt;
453	CBasePlayer::ChangeTeam(int,bool,bool)&lt;br /&gt;
454	CBaseMultiplayerPlayer::CanHearAndReadChatFrom(CBasePlayer *)&lt;br /&gt;
455	CBaseMultiplayerPlayer::CanSpeak(void)&lt;br /&gt;
456	CCSPlayer::ModifyOrAppendPlayerCriteria(AI_CriteriaSet &amp;amp;)&lt;br /&gt;
457	CTerrorPlayer::CheckChatText(char *,int)&lt;br /&gt;
458	CBasePlayer::CreateRagdollEntity(void)&lt;br /&gt;
459	CBasePlayer::ShouldAnnounceAchievement(void)&lt;br /&gt;
460	CTerrorPlayer::ForceChangeTeam(int)&lt;br /&gt;
461	CBasePlayer::IsFollowingPhysics(void)&lt;br /&gt;
462	CTerrorPlayer::InitVCollision(Vector  const&amp;amp;,Vector  const&amp;amp;)&lt;br /&gt;
463	CBasePlayer::UpdatePhysicsShadowToCurrentPosition(void)&lt;br /&gt;
464	CBasePlayer::Hints(void)&lt;br /&gt;
465	CBasePlayer::IsReadyToPlay(void)&lt;br /&gt;
466	CBasePlayer::IsReadyToSpawn(void)&lt;br /&gt;
467	CBasePlayer::ShouldGainInstantSpawn(void)&lt;br /&gt;
468	CBasePlayer::ResetPerRoundStats(void)&lt;br /&gt;
469	CBasePlayer::ResetScores(void)&lt;br /&gt;
470	CBasePlayer::EquipSuit(bool)&lt;br /&gt;
471	CBasePlayer::RemoveSuit(void)&lt;br /&gt;
472	CTerrorPlayer::OnUseEntityChanged(void)&lt;br /&gt;
473	CBasePlayer::CommitSuicide(bool,bool)&lt;br /&gt;
474	CBasePlayer::CommitSuicide(Vector  const&amp;amp;,bool,bool)&lt;br /&gt;
475	CBasePlayer::IsBot(void)const&lt;br /&gt;
476	CBaseMultiplayerPlayer::GetExpresser(void)&lt;br /&gt;
477	CCSPlayer::SpawnArmorValue(void)const&lt;br /&gt;
478	CTerrorPlayer::UpdateTonemapController(void)&lt;br /&gt;
479	CCSPlayer::NetworkStateChanged_m_ArmorValue(void)&lt;br /&gt;
480	CCSPlayer::NetworkStateChanged_m_ArmorValue(void *)&lt;br /&gt;
481	CTerrorPlayer::IsAutoCrouched(void)const&lt;br /&gt;
482	CTerrorPlayer::GetAvailableSteadyStateSlots(void)&lt;br /&gt;
483	CTerrorPlayer::OnSpeak(CBasePlayer *,char  const*,float)&lt;br /&gt;
484	CTerrorPlayer::OnVoiceTransmit(void)&lt;br /&gt;
485	CTerrorPlayer::PlayerSolidMask(bool)const&lt;br /&gt;
486	CAI_ExpresserHost&amp;lt;CBasePlayer&amp;gt;::NoteSpeaking(float,float)&lt;br /&gt;
487	CAI_ExpresserHost&amp;lt;CBasePlayer&amp;gt;::Speak(CAI_Concept,char  const*,char *,unsigned int,IRecipientFilter *)&lt;br /&gt;
488	CAI_ExpresserHost&amp;lt;CBasePlayer&amp;gt;::Speak(CAI_Concept,AI_CriteriaSet *,char *,unsigned int,IRecipientFilter *)&lt;br /&gt;
489	CAI_ExpresserHost&amp;lt;CBasePlayer&amp;gt;::PostSpeakDispatchResponse(CAI_Concept,AI_Response *)&lt;br /&gt;
490	CTerrorPlayer::SpeakIfAllowed(CAI_Concept,SpeechPriorityType,char  const*,char *,unsigned int,IRecipientFilter *)&lt;br /&gt;
491	CBaseMultiplayerPlayer::SpeakConceptIfAllowed(int,char  const*,char *,unsigned int,IRecipientFilter *)&lt;br /&gt;
492	CBaseMultiplayerPlayer::CanSpeakVoiceCommand(void)&lt;br /&gt;
493	CBaseMultiplayerPlayer::ShouldShowVoiceSubtitleToEnemy(void)&lt;br /&gt;
494	CBaseMultiplayerPlayer::NoteSpokeVoiceCommand(char  const*)&lt;br /&gt;
495	CBaseMultiplayerPlayer::OnAchievementEarned(int)&lt;br /&gt;
496	CBaseMultiplayerPlayer::GetMultiplayerExpresser(void)&lt;br /&gt;
497	CBaseMultiplayerPlayer::CalculateTeamBalanceScore(void)&lt;br /&gt;
498	CBaseMultiplayerPlayer::CreateExpresser(void)&lt;br /&gt;
499	CCSPlayer::FirePlayerHurtEvent(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
500	CTerrorPlayer::OnTakeDamageInternal(CTakeDamageInfo &amp;amp;)&lt;br /&gt;
501	CTerrorPlayer::AllowDamage(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
502	CTerrorPlayer::GetHealthBuffer(void)const&lt;br /&gt;
503	CTerrorPlayer::IsIncapacitated(void)const&lt;br /&gt;
504	CTerrorPlayer::GetAdjustedDamage(CTakeDamageInfo  const&amp;amp;,float,float,bool)&lt;br /&gt;
505	CTerrorPlayer::DoBloodEffect(float,CTakeDamageInfo  const&amp;amp;,Vector  const&amp;amp;,CGameTrace *)&lt;br /&gt;
506	CCSPlayer::GiveNamedItem(char  const*,int)&lt;br /&gt;
507	CCSPlayer::IsBeingGivenItem(void)const&lt;br /&gt;
508	CTerrorPlayer::DoAnimationEvent(PlayerAnimEvent_t,int)&lt;br /&gt;
509	CTerrorPlayer::KickBack(float,float,float,float,float,float,int)&lt;br /&gt;
510	CTerrorPlayer::IsImmobilized(void)const&lt;br /&gt;
511	CTerrorPlayer::GiveDefaultItems(void)&lt;br /&gt;
512	CTerrorPlayer::RoundRespawn(void)&lt;br /&gt;
513	CTerrorPlayer::ObserverRoundRespawn(void)&lt;br /&gt;
514	CCSPlayer::Blind(float,float,float)&lt;br /&gt;
515	CTerrorPlayer::Deafen(float,float,float)&lt;br /&gt;
516	CTerrorPlayer::ResetMaxSpeed(void)&lt;br /&gt;
517	CCSPlayer::HandleCommand_JoinClass(int)&lt;br /&gt;
518	CCSPlayer::HandleCommand_JoinTeam(int,char  const*,bool)&lt;br /&gt;
519	CTerrorPlayer::GetIntoGame(void)&lt;br /&gt;
520	CTerrorPlayer::WantsMOTD(void)const&lt;br /&gt;
521	CTerrorPlayer::AutoSelectTeam(void)&lt;br /&gt;
522	CTerrorPlayer::OnLeaveActiveState(void)&lt;br /&gt;
523	CTerrorPlayer::Pain(bool)&lt;br /&gt;
524	CTerrorPlayer::OnTeamChanged(int)&lt;br /&gt;
525	CTerrorPlayer::CanAttack(void)const&lt;br /&gt;
526	CTerrorPlayer::OnWeaponFired(void)&lt;br /&gt;
527	CCSPlayer::QueueScreenBloodSplatter(int,float)&lt;br /&gt;
528	CTerrorPlayer::OnReloadStart(bool,int,bool)&lt;br /&gt;
529	CTerrorPlayer::CreateNoise(float)&lt;br /&gt;
530	CTerrorPlayer::OnPreThinkObserverMode(void)&lt;br /&gt;
531	CTerrorPlayer::OnEnterRescueState(void)&lt;br /&gt;
532	CTerrorPlayer::OnPreThinkRescueState(void)&lt;br /&gt;
533	CTerrorPlayer::OnLeaveRescueState(void)&lt;br /&gt;
534	CTerrorPlayer::OnEnterGhostState(void)&lt;br /&gt;
535	CTerrorPlayer::OnPreThinkGhostState(void)&lt;br /&gt;
536	CTerrorPlayer::OnLeaveGhostState(void)&lt;br /&gt;
537	CTerrorPlayer::OnEnterIntroCameraState(void)&lt;br /&gt;
538	CTerrorPlayer::OnPreThinkIntroCameraState(void)&lt;br /&gt;
539	CTerrorPlayer::OnLeaveIntroCameraState(void)&lt;br /&gt;
540	CTerrorPlayer::OnLeaveDeathAnimState(void)&lt;br /&gt;
541	CTerrorPlayer::OnLeaveDeathWaitForKeyState(void)&lt;br /&gt;
542	CTerrorPlayer::CanUseFlashlight(void)const&lt;br /&gt;
543	CTerrorPlayer::UpdateAddonBits(void)&lt;br /&gt;
544	CTerrorPlayer::UpdateRadar(void)&lt;br /&gt;
545	CTerrorPlayer::SelectDeathPose(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
546	CTerrorPlayer::CanChangeName(void)const&lt;br /&gt;
547	CTerrorPlayer::ChangeName(char  const*)&lt;br /&gt;
548	CTerrorPlayer::IsProgressBarActive(void)const&lt;br /&gt;
549	CTerrorPlayer::CreateRagdollEntity(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
550	CTerrorPlayer::GetRagdollType(void)const&lt;br /&gt;
551	CTerrorPlayer::SetModelFromClass(void)&lt;br /&gt;
552	CTerrorPlayer::SetModelFromClassAtSpawn(void)&lt;br /&gt;
553	CTerrorPlayer::DropWeapons(bool)&lt;br /&gt;
554	CTerrorPlayer::RecordDamageTaken(char  const*,int)&lt;br /&gt;
555	CTerrorPlayer::OnPlayerDisconnected(CTerrorPlayer*)&lt;br /&gt;
556	CTerrorPlayer::OnSpawn(void)&lt;br /&gt;
557	CTerrorPlayer::RestoreSpawn(void)&lt;br /&gt;
558	CTerrorPlayer::OnBeginChangeLevel(char  const*)&lt;br /&gt;
559	CTerrorPlayer::OnEndChangeLevel(void)&lt;br /&gt;
560	CTerrorPlayer::HandleCommand_JoinTeam(int,SurvivorCharacterType,bool)&lt;br /&gt;
561	CTerrorPlayer::SetDoingRestore(bool)&lt;br /&gt;
562	CTerrorPlayer::GetTeamSwitchRule(void)const&lt;br /&gt;
563	CTerrorPlayer::IsReadyToShove(void)&lt;br /&gt;
564	CTerrorPlayer::SetNextShoveTime(float)&lt;br /&gt;
565	CTerrorPlayer::CommitSuicide(bool)&lt;br /&gt;
566	CTerrorPlayer::OnSpokeConcept(CAI_Concept,AI_Response *)&lt;br /&gt;
567	CTerrorPlayer::RestoreWeapons(void)&lt;br /&gt;
568	CTerrorPlayer::DropWeaponInSlot(int)&lt;br /&gt;
569	CTerrorPlayer::QueueScreenBloodSplatter(int,float,CTerrorPlayer::SplatterType_t)&lt;br /&gt;
570	CTerrorPlayer::OnReloadEnd(void)&lt;br /&gt;
571	CTerrorPlayer::OnReloadAbort(void)&lt;br /&gt;
572	CTerrorPlayer::OnAttackSuccess(CBaseCombatCharacter *,bool)&lt;br /&gt;
573	CTerrorPlayer::CanBeShoved(CBaseEntity *)const&lt;br /&gt;
574	CTerrorPlayer::IsWielding(CSWeaponID)const&lt;br /&gt;
575	CTerrorPlayer::IsWieldingWeaponOfType(CSWeaponType)const&lt;br /&gt;
576	CTerrorPlayer::IsZoomed(void)&lt;br /&gt;
577	CTerrorPlayer::CanPlayerJump(void)const&lt;br /&gt;
578	CTerrorPlayer::PlayerZombieAbortControl(void)&lt;br /&gt;
579	CTerrorPlayer::CanBeShoved(void)&lt;br /&gt;
580	CTerrorPlayer::SetClass(ZombieClassType)&lt;br /&gt;
581	CTerrorPlayer::SetCharacter(SurvivorCharacterType)&lt;br /&gt;
582	CTerrorPlayer::OnRevived(void)&lt;br /&gt;
583	CTerrorPlayer::OnAwardEarned(AwardType,CBaseEntity *)&lt;br /&gt;
584	CTerrorPlayer::OnAwardLost(AwardType)&lt;br /&gt;
585	CTerrorPlayer::ScoreKilledZombie(ZombieClassType)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Mercurial_Tutorial&amp;diff=7464</id>
		<title>Mercurial Tutorial</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Mercurial_Tutorial&amp;diff=7464"/>
		<updated>2009-12-18T10:12:48Z</updated>

		<summary type="html">&lt;p&gt;DS: /* Workflow */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mercurial (Hg) is a distributed version control system.  While it has similarities with [[Subversion Tutorial|Subverison]], it is decentralized in nature.  &lt;br /&gt;
&lt;br /&gt;
=Getting Started=&lt;br /&gt;
==Introduction==&lt;br /&gt;
Mercurial keeps source code in '''repositories'''.  Changes to the source code are made inside the repository and are periodically '''committed'''.  When you commit changes, they are wrapped into a '''changeset'''.  A repository is the sum of all changesets committed over time.&lt;br /&gt;
&lt;br /&gt;
Unlike Subversion, Mercurial has no concept of a &amp;quot;master repository.&amp;quot;  Each user owns a complete local copy of the repository, and they can commit to it without needing any permissions.  Users can share changesets by '''pulling''' from other people's repositories, or '''pushing''' to other repositories (which may require special privileges).&lt;br /&gt;
&lt;br /&gt;
One very noticeable side effect is that when you commit changes in Mercurial, you do not need Internet access.  You only need Internet access if want to push changesets to a remote repository.  This means you can make as many commits as you want before pushing.&lt;br /&gt;
&lt;br /&gt;
'''Now for the contradiction''': You CAN have a master repository with Mercurial.  For some projects it is ideal to have a reference copy.  There is no difference between your copy and the master copy -- how it is managed is simply a matter of permissions and policy.  For example, AlliedModders has a &amp;quot;sourcemod-central&amp;quot; repository where developers push their changesets.  Only SourceMod developers can push to this copy, but anyone can copy it or pull its changes.&lt;br /&gt;
&lt;br /&gt;
==Basic Commands==&lt;br /&gt;
&lt;br /&gt;
These are a few essential Mercurial operations:&lt;br /&gt;
*&amp;lt;tt&amp;gt;clone&amp;lt;/tt&amp;gt; - Copies or downloads a repository.&lt;br /&gt;
*&amp;lt;tt&amp;gt;add&amp;lt;/tt&amp;gt; - Adds a file or directory to the local source tree.&lt;br /&gt;
*&amp;lt;tt&amp;gt;remove&amp;lt;/tt&amp;gt; - Removes a file or directory from the local source tree.&lt;br /&gt;
*&amp;lt;tt&amp;gt;commit&amp;lt;/tt&amp;gt; - Commits any local changes to your local source tree.&lt;br /&gt;
*&amp;lt;tt&amp;gt;pull&amp;lt;/tt&amp;gt; - Retrieves changesets from another repository.&lt;br /&gt;
*&amp;lt;tt&amp;gt;update&amp;lt;/tt&amp;gt; - Updates source code with all pending pulled changes.&lt;br /&gt;
*&amp;lt;tt&amp;gt;push&amp;lt;/tt&amp;gt; - Pushes your changesets to a remote repository.&lt;br /&gt;
*&amp;lt;tt&amp;gt;merge&amp;lt;/tt&amp;gt; - Merges two repositories together (explained later).&lt;br /&gt;
&lt;br /&gt;
==Installing==&lt;br /&gt;
&lt;br /&gt;
The author of this article uses command line Mercurial (on both Linux and Windows).  You can download both the command line tools at the [http://www.selenic.com/mercurial/wiki/ Mercurial Site], and there is a TortoiseHg graphical tool for those who would like to try it.&lt;br /&gt;
&lt;br /&gt;
==Getting a Repository==&lt;br /&gt;
To retrieve a repository, you must use the &amp;quot;clone&amp;quot; command.  You can clone a local or remote repository.  Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg clone http://hg.alliedmods.net/sourcemod-central sourcemod-central&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can clone a repository from any location, even locally.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hg clone sourcemod-central sourcemod-copy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also create a new repository:&lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir project&lt;br /&gt;
cd project&lt;br /&gt;
hg init&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create a blank repository and initialize it with Mercurial.&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
Mercurial lets you configure default settings for all repositories and settings specific to one repository.  &lt;br /&gt;
&lt;br /&gt;
On Linux, the main configuration file is &amp;lt;tt&amp;gt;~/.hgrc&amp;lt;/tt&amp;gt;.  On Windows 2003/XP and prior, it is &amp;lt;tt&amp;gt;C:\Documents and Settings\&amp;amp;lt;account&amp;amp;gt;\Mercurial.ini&amp;lt;/tt&amp;gt;.  On Windows Vista, it is &amp;lt;tt&amp;gt;C:\Users\&amp;amp;lt;account&amp;amp;gt;\Mercurial.ini&amp;lt;/tt&amp;gt;.  If the file does not exist, you can create it.&lt;br /&gt;
&lt;br /&gt;
Per-repository configuration is done in &amp;lt;tt&amp;gt;&amp;amp;lt;repository&amp;amp;gt;\.hg\hgrc&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Identity===&lt;br /&gt;
Mercurial lets you configure an identity to associate with your changesets.  By default it uses the name of the account your computer is logged in as.  Many projects (AlliedModders included) use &amp;quot;Firstname Lastname &amp;lt;email&amp;gt;&amp;quot; instead.&lt;br /&gt;
&lt;br /&gt;
To set up your identity, open either your &amp;lt;tt&amp;gt;hgrc&amp;lt;/tt&amp;gt; file (either the main or local one).  Look for a &amp;quot;[ui]&amp;quot; section (or add a new one), and configure something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[ui]&lt;br /&gt;
username = David Anderson &amp;lt;dvander@alliedmods.net&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Push and Pull Locations===&lt;br /&gt;
By default, all &amp;quot;pull&amp;quot; operations on a repository occur from the original location you cloned from.  You can change that location by opening up &amp;lt;tt&amp;gt;&amp;amp;lt;repository&amp;amp;gt;\.hg\hgrc&amp;lt;/tt&amp;gt; and looking at the &amp;quot;[paths]&amp;quot; section.  You will see a lines like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[paths]&lt;br /&gt;
default = http://hg.alliedmods.net/sourcemod-central&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are going to be pushing to one main repository fairly often, you may want to set up a default push.  For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[paths]&lt;br /&gt;
default = http://hg.alliedmods.net/sourcemod-central&lt;br /&gt;
default-push = ssh://dvander@alliedmods.net@hg.alliedmods.net/sourcemod-central&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Note''': Mercurial uses double slashes to specify an absolute file-system path.  If you are using SSH with logical paths, you only need one slash.  For more information about this, visit the Mercurial documentation.  AlliedModders uses logical paths.&lt;br /&gt;
&lt;br /&gt;
==Changesets==&lt;br /&gt;
Unlike Subversion, Mercurial can't use version numbers to uniquely identify a changeset.  This is because sequential IDs may be duplicated across repositories.  Instead, Mercurial uses 160-bit changeset identifiers.  These are represented in hexadecimal (for example, &amp;lt;tt&amp;gt;fae5f33a1bb3&amp;lt;/tt&amp;gt;).  &lt;br /&gt;
&lt;br /&gt;
Mercurial also uses local revision numbers which are sequential IDs.  These are local to a repository and have no meaning in other repositories.  They are mainly provided for convenience and usability.  A full changeset in a local repository can be represented by &amp;quot;revision:changeset&amp;quot;.  For example, &amp;lt;tt&amp;gt;19108:fae5f33a1bb3&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The latest changeset is called &amp;lt;tt&amp;gt;tip&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
When using commands like &amp;quot;&amp;lt;tt&amp;gt;update&amp;lt;/tt&amp;gt;,&amp;quot; it is useful to refer to changesets.  You can do this in one of a few ways:&lt;br /&gt;
*Using the &amp;lt;tt&amp;gt;tip&amp;lt;/tt&amp;gt; keyword.  This is the latest changeset.&lt;br /&gt;
*Using a revision number.&lt;br /&gt;
*Using any subset of the changeset string that uniquely identifies the changeset.  For example, &amp;lt;tt&amp;gt;fa&amp;lt;/tt&amp;gt; might not be unique and would not work.  But &amp;lt;tt&amp;gt;fa35&amp;lt;/tt&amp;gt; might work for &amp;lt;tt&amp;gt;fae5f33a1bb3&amp;lt;/tt&amp;gt;.  If it doesn't, you can pick a different substring.&lt;br /&gt;
*Using tags.  Mercurial lets you tag a changeset with a unique alias for convenience (&amp;lt;tt&amp;gt;hg tag&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
==Workflow==&lt;br /&gt;
Let's go through a typical session of developing with Mercurial.  If you are working against a project that has a centralized copy, you may want to make sure you're up to date first.  This means '''pulling''' its changes and then '''updating'''.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg pull&lt;br /&gt;
hg update&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will grab the remote changes from the location you first cloned from.  Then it will apply the changes.  You can do this in one go with:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg pull -u&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also pull from a different repository if you want:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg pull -u http://some.other.site/sourcemod-central&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now let's say you make some changes.  You edit file A.cpp and you want to commit your change.  You can do this with:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg commit&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An editor will pop-up asking you to write a message describing your change.  This is required.&lt;br /&gt;
&lt;br /&gt;
Now you edit B.cpp and commit again.  You're done for the day, and you have two changesets sitting in your repository.  You want to push these upstream.  For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg push ssh://dvander@alliedmods.net@hg.alliedmods.net/sourcemod-central&lt;br /&gt;
searching for changes&lt;br /&gt;
adding changesets&lt;br /&gt;
adding manifests&lt;br /&gt;
adding file changes&lt;br /&gt;
added 2 changesets with 2 changes to 2 files&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or, if you have a &amp;lt;tt&amp;gt;default-push&amp;lt;/tt&amp;gt; configured:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg push&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If there is more than one person sharing and working on the code base, eventually you will need to deal with merges.  This is an extremely powerful (but also deceptively complex) aspect to Mercurial, and it is extremely important to read the next session.&lt;br /&gt;
&lt;br /&gt;
'''Note''': Since only the first line of a commit message is shown by the &amp;lt;tt&amp;gt;hg log&amp;lt;/tt&amp;gt; command by default, it is highly recommended that the first line of your message be able to stand alone.  For example, you might have a short summary of the commit on the first line that says &amp;quot;Added functions for creating dynamic hooks on virtual functions.&amp;quot; Further lines could give more details on the changes involved such as a list of all the functions that were added.&lt;br /&gt;
&lt;br /&gt;
=Merging and You=&lt;br /&gt;
==Introduction==&lt;br /&gt;
Imagine this scenario:&lt;br /&gt;
*Alice and Bob both have a copy of the source code at revision 'A'.&lt;br /&gt;
*Alice commits and pushes a change.  The main repository is now at changeset 'B'.&lt;br /&gt;
*Bob commits a change and is at changeset 'C'.&lt;br /&gt;
&lt;br /&gt;
Now Bob wants to pull.  He runs &amp;lt;tt&amp;gt;hg pull&amp;lt;/tt&amp;gt; and gets:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
searching for changes&lt;br /&gt;
adding changesets&lt;br /&gt;
adding manifests&lt;br /&gt;
adding file changes&lt;br /&gt;
added 1 changesets with 1 changes to 1 files (+1 heads)&lt;br /&gt;
(run 'hg heads' to see heads, 'hg merge' to merge)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What happened here?  Let's visualize it.  When Alice commits, her repository has gone from A to B like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Hg_alice_1.png]]&lt;br /&gt;
&lt;br /&gt;
When Bob commits, his repository goes from A to C like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Hg_bob_1.png]]&lt;br /&gt;
&lt;br /&gt;
After Bob pulls from Alice, his repository has '''multiple heads''' of development.  He's got two forks of the same codebase in his repository.  You can visualize it like this.  The blue arrow is Bob's changes, and the red arrow is Alice's changes.  They diverge from A.&lt;br /&gt;
&lt;br /&gt;
[[Image:Hg_bob_2.png]]&lt;br /&gt;
&lt;br /&gt;
Bob doesn't want to be in this state, so he '''merges'''.  Merging joins multiple heads back together.  Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg merge&lt;br /&gt;
1 files updated, 1 files merged, 0 files removed, 0 files unresolved&lt;br /&gt;
(branch merge, don't forget to commit)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Merges are changesets, and they must be committed.  Bob commits the merge, and now his repository looks like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Hg_bob_3.png]]&lt;br /&gt;
&lt;br /&gt;
'D' is the changeset that joins the two heads back together.  Now Bob can safely push his changes back, and Alice can pull from Bob.&lt;br /&gt;
&lt;br /&gt;
The above example happened from Bob trying to pull.  But if Bob had tried to push, he would have gotten a nasty error message:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg push&lt;br /&gt;
searching for changes&lt;br /&gt;
abort: push creates new remote heads!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This means Bob's push would have introduced multiple heads on the target repository, rather than his own.  This is generally a bad idea and as a policy projects often don't allow it at all.  Bob has to pull, update, and resolve the merge.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' For most merges, it is a good policy to write simple commit messages.  For example, &amp;quot;Merge.&amp;quot; would suffice.&lt;br /&gt;
&lt;br /&gt;
==Conflicts==&lt;br /&gt;
Merges which don't require any work on your part (other than running &amp;lt;tt&amp;gt;merge&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;commit&amp;lt;/tt&amp;gt;) are called '''trivial merges'''.  &lt;br /&gt;
&lt;br /&gt;
It is possible that Alice and Bob edited the same file however.  In many cases, Mercurial will be smart enough to handle this.  If Mercurial can't figure it out though -- you have to do manually merge the difference between the two files.  This is best done with a three-way merge program.&lt;br /&gt;
&lt;br /&gt;
An example of a merge conflict:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg merge&lt;br /&gt;
merging crab.cpp&lt;br /&gt;
merge: warning: conflicts during merge&lt;br /&gt;
merging crab.cpp failed!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Conflicts must be resolved immediately.  You should never leave your source code in a conflicted state.  If you don't have a merge program installed, the conflicted file(s) will be marked up.  For example, &amp;lt;tt&amp;gt;crab.cpp&amp;lt;/tt&amp;gt; might contain lines like these for each conflict:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; /tmp/conflict/crab.cpp&lt;br /&gt;
void function() {&lt;br /&gt;
=======&lt;br /&gt;
int function() {&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; /tmp/crab.cpp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The two &amp;quot;sides&amp;quot; of the &amp;lt;tt&amp;gt;=======&amp;lt;/tt&amp;gt; bar represent the local and incoming changes.  You should delete the markup and decide how to resolve the two sides.&lt;br /&gt;
&lt;br /&gt;
If you want to use and configure a merge program, see [http://www.selenic.com/mercurial/wiki/index.cgi/MergeProgram MergeProgram] at the Mercurial docs.  Though it's not listed, you can also use [http://www.scootersoftware.com/ Beyond Compare] (the author's personal choice).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Other Commands=&lt;br /&gt;
&amp;lt;tt&amp;gt;hg diff&amp;lt;/tt&amp;gt; is very useful for reviewing changes before you commit them.  You can also use it for generating patches.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;hg log&amp;lt;/tt&amp;gt; lets you view the changeset history.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;hg glog&amp;lt;/tt&amp;gt; lets you view an ASCII graph of the changeset history.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;hg identity&amp;lt;/tt&amp;gt; tells you the state of your repository.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;hg status&amp;lt;/tt&amp;gt; shows you any changed or unknown files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;hg status -m&amp;lt;/tt&amp;gt; shows you any changed files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;hg revert&amp;lt;/tt&amp;gt; will remove any changes you've made to one or more files.  It will save the originals as the same file name with &amp;lt;tt&amp;gt;.orig&amp;lt;/tt&amp;gt; at the end.&lt;br /&gt;
&lt;br /&gt;
For many commands you can specify a folder within the repository to only affect that folder and its children.  This can speed up slow operations.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=SSH Authentication=&lt;br /&gt;
If you are accessing your repository via SSH using the &amp;lt;tt&amp;gt;ssh&amp;lt;/tt&amp;gt; protocol, entering your password is annoying and could be a security risk.  You should look into using [[SSH_Keys|SSH Keys]] (full instructions are provided).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=AlliedModders=&lt;br /&gt;
AlliedModders has a public Mercurial listing at [http://hg.alliedmods.net/ http://hg.alliedmods.net/].&lt;br /&gt;
&lt;br /&gt;
Anyone can clone or pull from these.  Only developers with SSH access can push.  Developers should use the following URL formula for pushing: &amp;lt;pre&amp;gt;ssh://EMAIL@hg.alliedmods.net/PROJECT&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SSH keys are required for security.  You should also use the &amp;quot;Firstname Lastname &amp;amp;lt;email&amp;amp;gt;&amp;quot; authorship style.  It is a good idea to configure this ahead of time (read the configuration section above).&lt;br /&gt;
&lt;br /&gt;
It is also highly recommended that long commit messages be split with a short summary on the first line and details on further lines. (See the note at the bottom of the Workflow section above.)&lt;br /&gt;
&lt;br /&gt;
Note that unlike Subversion, you cannot checkout a folder within a repository.  This is by design.&lt;br /&gt;
&lt;br /&gt;
=External Links=&lt;br /&gt;
*[http://www.selenic.com/mercurial/wiki/ Mercurial Home Page]&lt;br /&gt;
*[http://www.selenic.com/mercurial/wiki/index.cgi/UnderstandingMercurial Understanding Mercurial]&lt;br /&gt;
*[http://hgbook.red-bean.com/ Hg Book, free online book about Mercurial]&lt;br /&gt;
*[http://www.selenic.com/mercurial/wiki/index.cgi/Tutorial Mercurial Tutorials]&lt;br /&gt;
&lt;br /&gt;
[[Category:Version Control Systems]]&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Mercurial_Tutorial&amp;diff=7463</id>
		<title>Mercurial Tutorial</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Mercurial_Tutorial&amp;diff=7463"/>
		<updated>2009-12-18T10:12:09Z</updated>

		<summary type="html">&lt;p&gt;DS: /* Push and Pull Locations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mercurial (Hg) is a distributed version control system.  While it has similarities with [[Subversion Tutorial|Subverison]], it is decentralized in nature.  &lt;br /&gt;
&lt;br /&gt;
=Getting Started=&lt;br /&gt;
==Introduction==&lt;br /&gt;
Mercurial keeps source code in '''repositories'''.  Changes to the source code are made inside the repository and are periodically '''committed'''.  When you commit changes, they are wrapped into a '''changeset'''.  A repository is the sum of all changesets committed over time.&lt;br /&gt;
&lt;br /&gt;
Unlike Subversion, Mercurial has no concept of a &amp;quot;master repository.&amp;quot;  Each user owns a complete local copy of the repository, and they can commit to it without needing any permissions.  Users can share changesets by '''pulling''' from other people's repositories, or '''pushing''' to other repositories (which may require special privileges).&lt;br /&gt;
&lt;br /&gt;
One very noticeable side effect is that when you commit changes in Mercurial, you do not need Internet access.  You only need Internet access if want to push changesets to a remote repository.  This means you can make as many commits as you want before pushing.&lt;br /&gt;
&lt;br /&gt;
'''Now for the contradiction''': You CAN have a master repository with Mercurial.  For some projects it is ideal to have a reference copy.  There is no difference between your copy and the master copy -- how it is managed is simply a matter of permissions and policy.  For example, AlliedModders has a &amp;quot;sourcemod-central&amp;quot; repository where developers push their changesets.  Only SourceMod developers can push to this copy, but anyone can copy it or pull its changes.&lt;br /&gt;
&lt;br /&gt;
==Basic Commands==&lt;br /&gt;
&lt;br /&gt;
These are a few essential Mercurial operations:&lt;br /&gt;
*&amp;lt;tt&amp;gt;clone&amp;lt;/tt&amp;gt; - Copies or downloads a repository.&lt;br /&gt;
*&amp;lt;tt&amp;gt;add&amp;lt;/tt&amp;gt; - Adds a file or directory to the local source tree.&lt;br /&gt;
*&amp;lt;tt&amp;gt;remove&amp;lt;/tt&amp;gt; - Removes a file or directory from the local source tree.&lt;br /&gt;
*&amp;lt;tt&amp;gt;commit&amp;lt;/tt&amp;gt; - Commits any local changes to your local source tree.&lt;br /&gt;
*&amp;lt;tt&amp;gt;pull&amp;lt;/tt&amp;gt; - Retrieves changesets from another repository.&lt;br /&gt;
*&amp;lt;tt&amp;gt;update&amp;lt;/tt&amp;gt; - Updates source code with all pending pulled changes.&lt;br /&gt;
*&amp;lt;tt&amp;gt;push&amp;lt;/tt&amp;gt; - Pushes your changesets to a remote repository.&lt;br /&gt;
*&amp;lt;tt&amp;gt;merge&amp;lt;/tt&amp;gt; - Merges two repositories together (explained later).&lt;br /&gt;
&lt;br /&gt;
==Installing==&lt;br /&gt;
&lt;br /&gt;
The author of this article uses command line Mercurial (on both Linux and Windows).  You can download both the command line tools at the [http://www.selenic.com/mercurial/wiki/ Mercurial Site], and there is a TortoiseHg graphical tool for those who would like to try it.&lt;br /&gt;
&lt;br /&gt;
==Getting a Repository==&lt;br /&gt;
To retrieve a repository, you must use the &amp;quot;clone&amp;quot; command.  You can clone a local or remote repository.  Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg clone http://hg.alliedmods.net/sourcemod-central sourcemod-central&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can clone a repository from any location, even locally.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hg clone sourcemod-central sourcemod-copy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also create a new repository:&lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir project&lt;br /&gt;
cd project&lt;br /&gt;
hg init&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create a blank repository and initialize it with Mercurial.&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
Mercurial lets you configure default settings for all repositories and settings specific to one repository.  &lt;br /&gt;
&lt;br /&gt;
On Linux, the main configuration file is &amp;lt;tt&amp;gt;~/.hgrc&amp;lt;/tt&amp;gt;.  On Windows 2003/XP and prior, it is &amp;lt;tt&amp;gt;C:\Documents and Settings\&amp;amp;lt;account&amp;amp;gt;\Mercurial.ini&amp;lt;/tt&amp;gt;.  On Windows Vista, it is &amp;lt;tt&amp;gt;C:\Users\&amp;amp;lt;account&amp;amp;gt;\Mercurial.ini&amp;lt;/tt&amp;gt;.  If the file does not exist, you can create it.&lt;br /&gt;
&lt;br /&gt;
Per-repository configuration is done in &amp;lt;tt&amp;gt;&amp;amp;lt;repository&amp;amp;gt;\.hg\hgrc&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Identity===&lt;br /&gt;
Mercurial lets you configure an identity to associate with your changesets.  By default it uses the name of the account your computer is logged in as.  Many projects (AlliedModders included) use &amp;quot;Firstname Lastname &amp;lt;email&amp;gt;&amp;quot; instead.&lt;br /&gt;
&lt;br /&gt;
To set up your identity, open either your &amp;lt;tt&amp;gt;hgrc&amp;lt;/tt&amp;gt; file (either the main or local one).  Look for a &amp;quot;[ui]&amp;quot; section (or add a new one), and configure something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[ui]&lt;br /&gt;
username = David Anderson &amp;lt;dvander@alliedmods.net&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Push and Pull Locations===&lt;br /&gt;
By default, all &amp;quot;pull&amp;quot; operations on a repository occur from the original location you cloned from.  You can change that location by opening up &amp;lt;tt&amp;gt;&amp;amp;lt;repository&amp;amp;gt;\.hg\hgrc&amp;lt;/tt&amp;gt; and looking at the &amp;quot;[paths]&amp;quot; section.  You will see a lines like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[paths]&lt;br /&gt;
default = http://hg.alliedmods.net/sourcemod-central&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are going to be pushing to one main repository fairly often, you may want to set up a default push.  For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[paths]&lt;br /&gt;
default = http://hg.alliedmods.net/sourcemod-central&lt;br /&gt;
default-push = ssh://dvander@alliedmods.net@hg.alliedmods.net/sourcemod-central&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Note''': Mercurial uses double slashes to specify an absolute file-system path.  If you are using SSH with logical paths, you only need one slash.  For more information about this, visit the Mercurial documentation.  AlliedModders uses logical paths.&lt;br /&gt;
&lt;br /&gt;
==Changesets==&lt;br /&gt;
Unlike Subversion, Mercurial can't use version numbers to uniquely identify a changeset.  This is because sequential IDs may be duplicated across repositories.  Instead, Mercurial uses 160-bit changeset identifiers.  These are represented in hexadecimal (for example, &amp;lt;tt&amp;gt;fae5f33a1bb3&amp;lt;/tt&amp;gt;).  &lt;br /&gt;
&lt;br /&gt;
Mercurial also uses local revision numbers which are sequential IDs.  These are local to a repository and have no meaning in other repositories.  They are mainly provided for convenience and usability.  A full changeset in a local repository can be represented by &amp;quot;revision:changeset&amp;quot;.  For example, &amp;lt;tt&amp;gt;19108:fae5f33a1bb3&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The latest changeset is called &amp;lt;tt&amp;gt;tip&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
When using commands like &amp;quot;&amp;lt;tt&amp;gt;update&amp;lt;/tt&amp;gt;,&amp;quot; it is useful to refer to changesets.  You can do this in one of a few ways:&lt;br /&gt;
*Using the &amp;lt;tt&amp;gt;tip&amp;lt;/tt&amp;gt; keyword.  This is the latest changeset.&lt;br /&gt;
*Using a revision number.&lt;br /&gt;
*Using any subset of the changeset string that uniquely identifies the changeset.  For example, &amp;lt;tt&amp;gt;fa&amp;lt;/tt&amp;gt; might not be unique and would not work.  But &amp;lt;tt&amp;gt;fa35&amp;lt;/tt&amp;gt; might work for &amp;lt;tt&amp;gt;fae5f33a1bb3&amp;lt;/tt&amp;gt;.  If it doesn't, you can pick a different substring.&lt;br /&gt;
*Using tags.  Mercurial lets you tag a changeset with a unique alias for convenience (&amp;lt;tt&amp;gt;hg tag&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
==Workflow==&lt;br /&gt;
Let's go through a typical session of developing with Mercurial.  If you are working against a project that has a centralized copy, you may want to make sure you're up to date first.  This means '''pulling''' its changes and then '''updating'''.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg pull&lt;br /&gt;
hg update&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will grab the remote changes from the location you first cloned from.  Then it will apply the changes.  You can do this in one go with:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg pull -u&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also pull from a different repository if you want:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg pull -u http://some.other.site/sourcemod-central&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now let's say you make some changes.  You edit file A.cpp and you want to commit your change.  You can do this with:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg commit&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An editor will pop-up asking you to write a message describing your change.  This is required.&lt;br /&gt;
&lt;br /&gt;
Now you edit B.cpp and commit again.  You're done for the day, and you have two changesets sitting in your repository.  You want to push these upstream.  For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg push ssh://dvander@alliedmods.net//hg/sourcemod-central&lt;br /&gt;
searching for changes&lt;br /&gt;
adding changesets&lt;br /&gt;
adding manifests&lt;br /&gt;
adding file changes&lt;br /&gt;
added 2 changesets with 2 changes to 2 files&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or, if you have a &amp;lt;tt&amp;gt;default-push&amp;lt;/tt&amp;gt; configured:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg push&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If there is more than one person sharing and working on the code base, eventually you will need to deal with merges.  This is an extremely powerful (but also deceptively complex) aspect to Mercurial, and it is extremely important to read the next session.&lt;br /&gt;
&lt;br /&gt;
'''Note''': Since only the first line of a commit message is shown by the &amp;lt;tt&amp;gt;hg log&amp;lt;/tt&amp;gt; command by default, it is highly recommended that the first line of your message be able to stand alone.  For example, you might have a short summary of the commit on the first line that says &amp;quot;Added functions for creating dynamic hooks on virtual functions.&amp;quot; Further lines could give more details on the changes involved such as a list of all the functions that were added.&lt;br /&gt;
&lt;br /&gt;
=Merging and You=&lt;br /&gt;
==Introduction==&lt;br /&gt;
Imagine this scenario:&lt;br /&gt;
*Alice and Bob both have a copy of the source code at revision 'A'.&lt;br /&gt;
*Alice commits and pushes a change.  The main repository is now at changeset 'B'.&lt;br /&gt;
*Bob commits a change and is at changeset 'C'.&lt;br /&gt;
&lt;br /&gt;
Now Bob wants to pull.  He runs &amp;lt;tt&amp;gt;hg pull&amp;lt;/tt&amp;gt; and gets:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
searching for changes&lt;br /&gt;
adding changesets&lt;br /&gt;
adding manifests&lt;br /&gt;
adding file changes&lt;br /&gt;
added 1 changesets with 1 changes to 1 files (+1 heads)&lt;br /&gt;
(run 'hg heads' to see heads, 'hg merge' to merge)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What happened here?  Let's visualize it.  When Alice commits, her repository has gone from A to B like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Hg_alice_1.png]]&lt;br /&gt;
&lt;br /&gt;
When Bob commits, his repository goes from A to C like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Hg_bob_1.png]]&lt;br /&gt;
&lt;br /&gt;
After Bob pulls from Alice, his repository has '''multiple heads''' of development.  He's got two forks of the same codebase in his repository.  You can visualize it like this.  The blue arrow is Bob's changes, and the red arrow is Alice's changes.  They diverge from A.&lt;br /&gt;
&lt;br /&gt;
[[Image:Hg_bob_2.png]]&lt;br /&gt;
&lt;br /&gt;
Bob doesn't want to be in this state, so he '''merges'''.  Merging joins multiple heads back together.  Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg merge&lt;br /&gt;
1 files updated, 1 files merged, 0 files removed, 0 files unresolved&lt;br /&gt;
(branch merge, don't forget to commit)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Merges are changesets, and they must be committed.  Bob commits the merge, and now his repository looks like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Hg_bob_3.png]]&lt;br /&gt;
&lt;br /&gt;
'D' is the changeset that joins the two heads back together.  Now Bob can safely push his changes back, and Alice can pull from Bob.&lt;br /&gt;
&lt;br /&gt;
The above example happened from Bob trying to pull.  But if Bob had tried to push, he would have gotten a nasty error message:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg push&lt;br /&gt;
searching for changes&lt;br /&gt;
abort: push creates new remote heads!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This means Bob's push would have introduced multiple heads on the target repository, rather than his own.  This is generally a bad idea and as a policy projects often don't allow it at all.  Bob has to pull, update, and resolve the merge.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' For most merges, it is a good policy to write simple commit messages.  For example, &amp;quot;Merge.&amp;quot; would suffice.&lt;br /&gt;
&lt;br /&gt;
==Conflicts==&lt;br /&gt;
Merges which don't require any work on your part (other than running &amp;lt;tt&amp;gt;merge&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;commit&amp;lt;/tt&amp;gt;) are called '''trivial merges'''.  &lt;br /&gt;
&lt;br /&gt;
It is possible that Alice and Bob edited the same file however.  In many cases, Mercurial will be smart enough to handle this.  If Mercurial can't figure it out though -- you have to do manually merge the difference between the two files.  This is best done with a three-way merge program.&lt;br /&gt;
&lt;br /&gt;
An example of a merge conflict:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg merge&lt;br /&gt;
merging crab.cpp&lt;br /&gt;
merge: warning: conflicts during merge&lt;br /&gt;
merging crab.cpp failed!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Conflicts must be resolved immediately.  You should never leave your source code in a conflicted state.  If you don't have a merge program installed, the conflicted file(s) will be marked up.  For example, &amp;lt;tt&amp;gt;crab.cpp&amp;lt;/tt&amp;gt; might contain lines like these for each conflict:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; /tmp/conflict/crab.cpp&lt;br /&gt;
void function() {&lt;br /&gt;
=======&lt;br /&gt;
int function() {&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; /tmp/crab.cpp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The two &amp;quot;sides&amp;quot; of the &amp;lt;tt&amp;gt;=======&amp;lt;/tt&amp;gt; bar represent the local and incoming changes.  You should delete the markup and decide how to resolve the two sides.&lt;br /&gt;
&lt;br /&gt;
If you want to use and configure a merge program, see [http://www.selenic.com/mercurial/wiki/index.cgi/MergeProgram MergeProgram] at the Mercurial docs.  Though it's not listed, you can also use [http://www.scootersoftware.com/ Beyond Compare] (the author's personal choice).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Other Commands=&lt;br /&gt;
&amp;lt;tt&amp;gt;hg diff&amp;lt;/tt&amp;gt; is very useful for reviewing changes before you commit them.  You can also use it for generating patches.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;hg log&amp;lt;/tt&amp;gt; lets you view the changeset history.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;hg glog&amp;lt;/tt&amp;gt; lets you view an ASCII graph of the changeset history.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;hg identity&amp;lt;/tt&amp;gt; tells you the state of your repository.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;hg status&amp;lt;/tt&amp;gt; shows you any changed or unknown files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;hg status -m&amp;lt;/tt&amp;gt; shows you any changed files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;hg revert&amp;lt;/tt&amp;gt; will remove any changes you've made to one or more files.  It will save the originals as the same file name with &amp;lt;tt&amp;gt;.orig&amp;lt;/tt&amp;gt; at the end.&lt;br /&gt;
&lt;br /&gt;
For many commands you can specify a folder within the repository to only affect that folder and its children.  This can speed up slow operations.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=SSH Authentication=&lt;br /&gt;
If you are accessing your repository via SSH using the &amp;lt;tt&amp;gt;ssh&amp;lt;/tt&amp;gt; protocol, entering your password is annoying and could be a security risk.  You should look into using [[SSH_Keys|SSH Keys]] (full instructions are provided).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=AlliedModders=&lt;br /&gt;
AlliedModders has a public Mercurial listing at [http://hg.alliedmods.net/ http://hg.alliedmods.net/].&lt;br /&gt;
&lt;br /&gt;
Anyone can clone or pull from these.  Only developers with SSH access can push.  Developers should use the following URL formula for pushing: &amp;lt;pre&amp;gt;ssh://EMAIL@hg.alliedmods.net/PROJECT&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SSH keys are required for security.  You should also use the &amp;quot;Firstname Lastname &amp;amp;lt;email&amp;amp;gt;&amp;quot; authorship style.  It is a good idea to configure this ahead of time (read the configuration section above).&lt;br /&gt;
&lt;br /&gt;
It is also highly recommended that long commit messages be split with a short summary on the first line and details on further lines. (See the note at the bottom of the Workflow section above.)&lt;br /&gt;
&lt;br /&gt;
Note that unlike Subversion, you cannot checkout a folder within a repository.  This is by design.&lt;br /&gt;
&lt;br /&gt;
=External Links=&lt;br /&gt;
*[http://www.selenic.com/mercurial/wiki/ Mercurial Home Page]&lt;br /&gt;
*[http://www.selenic.com/mercurial/wiki/index.cgi/UnderstandingMercurial Understanding Mercurial]&lt;br /&gt;
*[http://hgbook.red-bean.com/ Hg Book, free online book about Mercurial]&lt;br /&gt;
*[http://www.selenic.com/mercurial/wiki/index.cgi/Tutorial Mercurial Tutorials]&lt;br /&gt;
&lt;br /&gt;
[[Category:Version Control Systems]]&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Mercurial_User_Repositories&amp;diff=7462</id>
		<title>Mercurial User Repositories</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Mercurial_User_Repositories&amp;diff=7462"/>
		<updated>2009-12-18T10:08:01Z</updated>

		<summary type="html">&lt;p&gt;DS: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;At AlliedModders, every developer who has commit access to a [[Mercurial Tutorial|Mercurial]] repository (or even an SVN repository that requires SSH access) is able to have their own Mercurial forest. These forests are located under the /users subdirectory and may contain multiple repository clones.&lt;br /&gt;
&lt;br /&gt;
=Configuring SSH=&lt;br /&gt;
So that you won't need to type your username every time, add the following lines to &amp;lt;tt&amp;gt;~/.ssh/config&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Host hg.alliedmods.net&lt;br /&gt;
User mailuser@domain.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
where &amp;lt;tt&amp;gt;mailuser@domain.com&amp;lt;/tt&amp;gt; refers to the e-mail address you use for Mercurial or SVN access.&lt;br /&gt;
&lt;br /&gt;
=Creating a Repository=&lt;br /&gt;
In order to create a repository, run the following command. You're going to be using the same command whether you are creating a new, empty repository or cloning an existing one.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh hg.alliedmods.net clone myrepo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Note:''' &amp;lt;tt&amp;gt;myrepo&amp;lt;/tt&amp;gt; refers to the name of the new repository you wish to create, not the repository you're trying to clone from.&lt;br /&gt;
&lt;br /&gt;
Runnning the above command will start an interactive script which will prompt you to make a few choices. It is mostly self-explanatory. The out of the command should look something like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ds@iroh ~ $ ssh hg.alliedmods.net clone myrepo&lt;br /&gt;
Making repo myrepo for ds@alliedmods.net.&lt;br /&gt;
This repo will appear as hg.alliedmods.net/users/ds_alliedmods.net/myrepo&lt;br /&gt;
&lt;br /&gt;
0) Exit&lt;br /&gt;
1) Yes&lt;br /&gt;
2) No&lt;br /&gt;
&lt;br /&gt;
Proceed?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you select &amp;lt;tt&amp;gt;Yes&amp;lt;/tt&amp;gt; it will proceed to ask you about which existing repository you want to clone from or whether you wish to create a new, empty repository.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' As a shortcut, you may add a second argument to the clone command in order to specify an existing repository if you already know which one you wish to clone from:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh hg.alliedmods.net clone myrepo sourcemod-central&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Editing a Repository=&lt;br /&gt;
Once your repository has been created, you can edit its description. This description will appear when you go to http://hg.alliedmods.net/users/mailuser_domain.com. In order to do this, use the &amp;lt;tt&amp;gt;edit&amp;lt;/tt&amp;gt; command:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ds@iroh ~ $ ssh hg.alliedmods.net edit myrepo&lt;br /&gt;
0) Exit&lt;br /&gt;
1) Delete the repository&lt;br /&gt;
2) Edit the description&lt;br /&gt;
&lt;br /&gt;
What would you like to do?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may also delete the repository using this command.&lt;br /&gt;
&lt;br /&gt;
=Access Via the Web=&lt;br /&gt;
Your Mercurial forest is visible at http://hg.alliedmods.net/users/mailuser_domain.com and you'll be able to browse repository history via a web interface.&lt;br /&gt;
&lt;br /&gt;
Everyone may clone a repository using the following format:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hg clone http://hg.alliedmods.net/users/mailuser_domain.com/myrepo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Pushing Changes=&lt;br /&gt;
In order to push changes, you must use SSH like so:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh://hg.alliedmods.net/users/mailuser_domain.com/myrepo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may wish to add this to your local repository's hgrc file so that you don't need to type it every time:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default-push = ssh://hg.alliedmods.net/users/mailuser_domain.com/myrepo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Mercurial_User_Repositories&amp;diff=7461</id>
		<title>Mercurial User Repositories</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Mercurial_User_Repositories&amp;diff=7461"/>
		<updated>2009-12-18T10:07:18Z</updated>

		<summary type="html">&lt;p&gt;DS: A tired rough draft&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;At AlliedModders, every developer who has commit access to a Mercurial repository (or even an SVN repository that requires SSH access) is able to have their own Mercurial forest. These forests are located under the /users subdirectory and may contain multiple repository clones.&lt;br /&gt;
&lt;br /&gt;
=Configuring SSH=&lt;br /&gt;
So that you won't need to type your username every time, add the following lines to &amp;lt;tt&amp;gt;~/.ssh/config&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Host hg.alliedmods.net&lt;br /&gt;
User mailuser@domain.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
where &amp;lt;tt&amp;gt;mailuser@domain.com&amp;lt;/tt&amp;gt; refers to the e-mail address you use for Mercurial or SVN access.&lt;br /&gt;
&lt;br /&gt;
=Creating a Repository=&lt;br /&gt;
In order to create a repository, run the following command. You're going to be using the same command whether you are creating a new, empty repository or cloning an existing one.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh hg.alliedmods.net clone myrepo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Note:''' &amp;lt;tt&amp;gt;myrepo&amp;lt;/tt&amp;gt; refers to the name of the new repository you wish to create, not the repository you're trying to clone from.&lt;br /&gt;
&lt;br /&gt;
Runnning the above command will start an interactive script which will prompt you to make a few choices. It is mostly self-explanatory. The out of the command should look something like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ds@iroh ~ $ ssh hg.alliedmods.net clone myrepo&lt;br /&gt;
Making repo myrepo for ds@alliedmods.net.&lt;br /&gt;
This repo will appear as hg.alliedmods.net/users/ds_alliedmods.net/myrepo&lt;br /&gt;
&lt;br /&gt;
0) Exit&lt;br /&gt;
1) Yes&lt;br /&gt;
2) No&lt;br /&gt;
&lt;br /&gt;
Proceed?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you select &amp;lt;tt&amp;gt;Yes&amp;lt;/tt&amp;gt; it will proceed to ask you about which existing repository you want to clone from or whether you wish to create a new, empty repository.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' As a shortcut, you may add a second argument to the clone command in order to specify an existing repository if you already know which one you wish to clone from:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh hg.alliedmods.net clone myrepo sourcemod-central&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Editing a Repository=&lt;br /&gt;
Once your repository has been created, you can edit its description. This description will appear when you go to http://hg.alliedmods.net/users/mailuser_domain.com. In order to do this, use the &amp;lt;tt&amp;gt;edit&amp;lt;/tt&amp;gt; command:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ds@iroh ~ $ ssh hg.alliedmods.net edit myrepo&lt;br /&gt;
0) Exit&lt;br /&gt;
1) Delete the repository&lt;br /&gt;
2) Edit the description&lt;br /&gt;
&lt;br /&gt;
What would you like to do?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may also delete the repository using this command.&lt;br /&gt;
&lt;br /&gt;
=Access Via the Web=&lt;br /&gt;
Your Mercurial forest is visible at http://hg.alliedmods.net/users/mailuser_domain.com and you'll be able to browse repository history via a web interface.&lt;br /&gt;
&lt;br /&gt;
Everyone may clone a repository using the following format:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hg clone http://hg.alliedmods.net/users/mailuser_domain.com/myrepo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Pushing Changes=&lt;br /&gt;
In order to push changes, you must use SSH like so:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh://hg.alliedmods.net/users/mailuser_domain.com/myrepo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may wish to add this to your local repository's hgrc file so that you don't need to type it every time:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default-push = ssh://hg.alliedmods.net/users/mailuser_domain.com/myrepo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Mercurial_Tutorial&amp;diff=7460</id>
		<title>Mercurial Tutorial</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Mercurial_Tutorial&amp;diff=7460"/>
		<updated>2009-12-18T08:47:07Z</updated>

		<summary type="html">&lt;p&gt;DS: /* AlliedModders */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mercurial (Hg) is a distributed version control system.  While it has similarities with [[Subversion Tutorial|Subverison]], it is decentralized in nature.  &lt;br /&gt;
&lt;br /&gt;
=Getting Started=&lt;br /&gt;
==Introduction==&lt;br /&gt;
Mercurial keeps source code in '''repositories'''.  Changes to the source code are made inside the repository and are periodically '''committed'''.  When you commit changes, they are wrapped into a '''changeset'''.  A repository is the sum of all changesets committed over time.&lt;br /&gt;
&lt;br /&gt;
Unlike Subversion, Mercurial has no concept of a &amp;quot;master repository.&amp;quot;  Each user owns a complete local copy of the repository, and they can commit to it without needing any permissions.  Users can share changesets by '''pulling''' from other people's repositories, or '''pushing''' to other repositories (which may require special privileges).&lt;br /&gt;
&lt;br /&gt;
One very noticeable side effect is that when you commit changes in Mercurial, you do not need Internet access.  You only need Internet access if want to push changesets to a remote repository.  This means you can make as many commits as you want before pushing.&lt;br /&gt;
&lt;br /&gt;
'''Now for the contradiction''': You CAN have a master repository with Mercurial.  For some projects it is ideal to have a reference copy.  There is no difference between your copy and the master copy -- how it is managed is simply a matter of permissions and policy.  For example, AlliedModders has a &amp;quot;sourcemod-central&amp;quot; repository where developers push their changesets.  Only SourceMod developers can push to this copy, but anyone can copy it or pull its changes.&lt;br /&gt;
&lt;br /&gt;
==Basic Commands==&lt;br /&gt;
&lt;br /&gt;
These are a few essential Mercurial operations:&lt;br /&gt;
*&amp;lt;tt&amp;gt;clone&amp;lt;/tt&amp;gt; - Copies or downloads a repository.&lt;br /&gt;
*&amp;lt;tt&amp;gt;add&amp;lt;/tt&amp;gt; - Adds a file or directory to the local source tree.&lt;br /&gt;
*&amp;lt;tt&amp;gt;remove&amp;lt;/tt&amp;gt; - Removes a file or directory from the local source tree.&lt;br /&gt;
*&amp;lt;tt&amp;gt;commit&amp;lt;/tt&amp;gt; - Commits any local changes to your local source tree.&lt;br /&gt;
*&amp;lt;tt&amp;gt;pull&amp;lt;/tt&amp;gt; - Retrieves changesets from another repository.&lt;br /&gt;
*&amp;lt;tt&amp;gt;update&amp;lt;/tt&amp;gt; - Updates source code with all pending pulled changes.&lt;br /&gt;
*&amp;lt;tt&amp;gt;push&amp;lt;/tt&amp;gt; - Pushes your changesets to a remote repository.&lt;br /&gt;
*&amp;lt;tt&amp;gt;merge&amp;lt;/tt&amp;gt; - Merges two repositories together (explained later).&lt;br /&gt;
&lt;br /&gt;
==Installing==&lt;br /&gt;
&lt;br /&gt;
The author of this article uses command line Mercurial (on both Linux and Windows).  You can download both the command line tools at the [http://www.selenic.com/mercurial/wiki/ Mercurial Site], and there is a TortoiseHg graphical tool for those who would like to try it.&lt;br /&gt;
&lt;br /&gt;
==Getting a Repository==&lt;br /&gt;
To retrieve a repository, you must use the &amp;quot;clone&amp;quot; command.  You can clone a local or remote repository.  Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg clone http://hg.alliedmods.net/sourcemod-central sourcemod-central&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can clone a repository from any location, even locally.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hg clone sourcemod-central sourcemod-copy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also create a new repository:&lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir project&lt;br /&gt;
cd project&lt;br /&gt;
hg init&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create a blank repository and initialize it with Mercurial.&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
Mercurial lets you configure default settings for all repositories and settings specific to one repository.  &lt;br /&gt;
&lt;br /&gt;
On Linux, the main configuration file is &amp;lt;tt&amp;gt;~/.hgrc&amp;lt;/tt&amp;gt;.  On Windows 2003/XP and prior, it is &amp;lt;tt&amp;gt;C:\Documents and Settings\&amp;amp;lt;account&amp;amp;gt;\Mercurial.ini&amp;lt;/tt&amp;gt;.  On Windows Vista, it is &amp;lt;tt&amp;gt;C:\Users\&amp;amp;lt;account&amp;amp;gt;\Mercurial.ini&amp;lt;/tt&amp;gt;.  If the file does not exist, you can create it.&lt;br /&gt;
&lt;br /&gt;
Per-repository configuration is done in &amp;lt;tt&amp;gt;&amp;amp;lt;repository&amp;amp;gt;\.hg\hgrc&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Identity===&lt;br /&gt;
Mercurial lets you configure an identity to associate with your changesets.  By default it uses the name of the account your computer is logged in as.  Many projects (AlliedModders included) use &amp;quot;Firstname Lastname &amp;lt;email&amp;gt;&amp;quot; instead.&lt;br /&gt;
&lt;br /&gt;
To set up your identity, open either your &amp;lt;tt&amp;gt;hgrc&amp;lt;/tt&amp;gt; file (either the main or local one).  Look for a &amp;quot;[ui]&amp;quot; section (or add a new one), and configure something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[ui]&lt;br /&gt;
username = David Anderson &amp;lt;dvander@alliedmods.net&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Push and Pull Locations===&lt;br /&gt;
By default, all &amp;quot;pull&amp;quot; operations on a repository occur from the original location you cloned from.  You can change that location by opening up &amp;lt;tt&amp;gt;&amp;amp;lt;repository&amp;amp;gt;\.hg\hgrc&amp;lt;/tt&amp;gt; and looking at the &amp;quot;[paths]&amp;quot; section.  You will see a lines like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[paths]&lt;br /&gt;
default = http://hg.alliedmods.net/sourcemod-central&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are going to be pushing to one main repository fairly often, you may want to set up a default push.  For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[paths]&lt;br /&gt;
default = http://hg.alliedmods.net/sourcemod-central&lt;br /&gt;
default-push = ssh://dvander@hg.alliedmods.net//hg/sourcemod-central&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Note''': Mercurial uses double slashes to specify an absolute file-system path.  If you are using SSH with logical paths, you only need one slash.  For more information about this, visit the Mercurial documentation.  AlliedModders uses absolute paths.&lt;br /&gt;
&lt;br /&gt;
==Changesets==&lt;br /&gt;
Unlike Subversion, Mercurial can't use version numbers to uniquely identify a changeset.  This is because sequential IDs may be duplicated across repositories.  Instead, Mercurial uses 160-bit changeset identifiers.  These are represented in hexadecimal (for example, &amp;lt;tt&amp;gt;fae5f33a1bb3&amp;lt;/tt&amp;gt;).  &lt;br /&gt;
&lt;br /&gt;
Mercurial also uses local revision numbers which are sequential IDs.  These are local to a repository and have no meaning in other repositories.  They are mainly provided for convenience and usability.  A full changeset in a local repository can be represented by &amp;quot;revision:changeset&amp;quot;.  For example, &amp;lt;tt&amp;gt;19108:fae5f33a1bb3&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The latest changeset is called &amp;lt;tt&amp;gt;tip&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
When using commands like &amp;quot;&amp;lt;tt&amp;gt;update&amp;lt;/tt&amp;gt;,&amp;quot; it is useful to refer to changesets.  You can do this in one of a few ways:&lt;br /&gt;
*Using the &amp;lt;tt&amp;gt;tip&amp;lt;/tt&amp;gt; keyword.  This is the latest changeset.&lt;br /&gt;
*Using a revision number.&lt;br /&gt;
*Using any subset of the changeset string that uniquely identifies the changeset.  For example, &amp;lt;tt&amp;gt;fa&amp;lt;/tt&amp;gt; might not be unique and would not work.  But &amp;lt;tt&amp;gt;fa35&amp;lt;/tt&amp;gt; might work for &amp;lt;tt&amp;gt;fae5f33a1bb3&amp;lt;/tt&amp;gt;.  If it doesn't, you can pick a different substring.&lt;br /&gt;
*Using tags.  Mercurial lets you tag a changeset with a unique alias for convenience (&amp;lt;tt&amp;gt;hg tag&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
==Workflow==&lt;br /&gt;
Let's go through a typical session of developing with Mercurial.  If you are working against a project that has a centralized copy, you may want to make sure you're up to date first.  This means '''pulling''' its changes and then '''updating'''.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg pull&lt;br /&gt;
hg update&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will grab the remote changes from the location you first cloned from.  Then it will apply the changes.  You can do this in one go with:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg pull -u&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also pull from a different repository if you want:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg pull -u http://some.other.site/sourcemod-central&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now let's say you make some changes.  You edit file A.cpp and you want to commit your change.  You can do this with:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg commit&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An editor will pop-up asking you to write a message describing your change.  This is required.&lt;br /&gt;
&lt;br /&gt;
Now you edit B.cpp and commit again.  You're done for the day, and you have two changesets sitting in your repository.  You want to push these upstream.  For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg push ssh://dvander@alliedmods.net//hg/sourcemod-central&lt;br /&gt;
searching for changes&lt;br /&gt;
adding changesets&lt;br /&gt;
adding manifests&lt;br /&gt;
adding file changes&lt;br /&gt;
added 2 changesets with 2 changes to 2 files&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or, if you have a &amp;lt;tt&amp;gt;default-push&amp;lt;/tt&amp;gt; configured:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg push&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If there is more than one person sharing and working on the code base, eventually you will need to deal with merges.  This is an extremely powerful (but also deceptively complex) aspect to Mercurial, and it is extremely important to read the next session.&lt;br /&gt;
&lt;br /&gt;
'''Note''': Since only the first line of a commit message is shown by the &amp;lt;tt&amp;gt;hg log&amp;lt;/tt&amp;gt; command by default, it is highly recommended that the first line of your message be able to stand alone.  For example, you might have a short summary of the commit on the first line that says &amp;quot;Added functions for creating dynamic hooks on virtual functions.&amp;quot; Further lines could give more details on the changes involved such as a list of all the functions that were added.&lt;br /&gt;
&lt;br /&gt;
=Merging and You=&lt;br /&gt;
==Introduction==&lt;br /&gt;
Imagine this scenario:&lt;br /&gt;
*Alice and Bob both have a copy of the source code at revision 'A'.&lt;br /&gt;
*Alice commits and pushes a change.  The main repository is now at changeset 'B'.&lt;br /&gt;
*Bob commits a change and is at changeset 'C'.&lt;br /&gt;
&lt;br /&gt;
Now Bob wants to pull.  He runs &amp;lt;tt&amp;gt;hg pull&amp;lt;/tt&amp;gt; and gets:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
searching for changes&lt;br /&gt;
adding changesets&lt;br /&gt;
adding manifests&lt;br /&gt;
adding file changes&lt;br /&gt;
added 1 changesets with 1 changes to 1 files (+1 heads)&lt;br /&gt;
(run 'hg heads' to see heads, 'hg merge' to merge)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What happened here?  Let's visualize it.  When Alice commits, her repository has gone from A to B like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Hg_alice_1.png]]&lt;br /&gt;
&lt;br /&gt;
When Bob commits, his repository goes from A to C like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Hg_bob_1.png]]&lt;br /&gt;
&lt;br /&gt;
After Bob pulls from Alice, his repository has '''multiple heads''' of development.  He's got two forks of the same codebase in his repository.  You can visualize it like this.  The blue arrow is Bob's changes, and the red arrow is Alice's changes.  They diverge from A.&lt;br /&gt;
&lt;br /&gt;
[[Image:Hg_bob_2.png]]&lt;br /&gt;
&lt;br /&gt;
Bob doesn't want to be in this state, so he '''merges'''.  Merging joins multiple heads back together.  Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg merge&lt;br /&gt;
1 files updated, 1 files merged, 0 files removed, 0 files unresolved&lt;br /&gt;
(branch merge, don't forget to commit)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Merges are changesets, and they must be committed.  Bob commits the merge, and now his repository looks like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Hg_bob_3.png]]&lt;br /&gt;
&lt;br /&gt;
'D' is the changeset that joins the two heads back together.  Now Bob can safely push his changes back, and Alice can pull from Bob.&lt;br /&gt;
&lt;br /&gt;
The above example happened from Bob trying to pull.  But if Bob had tried to push, he would have gotten a nasty error message:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg push&lt;br /&gt;
searching for changes&lt;br /&gt;
abort: push creates new remote heads!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This means Bob's push would have introduced multiple heads on the target repository, rather than his own.  This is generally a bad idea and as a policy projects often don't allow it at all.  Bob has to pull, update, and resolve the merge.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' For most merges, it is a good policy to write simple commit messages.  For example, &amp;quot;Merge.&amp;quot; would suffice.&lt;br /&gt;
&lt;br /&gt;
==Conflicts==&lt;br /&gt;
Merges which don't require any work on your part (other than running &amp;lt;tt&amp;gt;merge&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;commit&amp;lt;/tt&amp;gt;) are called '''trivial merges'''.  &lt;br /&gt;
&lt;br /&gt;
It is possible that Alice and Bob edited the same file however.  In many cases, Mercurial will be smart enough to handle this.  If Mercurial can't figure it out though -- you have to do manually merge the difference between the two files.  This is best done with a three-way merge program.&lt;br /&gt;
&lt;br /&gt;
An example of a merge conflict:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg merge&lt;br /&gt;
merging crab.cpp&lt;br /&gt;
merge: warning: conflicts during merge&lt;br /&gt;
merging crab.cpp failed!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Conflicts must be resolved immediately.  You should never leave your source code in a conflicted state.  If you don't have a merge program installed, the conflicted file(s) will be marked up.  For example, &amp;lt;tt&amp;gt;crab.cpp&amp;lt;/tt&amp;gt; might contain lines like these for each conflict:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; /tmp/conflict/crab.cpp&lt;br /&gt;
void function() {&lt;br /&gt;
=======&lt;br /&gt;
int function() {&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; /tmp/crab.cpp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The two &amp;quot;sides&amp;quot; of the &amp;lt;tt&amp;gt;=======&amp;lt;/tt&amp;gt; bar represent the local and incoming changes.  You should delete the markup and decide how to resolve the two sides.&lt;br /&gt;
&lt;br /&gt;
If you want to use and configure a merge program, see [http://www.selenic.com/mercurial/wiki/index.cgi/MergeProgram MergeProgram] at the Mercurial docs.  Though it's not listed, you can also use [http://www.scootersoftware.com/ Beyond Compare] (the author's personal choice).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Other Commands=&lt;br /&gt;
&amp;lt;tt&amp;gt;hg diff&amp;lt;/tt&amp;gt; is very useful for reviewing changes before you commit them.  You can also use it for generating patches.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;hg log&amp;lt;/tt&amp;gt; lets you view the changeset history.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;hg glog&amp;lt;/tt&amp;gt; lets you view an ASCII graph of the changeset history.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;hg identity&amp;lt;/tt&amp;gt; tells you the state of your repository.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;hg status&amp;lt;/tt&amp;gt; shows you any changed or unknown files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;hg status -m&amp;lt;/tt&amp;gt; shows you any changed files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;hg revert&amp;lt;/tt&amp;gt; will remove any changes you've made to one or more files.  It will save the originals as the same file name with &amp;lt;tt&amp;gt;.orig&amp;lt;/tt&amp;gt; at the end.&lt;br /&gt;
&lt;br /&gt;
For many commands you can specify a folder within the repository to only affect that folder and its children.  This can speed up slow operations.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=SSH Authentication=&lt;br /&gt;
If you are accessing your repository via SSH using the &amp;lt;tt&amp;gt;ssh&amp;lt;/tt&amp;gt; protocol, entering your password is annoying and could be a security risk.  You should look into using [[SSH_Keys|SSH Keys]] (full instructions are provided).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=AlliedModders=&lt;br /&gt;
AlliedModders has a public Mercurial listing at [http://hg.alliedmods.net/ http://hg.alliedmods.net/].&lt;br /&gt;
&lt;br /&gt;
Anyone can clone or pull from these.  Only developers with SSH access can push.  Developers should use the following URL formula for pushing: &amp;lt;pre&amp;gt;ssh://EMAIL@hg.alliedmods.net/PROJECT&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SSH keys are required for security.  You should also use the &amp;quot;Firstname Lastname &amp;amp;lt;email&amp;amp;gt;&amp;quot; authorship style.  It is a good idea to configure this ahead of time (read the configuration section above).&lt;br /&gt;
&lt;br /&gt;
It is also highly recommended that long commit messages be split with a short summary on the first line and details on further lines. (See the note at the bottom of the Workflow section above.)&lt;br /&gt;
&lt;br /&gt;
Note that unlike Subversion, you cannot checkout a folder within a repository.  This is by design.&lt;br /&gt;
&lt;br /&gt;
=External Links=&lt;br /&gt;
*[http://www.selenic.com/mercurial/wiki/ Mercurial Home Page]&lt;br /&gt;
*[http://www.selenic.com/mercurial/wiki/index.cgi/UnderstandingMercurial Understanding Mercurial]&lt;br /&gt;
*[http://hgbook.red-bean.com/ Hg Book, free online book about Mercurial]&lt;br /&gt;
*[http://www.selenic.com/mercurial/wiki/index.cgi/Tutorial Mercurial Tutorials]&lt;br /&gt;
&lt;br /&gt;
[[Category:Version Control Systems]]&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Metamod:Source_1.8.0_Release_Notes&amp;diff=7437</id>
		<title>Metamod:Source 1.8.0 Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Metamod:Source_1.8.0_Release_Notes&amp;diff=7437"/>
		<updated>2009-10-30T04:54:50Z</updated>

		<summary type="html">&lt;p&gt;DS: /* SDK Changes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Metamod:Source 1.8.0 is currently in beta. These release notes are preliminary.&lt;br /&gt;
&lt;br /&gt;
=New Engine Support=&lt;br /&gt;
&lt;br /&gt;
Support has been added for using Metamod:Source on &amp;quot;Left 4 Dead 2&amp;quot;. This game uses a variation of the Source engine present in Left 4 Dead 1.&lt;br /&gt;
&lt;br /&gt;
==Linking Changes==&lt;br /&gt;
As of L4D2, Valve has ceased using the &amp;quot;*_i486.so&amp;quot; naming scheme for Linux binaries in favor of the slightly less meaningless &amp;quot;*_linux.so&amp;quot;. If you have plugins which link against tier0 or vstdlib, keep in mind that they are now tier0_linux.so and vstdlib_linux.so. Similarly, Metamod:Source now ships with both &amp;quot;server_i486.so&amp;quot; and &amp;quot;server_linux.so&amp;quot; and these binaries are identical.&lt;br /&gt;
&lt;br /&gt;
Metamod:Source will continue to automatically append an &amp;quot;_i486.so&amp;quot; when loading plugins, in order to maintain consistency across game engines for plugin distributors.&lt;br /&gt;
&lt;br /&gt;
==SDK Changes==&lt;br /&gt;
AlliedModders has reverse engineered an L4D2 SDK capable of building plugins. This attempt is preliminary and more fixes may come as we explore the engine. You can grab a copy from [http://hg.alliedmods.net/ our Mercurial forest] (see the bottom of the page). If you discover any changes yourself, we greatly appreciate [https://bugs.alliedmods.net/ bug reports] or any attempts at notifying us.&lt;br /&gt;
&lt;br /&gt;
Of note, &amp;lt;tt&amp;gt;IVEngineServer::Time()&amp;lt;/tt&amp;gt; is now &amp;lt;tt&amp;gt;IVEngineServer::OBSOLETE_Time()&amp;lt;/tt&amp;gt; and has been deprecated for tier0's &amp;lt;tt&amp;gt;Plat_FloatTime()&amp;lt;/tt&amp;gt; call. The &amp;lt;tt&amp;gt;convar.h&amp;lt;/tt&amp;gt; and SendProp headers changed as well.&lt;br /&gt;
&lt;br /&gt;
=Legacy API Changes=&lt;br /&gt;
A large number of SourceHook features have been backported from the &amp;quot;New API&amp;quot; version of SourceHook. These are:&lt;br /&gt;
*[[SourceHook Development#Global_Hooks|Global hooks]], also called &amp;quot;VP&amp;quot; and &amp;quot;DVP&amp;quot; hooks.&lt;br /&gt;
*[[SourceHook Development#Extended_Removal_Syntax|Extended removal and addition syntax]].&lt;br /&gt;
*[[SourceHook Development#Deprecated_Syntax|New SH_CALL]] - CallClasses are now deprecated, although unlike the &amp;quot;New API&amp;quot; SourceHook, the old syntax is still available.&lt;br /&gt;
*SH_GET_ORIG_VFNPTR macro.&lt;br /&gt;
&lt;br /&gt;
We have backported three extra API calls from the New API:&lt;br /&gt;
*&amp;lt;tt&amp;gt;IMetamodListener::OnUnlinkConCommandBase()&amp;lt;/tt&amp;gt; - Notification of plugin cvar removal.&lt;br /&gt;
*&amp;lt;tt&amp;gt;ISmmAPI::GetVSPInfo()&amp;lt;/tt&amp;gt; - Extended VSP information.&lt;br /&gt;
*&amp;lt;tt&amp;gt;ISmmAPI::GetSourceEngineBuild()&amp;lt;/tt&amp;gt; - Source Engine version information.&lt;br /&gt;
&lt;br /&gt;
Because of these changes, &amp;lt;tt&amp;gt;PLAPI_VERSION&amp;lt;/tt&amp;gt; has been incremented to 11. Plugins compiled against Metamod:Source 1.8's legacy API will not load on earlier versions.&lt;br /&gt;
&lt;br /&gt;
=New API Changes=&lt;br /&gt;
Metamod:Source now treats TF and DoD:S as a separate &amp;quot;Orange Box Valve&amp;quot; engine, since compatibility diverged with a recent update. &amp;lt;tt&amp;gt;GetSourceEngineBuild&amp;lt;/tt&amp;gt; now returns a new &amp;lt;tt&amp;gt;SOURCE_ENGINE_ORANGEBOXVALVE&amp;lt;/tt&amp;gt; value for this game. Similarly, users of the &amp;quot;extended loading&amp;quot; API will see this value in &amp;lt;tt&amp;gt;MetamodVersionInfo&amp;lt;/tt&amp;gt;. To preserve compatibility, Metamod:Source will default back to &amp;lt;tt&amp;gt;SOURCE_ENGINE_ORANGEBOX&amp;lt;/tt&amp;gt; when loading plugins which do not support &amp;lt;tt&amp;gt;SOURCE_ENGINE_ORANGEBOXVALVE&amp;lt;/tt&amp;gt; (however, &amp;lt;tt&amp;gt;GetSourceEngineBuild&amp;lt;/tt&amp;gt; will return the correct result).&lt;br /&gt;
&lt;br /&gt;
Also for users of the extended loading API, the &amp;lt;tt&amp;gt;MetamodVersionInfo&amp;lt;/tt&amp;gt; struct now has a &amp;lt;tt&amp;gt;game_dir&amp;lt;/tt&amp;gt; field which contains the game folder. Since it is only valid to read this field on newer versions, there is a helper function to retrieve the value or return &amp;lt;tt&amp;gt;NULL&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;METAMOD_PLAPI_VERSION&amp;lt;/tt&amp;gt; has been incremented to 15. Plugins compiled against Metamod:Source 1.8 will not load against earlier versions. However, extended loaders can take advantage of the new API while loading older plugins.&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Virtual_Offsets_(Source_Mods)&amp;diff=7432</id>
		<title>Virtual Offsets (Source Mods)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Virtual_Offsets_(Source_Mods)&amp;diff=7432"/>
		<updated>2009-10-28T03:15:16Z</updated>

		<summary type="html">&lt;p&gt;DS: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Metamod:Source Development]]&lt;br /&gt;
== Calling virtual functions ==&lt;br /&gt;
I got this method from [[User:Mani|Mani]], who I believe got it from [[User:PM|Pavol Marko]]. Thank you!&lt;br /&gt;
&lt;br /&gt;
I hope to expand on an actual explanation when I have the time (and understand it better). Hopefully, someone can expand on this, but for now I'll just post the examples and a list of the CCSPlayer virtual function table offsets.&lt;br /&gt;
&lt;br /&gt;
== Offset Lists ==&lt;br /&gt;
==== Counter-Strike: Source ====&lt;br /&gt;
* [[CCSPlayer Offset List (Counter-Strike: Source)|CCSPlayer]]&lt;br /&gt;
* [[CBaseCombatWeapon Offset List (Counter-Strike: Source)|CBaseCombatWeapon]]&lt;br /&gt;
* [[CCSGameRules Offset List (Counter-Strike: Source) | CCSGameRules]]&lt;br /&gt;
* [[CBaseGrenade Offset List (Counter-Strike: Source) | CBaseGrenade]]&lt;br /&gt;
* [[CDEagle Offset List (Counter-Strike: Source) | CDEagle]]&lt;br /&gt;
* [[CBasePlayer Offset List (Counter-Strike: Source) | CBasePlayer]]&lt;br /&gt;
&lt;br /&gt;
==== Day of Defeat: Source ====&lt;br /&gt;
* [[CDODPlayer Offset List (Day of Defeat: Source)|CDODPlayer]]&lt;br /&gt;
&lt;br /&gt;
==== Dystopia ====&lt;br /&gt;
* [[CDYSPlayer Offset List (Dystopia)|CDYSPlayer]]&lt;br /&gt;
&lt;br /&gt;
==== Empires v2.12 ====&lt;br /&gt;
* [[CSDKPlayer Offset List (Empires)|CSDKPlayer]]&lt;br /&gt;
&lt;br /&gt;
==== Fortress Forever ====&lt;br /&gt;
* [[CFFPlayer Offset List (Fortress Forever)|CFFPlayer]]&lt;br /&gt;
&lt;br /&gt;
==== Half-Life 2: Capture the Flag ====&lt;br /&gt;
* [[CHL2_Player Offset List (Half-Life 2: Capture the Flag)|CHL2_Player]]&lt;br /&gt;
&lt;br /&gt;
==== Half-Life 2: Deathmatch ====&lt;br /&gt;
* [[CHL2MP_Player Offset List (Half-Life 2: Deathmatch)|CHL2MP_Player]]&lt;br /&gt;
&lt;br /&gt;
==== Hidden: Source ====&lt;br /&gt;
* [[CSDKPlayer Offset List (Hidden: Source)|CSDKPlayer]]&lt;br /&gt;
&lt;br /&gt;
==== Insurgency ====&lt;br /&gt;
* [[CINSPlayer Offset List (Insurgency)|CINSPlayer]]&lt;br /&gt;
&lt;br /&gt;
==== Left 4 Dead ====&lt;br /&gt;
* [[CTerrorPlayer Offset List (Left 4 Dead)|CTerrorPlayer]]&lt;br /&gt;
&lt;br /&gt;
==== Left 4 Dead 2 ====&lt;br /&gt;
* [[CTerrorPlayer Offset List (Left 4 Dead 2)|CTerrorPlayer]]&lt;br /&gt;
&lt;br /&gt;
==== Obsidian Conflict ====&lt;br /&gt;
* [[CHL2MP_Player Offset List (Obsidian Conflict)|CHL2MP_Player]]&lt;br /&gt;
&lt;br /&gt;
==== Pirates, Vikings, and Knights II ====&lt;br /&gt;
* [[CPVK2Player Offset List (Pirates, Vikings, and Knights II)|CPVK2Player]]&lt;br /&gt;
&lt;br /&gt;
==== The Ship ====&lt;br /&gt;
* [[CShipPlayer Offset List (The Ship)|CShipPlayer]]&lt;br /&gt;
&lt;br /&gt;
==== SourceForts ====&lt;br /&gt;
* [[CHL2MP_Player Offset List (SourceForts)|CHL2MP_Player]]&lt;br /&gt;
&lt;br /&gt;
==== Synergy ====&lt;br /&gt;
* [[CHL2MP_Player Offset List (Synergy)|CHL2MP_Player]]&lt;br /&gt;
&lt;br /&gt;
==== Synergy SteamWorks (Synergy Orange Box Edition)====&lt;br /&gt;
* [[CHL2MP_Player Offset List (SynergyOB)|CHL2MP_Player]]&lt;br /&gt;
&lt;br /&gt;
==== Team Fortress 2 ====&lt;br /&gt;
* [[CTFPlayer Offset List (Team Fortress 2)|CTFPlayer]]&lt;br /&gt;
&lt;br /&gt;
==== Zombie Master ====&lt;br /&gt;
* [[CHL2MP_Player Offset List (Zombie Master)|CHL2MP_Player]]&lt;br /&gt;
&lt;br /&gt;
==== Zombie Panic: Source ====&lt;br /&gt;
* [[CHL2MP_Player Offset List (Zombie Panic: Source)|CHL2MP_Player]]&lt;br /&gt;
* [[CBasePlayer Offset List (Zombie Panic: Source)|CBasePlayer ]]&lt;br /&gt;
&lt;br /&gt;
==== GoldenEye: Source ====&lt;br /&gt;
* [[CGEPlayer Offset List (GoldenEye: Source)|CGEPlayer]]&lt;br /&gt;
&lt;br /&gt;
== How to use the examples ==&lt;br /&gt;
&lt;br /&gt;
Basically, this lets you call any [[virtual function]] by knowing it's offset. A table is created for each class that lists the address of the function for each virtual function. This method takes advantage of that to call those addresses.&lt;br /&gt;
&lt;br /&gt;
Look at the examples below and edit to match the function you want to call:&lt;br /&gt;
Use the offset for the function you want to call in this line. ([[CCSPlayer_offset_list_(SourceMM)]])&lt;br /&gt;
&amp;lt;cpp&amp;gt;void *func = vtable[m_Off_GiveNamedItem];&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Change this line to match your return type and parameters:&lt;br /&gt;
&amp;lt;cpp&amp;gt;union {CBaseEntity *(VfuncEmptyClass::*mfpnew)(const char *, int );&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Call the original function with your parameters (change the return type to match the function you're calling):&lt;br /&gt;
&amp;lt;cpp&amp;gt;return (CBaseEntity *) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)(ItemName, iSubType);&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You'll need to add an empty class for the union. Something like this:&lt;br /&gt;
&amp;lt;cpp&amp;gt;class VfuncEmptyClass {};&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
These examples are for CSS. Mani has created a set of macros to make this easier. If you ask nicely, maybe he'll give them to you or let you post them here.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;datamap_t *VFuncs::GetDataDescMap(CBaseEntity *pThisPtr)&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_GetDataDescMap]; &lt;br /&gt;
&lt;br /&gt;
	union {datamap_t *(VfuncEmptyClass::*mfpnew)();&lt;br /&gt;
#ifndef __linux__&lt;br /&gt;
        void *addr;	} u; 	u.addr = func;&lt;br /&gt;
#else /* GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 */&lt;br /&gt;
			struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
	return (datamap_t *) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void VFuncs::SetModel(CBaseEntity *pThisPtr, const char *ModelName)&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_SetModel]; &lt;br /&gt;
&lt;br /&gt;
	union {void (VfuncEmptyClass::*mfpnew)(const char *);&lt;br /&gt;
	#ifndef __linux__&lt;br /&gt;
			void *addr;	} u; 	u.addr = func;&lt;br /&gt;
	#else // GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 &lt;br /&gt;
				struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	(void) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)(ModelName);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void VFuncs::Teleport(CBaseEntity *pThisPtr, const Vector *newPosition, const QAngle *newAngles, const Vector *newVelocity)&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_Teleport]; &lt;br /&gt;
&lt;br /&gt;
	union {void (VfuncEmptyClass::*mfpnew)(const Vector *, const QAngle *, const Vector *);&lt;br /&gt;
	#ifndef __linux__&lt;br /&gt;
			void *addr;	} u; 	u.addr = func;&lt;br /&gt;
	#else // GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 &lt;br /&gt;
				struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	(void) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)(newPosition, newAngles, newVelocity);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Vector VFuncs::EyePosition( CBaseEntity *pThisPtr )&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_EyePosition]; &lt;br /&gt;
&lt;br /&gt;
	union {Vector (VfuncEmptyClass::*mfpnew)( void );&lt;br /&gt;
	#ifndef __linux__&lt;br /&gt;
			void *addr;	} u; 	u.addr = func;&lt;br /&gt;
	#else // GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 &lt;br /&gt;
				struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	return (Vector) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)( );&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
QAngle &amp;amp;VFuncs::EyeAngles( CBaseEntity *pThisPtr )&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_EyeAngles]; &lt;br /&gt;
&lt;br /&gt;
	union {QAngle&amp;amp; (VfuncEmptyClass::*mfpnew)( void );&lt;br /&gt;
	#ifndef __linux__&lt;br /&gt;
			void *addr;	} u; 	u.addr = func;&lt;br /&gt;
	#else // GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 &lt;br /&gt;
				struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	return (QAngle&amp;amp;) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)( );&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void VFuncs::Ignite(CBaseEntity *pThisPtr, float flFlameLifetime, bool bNPCOnly, float flSize, bool bCalledByLevelDesigner)&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_Ignite]; &lt;br /&gt;
&lt;br /&gt;
	union {void (VfuncEmptyClass::*mfpnew)(float , bool , float , bool );&lt;br /&gt;
	#ifndef __linux__&lt;br /&gt;
			void *addr;	} u; 	u.addr = func;&lt;br /&gt;
	#else // GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 &lt;br /&gt;
				struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	(void) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)(flFlameLifetime, bNPCOnly, flSize, bCalledByLevelDesigner);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
CBaseEntity *VFuncs::GiveNamedItem(CBaseEntity *pThisPtr, const char *ItemName, int iSubType)&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_GiveNamedItem]; &lt;br /&gt;
&lt;br /&gt;
	union {CBaseEntity *(VfuncEmptyClass::*mfpnew)(const char *, int );&lt;br /&gt;
	#ifndef __linux__&lt;br /&gt;
			void *addr;	} u; 	u.addr = func;&lt;br /&gt;
	#else // GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 &lt;br /&gt;
				struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	return (CBaseEntity *) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)(ItemName, iSubType);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void VFuncs::CommitSuicide(CBaseEntity *pThisPtr)&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_CommitSuicide]; &lt;br /&gt;
&lt;br /&gt;
	union {CBaseEntity *(VfuncEmptyClass::*mfpnew)( void );&lt;br /&gt;
	#ifndef __linux__&lt;br /&gt;
			void *addr;	} u; 	u.addr = func;&lt;br /&gt;
	#else // GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 &lt;br /&gt;
				struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	(reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=CTerrorPlayer_Offset_List_(Left_4_Dead_2)&amp;diff=7431</id>
		<title>CTerrorPlayer Offset List (Left 4 Dead 2)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=CTerrorPlayer_Offset_List_(Left_4_Dead_2)&amp;diff=7431"/>
		<updated>2009-10-28T03:14:46Z</updated>

		<summary type="html">&lt;p&gt;DS: Added offsets from demo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Also for use when using [[Virtual Offsets (Source Mods)|virtual offsets]].&lt;br /&gt;
&lt;br /&gt;
These are the &amp;lt;b&amp;gt;Windows&amp;lt;/b&amp;gt; offsets. &amp;lt;b&amp;gt;Linux offsets are 1 greater.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The List ==&lt;br /&gt;
This comes from the symbol tables, so you'll have to look in the SDK for return types.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Last Updated 27 October 2009&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Auto reconstructed from vtable block @ 0x00FC69A0&lt;br /&gt;
// from &amp;quot;server_linux.so&amp;quot;, by ida_vtables.idc&lt;br /&gt;
0	CTerrorPlayer::~CTerrorPlayer()&lt;br /&gt;
1	CBaseEntity::SetRefEHandle(CBaseHandle  const&amp;amp;)&lt;br /&gt;
2	CBaseEntity::GetRefEHandle(void)const&lt;br /&gt;
3	CBaseEntity::GetCollideable(void)&lt;br /&gt;
4	CBaseEntity::GetNetworkable(void)&lt;br /&gt;
5	CBaseEntity::GetBaseEntity(void)&lt;br /&gt;
6	CBaseEntity::GetModelIndex(void)const&lt;br /&gt;
7	CBaseEntity::GetModelName(void)const&lt;br /&gt;
8	CCSPlayer::SetModelIndex(int)&lt;br /&gt;
9	CTerrorPlayer::GetServerClass(void)&lt;br /&gt;
10	CTerrorPlayer::YouForgotToImplementOrDeclareServerClass(void)&lt;br /&gt;
11	CTerrorPlayer::GetDataDescMap(void)&lt;br /&gt;
12	CBaseAnimating::GetScriptDesc(void)&lt;br /&gt;
13	CBaseEntity::GetAIAddOn(void)const&lt;br /&gt;
14	CBaseAnimating::TestCollision(Ray_t  const&amp;amp;,unsigned int,CGameTrace &amp;amp;)&lt;br /&gt;
15	CTerrorPlayer::TestHitboxes(Ray_t  const&amp;amp;,unsigned int,CGameTrace &amp;amp;)&lt;br /&gt;
16	CBaseEntity::ComputeWorldSpaceSurroundingBox(Vector *,Vector *)&lt;br /&gt;
17	CTerrorPlayer::ShouldCollide(int,int)const&lt;br /&gt;
18	CBaseEntity::SetOwnerEntity(CBaseEntity*)&lt;br /&gt;
19	CTerrorPlayer::ShouldTransmit(CCheckTransmitInfo  const*)&lt;br /&gt;
20	CBasePlayer::UpdateTransmitState(void)&lt;br /&gt;
21	CBaseCombatCharacter::SetTransmit(CCheckTransmitInfo *,bool)&lt;br /&gt;
22	CBasePlayer::GetTracerType(void)&lt;br /&gt;
23	CTerrorPlayer::Spawn(void)&lt;br /&gt;
24	CBaseEntity::ShouldPrecache(void)&lt;br /&gt;
25	CTerrorPlayer::Precache(void)&lt;br /&gt;
26	CBasePlayer::SetModel(char  const*)&lt;br /&gt;
27	CBaseEntity::InitSharedVars(void)&lt;br /&gt;
28	CBaseMultiplayerPlayer::PostConstructor(char  const*)&lt;br /&gt;
29	CBaseEntity::PostClientActive(void)&lt;br /&gt;
30	CBaseEntity::OnParseMapDataFinished(void)&lt;br /&gt;
31	CBaseEntity::KeyValue(char  const*,char  const*)&lt;br /&gt;
32	CBaseEntity::KeyValue(char  const*,float)&lt;br /&gt;
33	CBaseEntity::KeyValue(char  const*,Vector  const&amp;amp;)&lt;br /&gt;
34	CBaseEntity::GetKeyValue(char  const*,char *,int)&lt;br /&gt;
35	CBasePlayer::Activate(void)&lt;br /&gt;
36	CBaseEntity::SetParent(CBaseEntity*,int)&lt;br /&gt;
37	CBaseEntity::SetStasis(bool)&lt;br /&gt;
38	CBaseEntity::IsInStasis(void)const&lt;br /&gt;
39	CTerrorPlayer::ObjectCaps(void)&lt;br /&gt;
40	CTerrorPlayer::GetUsePriority(CBaseEntity *)&lt;br /&gt;
41	CBaseEntity::GetGlowEntity(void)&lt;br /&gt;
42	CBaseEntity::GetUseType(CBaseEntity*)&lt;br /&gt;
43	CBaseEntity::AcceptInput(char  const*,CBaseEntity*,CBaseEntity*,variant_t,int)&lt;br /&gt;
44	CBasePlayer::GetPlayerName(void)const&lt;br /&gt;
45	CBasePlayer::DrawDebugGeometryOverlays(void)&lt;br /&gt;
46	CTerrorPlayer::DrawDebugTextOverlays(void)&lt;br /&gt;
47	CBasePlayer::Save(ISave &amp;amp;)&lt;br /&gt;
48	CBasePlayer::Restore(IRestore &amp;amp;)&lt;br /&gt;
49	CBasePlayer::ShouldSavePhysics(void)&lt;br /&gt;
50	CBaseEntity::OnSave(IEntitySaveUtils *)&lt;br /&gt;
51	CBasePlayer::OnRestore(void)&lt;br /&gt;
52	CBasePlayer::GetDemoRecordingState(KeyValues *)&lt;br /&gt;
53	CBasePlayer::RequiredEdictIndex(void)&lt;br /&gt;
54	CBaseEntity::MoveDone(void)&lt;br /&gt;
55	CBaseEntity::Think(void)&lt;br /&gt;
56	CBasePlayer::NetworkStateChanged_m_nNextThinkTick(void)&lt;br /&gt;
57	CBasePlayer::NetworkStateChanged_m_nNextThinkTick(void *)&lt;br /&gt;
58	CBaseAnimating::GetBaseAnimating(void)&lt;br /&gt;
59	CBaseAnimatingOverlay::GetBaseAnimatingOverlay(void)&lt;br /&gt;
60	CTerrorPlayer::GetResponseSystem(void)&lt;br /&gt;
61	CAI_ExpresserHost&amp;lt;CBasePlayer&amp;gt;::DispatchResponse(char  const*)&lt;br /&gt;
62	CBasePlayer::Classify(void)&lt;br /&gt;
63	CBaseEntity::DeathNotice(CBaseEntity*)&lt;br /&gt;
64	CTerrorPlayer::ShouldAttractAutoAim(CBaseEntity *)&lt;br /&gt;
65	CTerrorPlayer::GetAutoAimRadius(void)&lt;br /&gt;
66	CBaseEntity::GetAutoAimCenter(void)&lt;br /&gt;
67	CBaseEntity::GetBeamTraceFilter(void)&lt;br /&gt;
68	CBaseEntity::PassesDamageFilter(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
69	CCSPlayer::TraceAttack(CTakeDamageInfo  const&amp;amp;,Vector  const&amp;amp;,CGameTrace *)&lt;br /&gt;
70	CBaseEntity::CanBeHitByMeleeAttack(CBaseEntity*)&lt;br /&gt;
71	CTerrorPlayer::OnTakeDamage(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
72	CTerrorPlayer::TakeHealth(float,int)&lt;br /&gt;
73	CBaseEntity::IsAlive(void)const&lt;br /&gt;
74	CTerrorPlayer::Event_Killed(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
75	CBasePlayer::Event_KilledOther(CBaseEntity *,CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
76	CBaseCombatCharacter::BloodColor(void)&lt;br /&gt;
77	CBaseEntity::IsTriggered(CBaseEntity*)&lt;br /&gt;
78	CBaseEntity::IsNPC(void)const&lt;br /&gt;
79	CBaseCombatCharacter::MyCombatCharacterPointer(void)&lt;br /&gt;
80	CBaseEntity::MyNextBotPointer(void)&lt;br /&gt;
81	CBaseEntity::MyInfectedPointer(void)&lt;br /&gt;
82	CBaseEntity::GetDelay(void)&lt;br /&gt;
83	CBaseEntity::IsMoving(void)&lt;br /&gt;
84	CBaseEntity::DamageDecal(int,int)&lt;br /&gt;
85	CBaseEntity::DecalTrace(CGameTrace *,char  const*)&lt;br /&gt;
86	CBaseEntity::ImpactTrace(CGameTrace *,int,char *)&lt;br /&gt;
87	CBaseEntity::OnControls(CBaseEntity*)&lt;br /&gt;
88	CBaseEntity::HasTarget(string_t)&lt;br /&gt;
89	CBasePlayer::IsPlayer(void)const&lt;br /&gt;
90	CBasePlayer::IsNetClient(void)const&lt;br /&gt;
91	CBaseEntity::IsTemplate(void)&lt;br /&gt;
92	CBaseEntity::IsBaseObject(void)const&lt;br /&gt;
93	CBaseEntity::IsBaseTrain(void)const&lt;br /&gt;
94	CBaseEntity::IsElevator(void)const&lt;br /&gt;
95	CBaseEntity::IsBaseCombatWeapon(void)const&lt;br /&gt;
96	CBaseEntity::MyCombatWeaponPointer(void)&lt;br /&gt;
97	CBaseEntity::GetServerVehicle(void)&lt;br /&gt;
98	CBaseEntity::IsViewable(void)&lt;br /&gt;
99	CTerrorPlayer::ChangeTeam(int)&lt;br /&gt;
100	CBaseEntity::OnEntityEvent(EntityEvent_t,void *)&lt;br /&gt;
101	CBaseEntity::CanStandOn(CBaseEntity*)const&lt;br /&gt;
102	CBaseEntity::CanStandOn(edict_t *)const&lt;br /&gt;
103	CBaseEntity::GetEnemy(void)&lt;br /&gt;
104	CBaseEntity::GetEnemy(void)const&lt;br /&gt;
105	CBaseEntity::Use(CBaseEntity*,CBaseEntity*,USE_TYPE,float)&lt;br /&gt;
106	CBaseEntity::StartTouch(CBaseEntity*)&lt;br /&gt;
107	CTerrorPlayer::Touch(CBaseEntity *)&lt;br /&gt;
108	CBaseEntity::EndTouch(CBaseEntity*)&lt;br /&gt;
109	CBaseEntity::StartBlocked(CBaseEntity*)&lt;br /&gt;
110	CBaseEntity::Blocked(CBaseEntity*)&lt;br /&gt;
111	CBaseEntity::EndBlocked(void)&lt;br /&gt;
112	CBasePlayer::PhysicsSimulate(void)&lt;br /&gt;
113	CBaseEntity::PhysicsLandedOnGround(float)&lt;br /&gt;
114	CBasePlayer::UpdateOnRemove(void)&lt;br /&gt;
115	CBaseEntity::StopLoopingSounds(void)&lt;br /&gt;
116	CBaseEntity::SUB_AllowedToFade(void)&lt;br /&gt;
117	CTerrorPlayer::Teleport(Vector  const*,QAngle  const*,Vector  const*)&lt;br /&gt;
118	CBaseEntity::NotifySystemEvent(CBaseEntity*,notify_system_event_t,notify_system_event_params_t  const&amp;amp;)&lt;br /&gt;
119	CTerrorPlayer::MakeTracer(Vector  const&amp;amp;,CGameTrace  const&amp;amp;,int)&lt;br /&gt;
120	CBaseEntity::GetTracerAttachment(void)&lt;br /&gt;
121	CBaseEntity::FireBullets(FireBulletsInfo_t  const&amp;amp;)&lt;br /&gt;
122	CBasePlayer::DoImpactEffect(CGameTrace &amp;amp;,int)&lt;br /&gt;
123	CBaseEntity::Respawn(void)&lt;br /&gt;
124	CBaseEntity::IsLockedByMaster(void)&lt;br /&gt;
125	CBaseEntity::GetMaxHealth(void)const&lt;br /&gt;
126	CTerrorPlayer::ModifyOrAppendCriteria(AI_CriteriaSet &amp;amp;)&lt;br /&gt;
127	CTerrorPlayer::ModifyOrAppendDerivedCriteria(AI_CriteriaSet &amp;amp;)&lt;br /&gt;
128	CTerrorPlayer::NetworkStateChanged_m_iMaxHealth(void)&lt;br /&gt;
129	CTerrorPlayer::NetworkStateChanged_m_iMaxHealth(void *)&lt;br /&gt;
130	CBasePlayer::NetworkStateChanged_m_iHealth(void)&lt;br /&gt;
131	CBasePlayer::NetworkStateChanged_m_iHealth(void *)&lt;br /&gt;
132	CBasePlayer::NetworkStateChanged_m_lifeState(void)&lt;br /&gt;
133	CBasePlayer::NetworkStateChanged_m_lifeState(void *)&lt;br /&gt;
134	CBaseEntity::NetworkStateChanged_m_takedamage(void)&lt;br /&gt;
135	CBaseEntity::NetworkStateChanged_m_takedamage(void *)&lt;br /&gt;
136	CBaseEntity::GetDamageType(void)const&lt;br /&gt;
137	CBaseEntity::GetDamage(void)&lt;br /&gt;
138	CBaseEntity::SetDamage(float)&lt;br /&gt;
139	CBasePlayer::EyePosition(void)&lt;br /&gt;
140	CBasePlayer::EyeAngles(void)&lt;br /&gt;
141	CBasePlayer::LocalEyeAngles(void)&lt;br /&gt;
142	CBaseEntity::EarPosition(void)&lt;br /&gt;
143	CBasePlayer::BodyTarget(Vector  const&amp;amp;,bool)&lt;br /&gt;
144	CBaseEntity::HeadTarget(Vector  const&amp;amp;)&lt;br /&gt;
145	CBaseEntity::GetVectors(Vector *,Vector *,Vector *)const&lt;br /&gt;
146	CBaseEntity::GetViewOffset(void)const&lt;br /&gt;
147	CBaseEntity::SetViewOffset(Vector  const&amp;amp;)&lt;br /&gt;
148	CBasePlayer::GetSmoothedVelocity(void)&lt;br /&gt;
149	CBaseAnimating::GetVelocity(Vector *,Vector *)&lt;br /&gt;
150	CTerrorPlayer::GetFriction(void)const&lt;br /&gt;
151	CBaseCombatCharacter::FVisible(CBaseEntity *,int,CBaseEntity **)&lt;br /&gt;
152	CBaseCombatCharacter::FVisible(Vector  const&amp;amp;,int,CBaseEntity **)&lt;br /&gt;
153	CBaseEntity::CanBeSeenBy(CAI_BaseNPC *)&lt;br /&gt;
154	CBaseEntity::GetAttackDamageScale(CBaseEntity*)&lt;br /&gt;
155	CBaseEntity::GetReceivedDamageScale(CBaseEntity*)&lt;br /&gt;
156	CTerrorPlayer::OnGroundChanged(CBaseEntity *,CBaseEntity *)&lt;br /&gt;
157	CBaseEntity::GetGroundVelocityToApply(Vector &amp;amp;)&lt;br /&gt;
158	CBaseEntity::PhysicsSplash(Vector  const&amp;amp;,Vector  const&amp;amp;,float,float)&lt;br /&gt;
159	CBaseEntity::Splash(void)&lt;br /&gt;
160	CBaseEntity::WorldSpaceCenter(void)const&lt;br /&gt;
161	CCSPlayer::GetSoundEmissionOrigin(void)const&lt;br /&gt;
162	CBaseEntity::CreateVPhysics(void)&lt;br /&gt;
163	CBaseEntity::ForceVPhysicsCollide(CBaseEntity*)&lt;br /&gt;
164	CBasePlayer::VPhysicsDestroyObject(void)&lt;br /&gt;
165	CBasePlayer::VPhysicsUpdate(IPhysicsObject *)&lt;br /&gt;
166	CBaseEntity::VPhysicsTakeDamage(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
167	CBaseCombatCharacter::VPhysicsShadowCollision(int,gamevcollisionevent_t *)&lt;br /&gt;
168	CTerrorPlayer::VPhysicsShadowUpdate(IPhysicsObject *)&lt;br /&gt;
169	CBasePlayer::VPhysicsCollision(int,gamevcollisionevent_t *)&lt;br /&gt;
170	CBaseEntity::VPhysicsFriction(IPhysicsObject *,float,int,int)&lt;br /&gt;
171	CBaseEntity::UpdatePhysicsShadowToCurrentPosition(float)&lt;br /&gt;
172	CBaseEntity::VPhysicsGetObjectList(IPhysicsObject **,int)&lt;br /&gt;
173	CBaseEntity::VPhysicsIsFlesh(void)&lt;br /&gt;
174	CBaseEntity::CanPushEntity(CBaseEntity*)const&lt;br /&gt;
175	CBaseEntity::HasPhysicsAttacker(float)&lt;br /&gt;
176	CBasePlayer::PhysicsSolidMaskForEntity(void)const&lt;br /&gt;
177	CBaseEntity::ResolveFlyCollisionCustom(CGameTrace &amp;amp;,Vector &amp;amp;)&lt;br /&gt;
178	CBaseEntity::PerformCustomPhysics(Vector *,Vector *,QAngle *,QAngle *)&lt;br /&gt;
179	CBaseAnimating::GetStepOrigin(void)const&lt;br /&gt;
180	CBaseAnimating::GetStepAngles(void)const&lt;br /&gt;
181	CBaseEntity::ShouldDrawWaterImpacts(void)&lt;br /&gt;
182	CBasePlayer::NetworkStateChanged_m_fFlags(void)&lt;br /&gt;
183	CBasePlayer::NetworkStateChanged_m_fFlags(void *)&lt;br /&gt;
184	CBasePlayer::NetworkStateChanged_m_nWaterLevel(void)&lt;br /&gt;
185	CBasePlayer::NetworkStateChanged_m_nWaterLevel(void *)&lt;br /&gt;
186	CBasePlayer::NetworkStateChanged_m_hGroundEntity(void)&lt;br /&gt;
187	CBasePlayer::NetworkStateChanged_m_hGroundEntity(void *)&lt;br /&gt;
188	CBasePlayer::NetworkStateChanged_m_vecBaseVelocity(void)&lt;br /&gt;
189	CBasePlayer::NetworkStateChanged_m_vecBaseVelocity(void *)&lt;br /&gt;
190	CBasePlayer::NetworkStateChanged_m_flFriction(void)&lt;br /&gt;
191	CBasePlayer::NetworkStateChanged_m_flFriction(void *)&lt;br /&gt;
192	CBasePlayer::NetworkStateChanged_m_vecVelocity(void)&lt;br /&gt;
193	CBasePlayer::NetworkStateChanged_m_vecVelocity(void *)&lt;br /&gt;
194	CBaseEntity::NetworkStateChanged_m_bClientSideRagdoll(void)&lt;br /&gt;
195	CBaseEntity::NetworkStateChanged_m_bClientSideRagdoll(void *)&lt;br /&gt;
196	CBasePlayer::NetworkStateChanged_m_vecViewOffset(void)&lt;br /&gt;
197	CBasePlayer::NetworkStateChanged_m_vecViewOffset(void *)&lt;br /&gt;
198	CBaseEntity::RunVScripts(void)&lt;br /&gt;
199	CBaseAnimating::GetIdealSpeed(void)const&lt;br /&gt;
200	CBaseAnimating::GetIdealAccel(void)const&lt;br /&gt;
201	CBaseAnimatingOverlay::StudioFrameAdvance(void)&lt;br /&gt;
202	CBaseAnimating::ReachedEndOfSequence(void)&lt;br /&gt;
203	CBaseAnimating::OnSequenceSet(int)&lt;br /&gt;
204	CBaseAnimating::IsActivityFinished(void)&lt;br /&gt;
205	CBaseAnimating::GetSequenceGroundSpeed(CStudioHdr *,int)&lt;br /&gt;
206	CBaseAnimating::ClampRagdollForce(Vector  const&amp;amp;,Vector*)&lt;br /&gt;
207	CBaseAnimating::BecomeRagdollOnClient(Vector  const&amp;amp;)&lt;br /&gt;
208	CBaseAnimating::IsRagdoll(void)&lt;br /&gt;
209	CBaseAnimating::CanBecomeRagdoll(void)&lt;br /&gt;
210	CBaseAnimatingOverlay::GetSkeleton(CStudioHdr *,matrix3x4_t  const&amp;amp;,Vector *,QuaternionAligned *,int)&lt;br /&gt;
211	CBaseAnimating::GetBoneTransform(int,matrix3x4_t &amp;amp;)&lt;br /&gt;
212	CBaseAnimating::SetupBones(matrix3x4_t *,int)&lt;br /&gt;
213	CBaseAnimating::CalculateIKLocks(float)&lt;br /&gt;
214	CBaseAnimatingOverlay::DispatchAnimEvents(CBaseAnimating *)&lt;br /&gt;
215	CTerrorPlayer::HandleAnimEvent(animevent_t *)&lt;br /&gt;
216	CBaseAnimating::PopulatePoseParameters(void)&lt;br /&gt;
217	CBaseAnimating::GetAttachment(int,matrix3x4_t &amp;amp;)&lt;br /&gt;
218	CBaseAnimating::InitBoneControllers(void)&lt;br /&gt;
219	CBaseAnimating::GetGroundSpeedVelocity(void)&lt;br /&gt;
220	CBaseAnimating::IsViewModel(void)const&lt;br /&gt;
221	CTerrorPlayer::Ignite(float,bool,float,bool)&lt;br /&gt;
222	CBaseAnimating::IgniteLifetime(float)&lt;br /&gt;
223	CBaseAnimating::IgniteUseCheapEffect(bool)&lt;br /&gt;
224	CTerrorPlayer::Extinguish(void)&lt;br /&gt;
225	CBaseAnimating::IsFrozen(void)&lt;br /&gt;
226	CBaseAnimating::Freeze(float,CBaseEntity *,Ray_t *)&lt;br /&gt;
227	CBaseAnimating::Unfreeze(void)&lt;br /&gt;
228	CBaseAnimating::Dissolve(char  const*,float,bool,int,Vector,int)&lt;br /&gt;
229	CBaseAnimating::SetLightingOrigin(CBaseEntity *)&lt;br /&gt;
230	CBaseFlex::SetViewtarget(Vector  const&amp;amp;)&lt;br /&gt;
231	CBaseFlex::StartSceneEvent(CSceneEventInfo *,CChoreoScene *,CChoreoEvent *,CChoreoActor *,CBaseEntity *)&lt;br /&gt;
232	CBaseFlex::ProcessSceneEvents(void)&lt;br /&gt;
233	CBaseFlex::ProcessSceneEvent(CSceneEventInfo *,CChoreoScene *,CChoreoEvent *)&lt;br /&gt;
234	CBaseFlex::ClearSceneEvent(CSceneEventInfo *,bool,bool)&lt;br /&gt;
235	CBaseFlex::CheckSceneEventCompletion(CSceneEventInfo *,float,CChoreoScene *,CChoreoEvent *)&lt;br /&gt;
236	CTerrorPlayer::PlayScene(char  const*,float,AI_Response *,IRecipientFilter *)&lt;br /&gt;
237	CBaseFlex::PlayAutoGeneratedSoundScene(char  const*)&lt;br /&gt;
238	CBasePlayer::GetPhysicsImpactDamageTable(void)&lt;br /&gt;
239	CBaseCombatCharacter::FInViewCone(CBaseEntity *)&lt;br /&gt;
240	CBaseCombatCharacter::FInViewCone(Vector  const&amp;amp;)&lt;br /&gt;
241	CBaseCombatCharacter::FInAimCone(CBaseEntity *)&lt;br /&gt;
242	CBaseCombatCharacter::FInAimCone(Vector  const&amp;amp;)&lt;br /&gt;
243	CBaseCombatCharacter::ShouldShootMissTarget(CBaseCombatCharacter*)&lt;br /&gt;
244	CBaseCombatCharacter::FindMissTarget(void)&lt;br /&gt;
245	CBaseCombatCharacter::HandleInteraction(int,void *,CBaseCombatCharacter*)&lt;br /&gt;
246	CBasePlayer::BodyAngles(void)&lt;br /&gt;
247	CBaseCombatCharacter::BodyDirection2D(void)&lt;br /&gt;
248	CBaseCombatCharacter::BodyDirection3D(void)&lt;br /&gt;
249	CBaseCombatCharacter::HeadDirection2D(void)&lt;br /&gt;
250	CBaseCombatCharacter::HeadDirection3D(void)&lt;br /&gt;
251	CBaseCombatCharacter::EyeDirection2D(void)&lt;br /&gt;
252	CBaseCombatCharacter::EyeDirection3D(void)&lt;br /&gt;
253	CBaseCombatCharacter::IsHiddenByFog(Vector  const&amp;amp;)const&lt;br /&gt;
254	CBaseCombatCharacter::IsHiddenByFog(CBaseEntity *)const&lt;br /&gt;
255	CBaseCombatCharacter::IsHiddenByFog(float)const&lt;br /&gt;
256	CBaseCombatCharacter::GetFogObscuredRatio(Vector  const&amp;amp;)const&lt;br /&gt;
257	CBaseCombatCharacter::GetFogObscuredRatio(CBaseEntity *)const&lt;br /&gt;
258	CBaseCombatCharacter::GetFogObscuredRatio(float)const&lt;br /&gt;
259	CBaseCombatCharacter::GetFogParams(fogparams_t *)const&lt;br /&gt;
260	CBaseCombatCharacter::IsLookingTowards(CBaseEntity  const*,float)const&lt;br /&gt;
261	CBaseCombatCharacter::IsLookingTowards(Vector  const&amp;amp;,float)const&lt;br /&gt;
262	CBaseCombatCharacter::IsInFieldOfView(CBaseEntity *)const&lt;br /&gt;
263	CBaseCombatCharacter::IsInFieldOfView(Vector  const&amp;amp;)const&lt;br /&gt;
264	CBaseCombatCharacter::IsLineOfSightClear(CBaseEntity *,CBaseCombatCharacter::LineOfSightCheckType)const&lt;br /&gt;
265	CBaseCombatCharacter::IsLineOfSightClear(Vector  const&amp;amp;,CBaseCombatCharacter::LineOfSightCheckType,CBaseEntity *)const&lt;br /&gt;
266	CTerrorPlayer::OnFootstep(Vector  const&amp;amp;,bool,bool)&lt;br /&gt;
267	CCSPlayer::GetGroundSurface(void)const&lt;br /&gt;
268	CTerrorPlayer::GetFootstepSound(char  const*,bool,float,bool)const&lt;br /&gt;
269	CTerrorPlayer::AreFootstepsAudible(void)const&lt;br /&gt;
270	CTerrorPlayer::IsFootstepAudible(float,bool)const&lt;br /&gt;
271	CBaseCombatCharacter::GetFootstepRunThreshold(void)const&lt;br /&gt;
272	CBaseCombatCharacter::GiveAmmo(int,int,bool)&lt;br /&gt;
273	CTerrorPlayer::RemoveAmmo(int,int)&lt;br /&gt;
274	CBaseCombatCharacter::NPC_TranslateActivity(Activity)&lt;br /&gt;
275	CBaseCombatCharacter::Weapon_TranslateActivity(Activity,bool *)&lt;br /&gt;
276	CBaseCombatCharacter::Weapon_FrameUpdate(void)&lt;br /&gt;
277	CBaseCombatCharacter::Weapon_HandleAnimEvent(animevent_t *)&lt;br /&gt;
278	CTerrorPlayer::Weapon_CanUse(CBaseCombatWeapon *)&lt;br /&gt;
279	CTerrorPlayer::Weapon_Equip(CBaseCombatWeapon *)&lt;br /&gt;
280	CBaseCombatCharacter::Weapon_EquipAmmoOnly(CBaseCombatWeapon *)&lt;br /&gt;
281	CTerrorPlayer::Weapon_Drop(CBaseCombatWeapon *,Vector  const*,Vector  const*)&lt;br /&gt;
282	CCSPlayer::Weapon_Switch(CBaseCombatWeapon *,int)&lt;br /&gt;
283	CTerrorPlayer::Weapon_ShootPosition(void)&lt;br /&gt;
284	CTerrorPlayer::Weapon_CanSwitchTo(CBaseCombatWeapon *)&lt;br /&gt;
285	CBaseCombatCharacter::Weapon_SlotOccupied(CBaseCombatWeapon *)&lt;br /&gt;
286	CBaseCombatCharacter::Weapon_GetSlot(int)const&lt;br /&gt;
287	CBaseCombatCharacter::AddPlayerItem(CBaseCombatWeapon *)&lt;br /&gt;
288	CBasePlayer::RemovePlayerItem(CBaseCombatWeapon *)&lt;br /&gt;
289	CBaseCombatCharacter::CanBecomeServerRagdoll(void)&lt;br /&gt;
290	CTerrorPlayer::OnTakeDamage_Alive(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
291	CBaseCombatCharacter::OnTakeDamage_Dying(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
292	CBaseCombatCharacter::OnTakeDamage_Dead(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
293	CBaseCombatCharacter::GetAliveDuration(void)const&lt;br /&gt;
294	CBaseCombatCharacter::OnFriendDamaged(CBaseCombatCharacter*,CBaseEntity *)&lt;br /&gt;
295	CBaseCombatCharacter::NotifyFriendsOfDamage(CBaseEntity *)&lt;br /&gt;
296	CBaseCombatCharacter::HasEverBeenInjured(int)const&lt;br /&gt;
297	CBaseCombatCharacter::GetTimeSinceLastInjury(int)const&lt;br /&gt;
298	CBaseCombatCharacter::OnPlayerKilledOther(CBaseEntity *,CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
299	CBaseCombatCharacter::GetDeathActivity(void)&lt;br /&gt;
300	CBaseCombatCharacter::CorpseGib(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
301	CBaseCombatCharacter::CorpseFade(void)&lt;br /&gt;
302	CBaseCombatCharacter::HasHumanGibs(void)&lt;br /&gt;
303	CBaseCombatCharacter::HasAlienGibs(void)&lt;br /&gt;
304	CBaseCombatCharacter::ShouldGib(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
305	CBaseCombatCharacter::OnKilledNPC(CBaseCombatCharacter*)&lt;br /&gt;
306	CBaseCombatCharacter::Event_Gibbed(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
307	CBasePlayer::Event_Dying(void)&lt;br /&gt;
308	CBaseCombatCharacter::BecomeRagdoll(CTakeDamageInfo  const&amp;amp;,Vector  const&amp;amp;)&lt;br /&gt;
309	CBaseCombatCharacter::FixupBurningServerRagdoll(CBaseEntity *)&lt;br /&gt;
310	CBaseCombatCharacter::BecomeRagdollBoogie(CBaseEntity *,Vector  const&amp;amp;,float,int)&lt;br /&gt;
311	CBaseCombatCharacter::CheckTraceHullAttack(float,Vector  const&amp;amp;,Vector  const&amp;amp;,int,int,float,bool)&lt;br /&gt;
312	CBaseCombatCharacter::CheckTraceHullAttack(Vector  const&amp;amp;,Vector  const&amp;amp;,Vector  const&amp;amp;,Vector  const&amp;amp;,int,int,float,bool)&lt;br /&gt;
313	CBaseCombatCharacter::PushawayTouch(CBaseEntity *)&lt;br /&gt;
314	CBaseCombatCharacter::IRelationType(CBaseEntity *)&lt;br /&gt;
315	CBaseCombatCharacter::IRelationPriority(CBaseEntity *)&lt;br /&gt;
316	CBasePlayer::IsInAVehicle(void)const&lt;br /&gt;
317	CBasePlayer::GetVehicle(void)&lt;br /&gt;
318	CBasePlayer::GetVehicleEntity(void)&lt;br /&gt;
319	CBaseCombatCharacter::ExitVehicle(void)&lt;br /&gt;
320	CBaseCombatCharacter::CalcWeaponProficiency(CBaseCombatWeapon *)&lt;br /&gt;
321	CBaseCombatCharacter::GetAttackSpread(CBaseCombatWeapon *,CBaseEntity *)&lt;br /&gt;
322	CBaseCombatCharacter::GetSpreadBias(CBaseCombatWeapon *,CBaseEntity *)&lt;br /&gt;
323	CBasePlayer::DoMuzzleFlash(void)&lt;br /&gt;
324	CBaseCombatCharacter::AddEntityRelationship(CBaseEntity *,Disposition_t,int)&lt;br /&gt;
325	CBaseCombatCharacter::RemoveEntityRelationship(CBaseEntity *)&lt;br /&gt;
326	CBaseCombatCharacter::AddClassRelationship(Class_T,Disposition_t,int)&lt;br /&gt;
327	CBaseCombatCharacter::OnChangeActiveWeapon(CBaseCombatWeapon *,CBaseCombatWeapon *)&lt;br /&gt;
328	CTerrorPlayer::GetLastKnownArea(void)const&lt;br /&gt;
329	CTerrorPlayer::IsAreaTraversable(CNavArea  const*)const&lt;br /&gt;
330	CBaseCombatCharacter::ClearLastKnownArea(void)&lt;br /&gt;
331	CBaseCombatCharacter::UpdateLastKnownArea(void)&lt;br /&gt;
332	CTerrorPlayer::OnNavAreaChanged(CNavArea *,CNavArea *)&lt;br /&gt;
333	CTerrorPlayer::OnNavAreaRemoved(CNavArea *)&lt;br /&gt;
334	CTerrorPlayer::GetClass(void)const&lt;br /&gt;
335	CTerrorPlayer::CanBeA(ZombieClassType)const&lt;br /&gt;
336	CTerrorPlayer::OnHitByVomitJar(CBaseCombatCharacter *)&lt;br /&gt;
337	CTerrorPlayer::IsIT(void)const&lt;br /&gt;
338	CTerrorPlayer::OnPursuedBy(INextBot *)&lt;br /&gt;
339	CTerrorPlayer::IsGhost(void)const&lt;br /&gt;
340	CBasePlayer::NetworkStateChanged_m_iAmmo(void)&lt;br /&gt;
341	CBasePlayer::NetworkStateChanged_m_iAmmo(void *)&lt;br /&gt;
342	CCSPlayer::CreateViewModel(int)&lt;br /&gt;
343	CCSPlayer::SetupVisibility(CBaseEntity *,unsigned char *,int)&lt;br /&gt;
344	CTerrorPlayer::WantsLagCompensationOnEntity(CBaseEntity  const*,CUserCmd  const*,CBitVec&amp;lt;2048&amp;gt;  const*)const&lt;br /&gt;
345	CBasePlayer::SharedSpawn(void)&lt;br /&gt;
346	CBasePlayer::ForceRespawn(void)&lt;br /&gt;
347	CTerrorPlayer::InitialSpawn(void)&lt;br /&gt;
348	CBasePlayer::InitHUD(void)&lt;br /&gt;
349	CCSPlayer::ShowViewPortPanel(char  const*,bool,KeyValues *)&lt;br /&gt;
350	CCSPlayer::PlayerDeathThink(void)&lt;br /&gt;
351	CBasePlayer::Jump(void)&lt;br /&gt;
352	CBasePlayer::Duck(void)&lt;br /&gt;
353	CTerrorPlayer::Cough(CBasePlayer *)&lt;br /&gt;
354	CTerrorPlayer::PreThink(void)&lt;br /&gt;
355	CTerrorPlayer::PostThink(void)&lt;br /&gt;
356	CBasePlayer::DamageEffect(float,int)&lt;br /&gt;
357	CCSPlayer::OnDamagedByExplosion(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
358	CBasePlayer::ShouldFadeOnDeath(void)&lt;br /&gt;
359	CBasePlayer::IsFakeClient(void)const&lt;br /&gt;
360	CTerrorPlayer::GetCharacterDisplayName(void)&lt;br /&gt;
361	CBasePlayer::GetPlayerMins(void)const&lt;br /&gt;
362	CBasePlayer::GetPlayerMaxs(void)const&lt;br /&gt;
363	CTerrorPlayer::UpdateCollisionBounds(void)&lt;br /&gt;
364	CBasePlayer::CalcRoll(QAngle  const&amp;amp;,Vector  const&amp;amp;,float,float)&lt;br /&gt;
365	CBasePlayer::PackDeadPlayerItems(void)&lt;br /&gt;
366	CCSPlayer::RemoveAllItems(bool)&lt;br /&gt;
367	CTerrorPlayer::IsRunning(void)const&lt;br /&gt;
368	CBasePlayer::Weapon_SetLast(CBaseCombatWeapon *)&lt;br /&gt;
369	CBasePlayer::Weapon_ShouldSetLast(CBaseCombatWeapon *,CBaseCombatWeapon *)&lt;br /&gt;
370	CBasePlayer::Weapon_ShouldSelectItem(CBaseCombatWeapon *)&lt;br /&gt;
371	CBasePlayer::HasUnlockableWeapons(int)&lt;br /&gt;
372	CBasePlayer::UpdateClientData(void)&lt;br /&gt;
373	CBasePlayer::UpdateBattery(void)&lt;br /&gt;
374	CBasePlayer::ExitLadder(void)&lt;br /&gt;
375	CBasePlayer::GetLadderSurface(Vector  const&amp;amp;)&lt;br /&gt;
376	CTerrorPlayer::IsAbleToAutoCenterOnLadders(void)const&lt;br /&gt;
377	CBasePlayer::SetFlashlightEnabled(bool)&lt;br /&gt;
378	CCSPlayer::FlashlightIsOn(void)&lt;br /&gt;
379	CTerrorPlayer::FlashlightTurnOn(bool)&lt;br /&gt;
380	CTerrorPlayer::FlashlightTurnOff(bool)&lt;br /&gt;
381	CBasePlayer::IsIlluminatedByFlashlight(CBaseEntity *,float *)&lt;br /&gt;
382	CCSPlayer::UpdateStepSound(surfacedata_t *,Vector  const&amp;amp;,Vector  const&amp;amp;)&lt;br /&gt;
383	CCSPlayer::PlayStepSound(Vector &amp;amp;,surfacedata_t *,float,bool)&lt;br /&gt;
384	CBasePlayer::GetStepSoundVelocities(float *,float *)&lt;br /&gt;
385	CBasePlayer::SetStepSoundTime(stepsoundtimes_t,bool)&lt;br /&gt;
386	CTerrorPlayer::DeathSound(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
387	CBasePlayer::GetSoundscapeListener(void)&lt;br /&gt;
388	CCSPlayer::SetAnimation(PLAYER_ANIM)&lt;br /&gt;
389	CBasePlayer::OnMainActivityComplete(Activity,Activity)&lt;br /&gt;
390	CBasePlayer::OnMainActivityInterrupted(Activity,Activity)&lt;br /&gt;
391	CTerrorPlayer::ImpulseCommands(void)&lt;br /&gt;
392	CTerrorPlayer::CheatImpulseCommands(int)&lt;br /&gt;
393	CTerrorPlayer::ClientCommand(CCommand  const&amp;amp;)&lt;br /&gt;
394	CBasePlayer::StartObserverMode(int)&lt;br /&gt;
395	CBasePlayer::StopObserverMode(void)&lt;br /&gt;
396	CBasePlayer::ModeWantsSpectatorGUI(int)&lt;br /&gt;
397	CTerrorPlayer::SetObserverMode(int)&lt;br /&gt;
398	CBasePlayer::GetObserverMode(void)&lt;br /&gt;
399	CTerrorPlayer::SetObserverTarget(CBaseEntity *)&lt;br /&gt;
400	CBasePlayer::ObserverUse(bool)&lt;br /&gt;
401	CBasePlayer::GetObserverTarget(void)&lt;br /&gt;
402	CTerrorPlayer::FindNextObserverTarget(bool)&lt;br /&gt;
403	CCSPlayer::GetNextObserverSearchStartPoint(bool)&lt;br /&gt;
404	CTerrorPlayer::PassesObserverFilter(CBaseEntity  const*)&lt;br /&gt;
405	CTerrorPlayer::IsValidObserverTarget(CBaseEntity *)&lt;br /&gt;
406	CBasePlayer::CheckObserverSettings(void)&lt;br /&gt;
407	CBasePlayer::JumptoPosition(Vector  const&amp;amp;,QAngle  const&amp;amp;)&lt;br /&gt;
408	CBasePlayer::ForceObserverMode(int)&lt;br /&gt;
409	CCSPlayer::ResetObserverMode(void)&lt;br /&gt;
410	CBasePlayer::ValidateCurrentObserverTarget(void)&lt;br /&gt;
411	CBasePlayer::AttemptToExitFreezeCam(void)&lt;br /&gt;
412	CTerrorPlayer::WantsRoamingObserverMode(void)const&lt;br /&gt;
413	CCSPlayer::StartReplayMode(float,float,int)&lt;br /&gt;
414	CCSPlayer::StopReplayMode(void)&lt;br /&gt;
415	CBasePlayer::GetDelayTicks(void)&lt;br /&gt;
416	CBasePlayer::GetReplayEntity(void)&lt;br /&gt;
417	CBasePlayer::CreateCorpse(void)&lt;br /&gt;
418	CTerrorPlayer::EntSelectSpawnPoint(void)&lt;br /&gt;
419	CBasePlayer::GetInVehicle(IServerVehicle *,int)&lt;br /&gt;
420	CBasePlayer::LeaveVehicle(Vector  const&amp;amp;,QAngle  const&amp;amp;)&lt;br /&gt;
421	CBasePlayer::OnVehicleStart(void)&lt;br /&gt;
422	CBasePlayer::OnVehicleEnd(Vector &amp;amp;)&lt;br /&gt;
423	CTerrorPlayer::BumpWeapon(CBaseCombatWeapon *)&lt;br /&gt;
424	CBasePlayer::SelectLastItem(void)&lt;br /&gt;
425	CBasePlayer::SelectItem(char  const*,int)&lt;br /&gt;
426	CBasePlayer::SelectItem(CBaseCombatWeapon *)&lt;br /&gt;
427	CTerrorPlayer::ItemPostFrame(void)&lt;br /&gt;
428	CTerrorPlayer::GiveNamedItem(char  const*,int,bool)&lt;br /&gt;
429	CBasePlayer::CheckTrainUpdate(void)&lt;br /&gt;
430	CBasePlayer::SetPlayerUnderwater(bool)&lt;br /&gt;
431	CTerrorPlayer::PlayWadeSound(void)&lt;br /&gt;
432	CTerrorPlayer::CanBreatheUnderwater(void)const&lt;br /&gt;
433	CTerrorPlayer::CanRecoverCurrentDrowningDamage(void)const&lt;br /&gt;
434	CTerrorPlayer::PlayerUse(CBaseEntity *)&lt;br /&gt;
435	CCSPlayer::PlayUseDenySound(void)&lt;br /&gt;
436	CTerrorPlayer::FindUseEntity(float,float,float,bool *,bool)&lt;br /&gt;
437	CTerrorPlayer::IsUseableEntity(CBaseEntity *,unsigned int)&lt;br /&gt;
438	CTerrorPlayer::OnUseEntity(CBaseEntity *,USE_TYPE)&lt;br /&gt;
439	CTerrorPlayer::PickupObject(CBaseEntity *,bool)&lt;br /&gt;
440	CTerrorPlayer::ForceDropOfCarriedPhysObjects(CBaseEntity *)&lt;br /&gt;
441	CTerrorPlayer::GetHeldObjectMass(IPhysicsObject *)&lt;br /&gt;
442	CTerrorPlayer::IsHoldingEntity(CBaseEntity *)&lt;br /&gt;
443	CBasePlayer::UpdateGeigerCounter(void)&lt;br /&gt;
444	CBasePlayer::GetAutoaimVector(float)&lt;br /&gt;
445	CBasePlayer::GetAutoaimVector(float,float)&lt;br /&gt;
446	CBasePlayer::GetAutoaimVector(float,float,float,AimResults *)&lt;br /&gt;
447	CBasePlayer::GetAutoaimVector(autoaim_params_t &amp;amp;)&lt;br /&gt;
448	CBasePlayer::ShouldAutoaim(void)&lt;br /&gt;
449	CBasePlayer::ForceClientDllUpdate(void)&lt;br /&gt;
450	CBasePlayer::ProcessUsercmds(CUserCmd *,int,int,int,bool)&lt;br /&gt;
451	CTerrorPlayer::PlayerRunCommand(CUserCmd *,IMoveHelper *)&lt;br /&gt;
452	CBasePlayer::ChangeTeam(int,bool,bool)&lt;br /&gt;
453	CBaseMultiplayerPlayer::CanHearAndReadChatFrom(CBasePlayer *)&lt;br /&gt;
454	CBaseMultiplayerPlayer::CanSpeak(void)&lt;br /&gt;
455	CCSPlayer::ModifyOrAppendPlayerCriteria(AI_CriteriaSet &amp;amp;)&lt;br /&gt;
456	CTerrorPlayer::CheckChatText(char *,int)&lt;br /&gt;
457	CBasePlayer::CreateRagdollEntity(void)&lt;br /&gt;
458	CBasePlayer::ShouldAnnounceAchievement(void)&lt;br /&gt;
459	CTerrorPlayer::ForceChangeTeam(int)&lt;br /&gt;
460	CBasePlayer::IsFollowingPhysics(void)&lt;br /&gt;
461	CTerrorPlayer::InitVCollision(Vector  const&amp;amp;,Vector  const&amp;amp;)&lt;br /&gt;
462	CBasePlayer::UpdatePhysicsShadowToCurrentPosition(void)&lt;br /&gt;
463	CBasePlayer::Hints(void)&lt;br /&gt;
464	CBasePlayer::IsReadyToPlay(void)&lt;br /&gt;
465	CBasePlayer::IsReadyToSpawn(void)&lt;br /&gt;
466	CBasePlayer::ShouldGainInstantSpawn(void)&lt;br /&gt;
467	CBasePlayer::ResetPerRoundStats(void)&lt;br /&gt;
468	CBasePlayer::ResetScores(void)&lt;br /&gt;
469	CBasePlayer::EquipSuit(bool)&lt;br /&gt;
470	CBasePlayer::RemoveSuit(void)&lt;br /&gt;
471	CTerrorPlayer::OnUseEntityChanged(void)&lt;br /&gt;
472	CBasePlayer::CommitSuicide(bool,bool)&lt;br /&gt;
473	CBasePlayer::CommitSuicide(Vector  const&amp;amp;,bool,bool)&lt;br /&gt;
474	CBasePlayer::IsBot(void)const&lt;br /&gt;
475	CBaseMultiplayerPlayer::GetExpresser(void)&lt;br /&gt;
476	CCSPlayer::SpawnArmorValue(void)const&lt;br /&gt;
477	CTerrorPlayer::UpdateTonemapController(void)&lt;br /&gt;
478	CCSPlayer::NetworkStateChanged_m_ArmorValue(void)&lt;br /&gt;
479	CCSPlayer::NetworkStateChanged_m_ArmorValue(void *)&lt;br /&gt;
480	CTerrorPlayer::IsAutoCrouched(void)const&lt;br /&gt;
481	CTerrorPlayer::GetAvailableSteadyStateSlots(void)&lt;br /&gt;
482	CTerrorPlayer::OnSpeak(CBasePlayer *,char  const*,float)&lt;br /&gt;
483	CTerrorPlayer::OnVoiceTransmit(void)&lt;br /&gt;
484	CTerrorPlayer::PlayerSolidMask(bool)const&lt;br /&gt;
485	CAI_ExpresserHost&amp;lt;CBasePlayer&amp;gt;::NoteSpeaking(float,float)&lt;br /&gt;
486	CAI_ExpresserHost&amp;lt;CBasePlayer&amp;gt;::Speak(CAI_Concept,char  const*,char *,unsigned int,IRecipientFilter *)&lt;br /&gt;
487	CAI_ExpresserHost&amp;lt;CBasePlayer&amp;gt;::Speak(CAI_Concept,AI_CriteriaSet *,char *,unsigned int,IRecipientFilter *)&lt;br /&gt;
488	CAI_ExpresserHost&amp;lt;CBasePlayer&amp;gt;::PostSpeakDispatchResponse(CAI_Concept,AI_Response *)&lt;br /&gt;
489	CTerrorPlayer::SpeakIfAllowed(CAI_Concept,SpeechPriorityType,char  const*,char *,unsigned int,IRecipientFilter *)&lt;br /&gt;
490	CBaseMultiplayerPlayer::SpeakConceptIfAllowed(int,char  const*,char *,unsigned int,IRecipientFilter *)&lt;br /&gt;
491	CBaseMultiplayerPlayer::CanSpeakVoiceCommand(void)&lt;br /&gt;
492	CBaseMultiplayerPlayer::ShouldShowVoiceSubtitleToEnemy(void)&lt;br /&gt;
493	CBaseMultiplayerPlayer::NoteSpokeVoiceCommand(char  const*)&lt;br /&gt;
494	CBaseMultiplayerPlayer::OnAchievementEarned(int)&lt;br /&gt;
495	CBaseMultiplayerPlayer::GetMultiplayerExpresser(void)&lt;br /&gt;
496	CBaseMultiplayerPlayer::CalculateTeamBalanceScore(void)&lt;br /&gt;
497	CBaseMultiplayerPlayer::CreateExpresser(void)&lt;br /&gt;
498	CCSPlayer::FirePlayerHurtEvent(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
499	CTerrorPlayer::OnTakeDamageInternal(CTakeDamageInfo &amp;amp;)&lt;br /&gt;
500	CTerrorPlayer::AllowDamage(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
501	CTerrorPlayer::GetHealthBuffer(void)const&lt;br /&gt;
502	CTerrorPlayer::IsIncapacitated(void)const&lt;br /&gt;
503	CTerrorPlayer::GetAdjustedDamage(CTakeDamageInfo  const&amp;amp;,float,float,bool)&lt;br /&gt;
504	CTerrorPlayer::DoBloodEffect(float,CTakeDamageInfo  const&amp;amp;,Vector  const&amp;amp;,CGameTrace *)&lt;br /&gt;
505	CCSPlayer::GiveNamedItem(char  const*,int)&lt;br /&gt;
506	CCSPlayer::IsBeingGivenItem(void)const&lt;br /&gt;
507	CTerrorPlayer::DoAnimationEvent(PlayerAnimEvent_t,int)&lt;br /&gt;
508	CTerrorPlayer::KickBack(float,float,float,float,float,float,int)&lt;br /&gt;
509	CTerrorPlayer::IsImmobilized(void)const&lt;br /&gt;
510	CTerrorPlayer::GiveDefaultItems(void)&lt;br /&gt;
511	CTerrorPlayer::RoundRespawn(void)&lt;br /&gt;
512	CTerrorPlayer::ObserverRoundRespawn(void)&lt;br /&gt;
513	CCSPlayer::Blind(float,float,float)&lt;br /&gt;
514	CTerrorPlayer::Deafen(float,float,float)&lt;br /&gt;
515	CTerrorPlayer::ResetMaxSpeed(void)&lt;br /&gt;
516	CCSPlayer::HandleCommand_JoinClass(int)&lt;br /&gt;
517	CTerrorPlayer::HandleCommand_JoinTeam(int,char  const*,bool)&lt;br /&gt;
518	CTerrorPlayer::GetIntoGame(void)&lt;br /&gt;
519	CTerrorPlayer::WantsMOTD(void)const&lt;br /&gt;
520	CTerrorPlayer::AutoSelectTeam(void)&lt;br /&gt;
521	CTerrorPlayer::OnLeaveActiveState(void)&lt;br /&gt;
522	CTerrorPlayer::Pain(bool)&lt;br /&gt;
523	CTerrorPlayer::OnTeamChanged(int)&lt;br /&gt;
524	CTerrorPlayer::CanAttack(void)const&lt;br /&gt;
525	CTerrorPlayer::OnWeaponFired(void)&lt;br /&gt;
526	CCSPlayer::QueueScreenBloodSplatter(int,float)&lt;br /&gt;
527	CTerrorPlayer::OnReloadStart(bool,int,bool)&lt;br /&gt;
528	CTerrorPlayer::CreateNoise(float)&lt;br /&gt;
529	CTerrorPlayer::OnPreThinkObserverMode(void)&lt;br /&gt;
530	CTerrorPlayer::OnEnterRescueState(void)&lt;br /&gt;
531	CTerrorPlayer::OnPreThinkRescueState(void)&lt;br /&gt;
532	CTerrorPlayer::OnLeaveRescueState(void)&lt;br /&gt;
533	CTerrorPlayer::OnEnterGhostState(void)&lt;br /&gt;
534	CTerrorPlayer::OnPreThinkGhostState(void)&lt;br /&gt;
535	CTerrorPlayer::OnLeaveGhostState(void)&lt;br /&gt;
536	CTerrorPlayer::OnEnterIntroCameraState(void)&lt;br /&gt;
537	CTerrorPlayer::OnPreThinkIntroCameraState(void)&lt;br /&gt;
538	CTerrorPlayer::OnLeaveIntroCameraState(void)&lt;br /&gt;
539	CTerrorPlayer::OnLeaveDeathAnimState(void)&lt;br /&gt;
540	CTerrorPlayer::OnLeaveDeathWaitForKeyState(void)&lt;br /&gt;
541	CTerrorPlayer::CanUseFlashlight(void)const&lt;br /&gt;
542	CTerrorPlayer::UpdateAddonBits(void)&lt;br /&gt;
543	CTerrorPlayer::UpdateRadar(void)&lt;br /&gt;
544	CTerrorPlayer::SelectDeathPose(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
545	CTerrorPlayer::CanChangeName(void)const&lt;br /&gt;
546	CTerrorPlayer::ChangeName(char  const*)&lt;br /&gt;
547	CTerrorPlayer::IsProgressBarActive(void)const&lt;br /&gt;
548	CTerrorPlayer::CreateRagdollEntity(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
549	CTerrorPlayer::GetRagdollType(void)const&lt;br /&gt;
550	CTerrorPlayer::SetModelFromClass(void)&lt;br /&gt;
551	CTerrorPlayer::SetModelFromClassAtSpawn(void)&lt;br /&gt;
552	CTerrorPlayer::DropWeapons(bool)&lt;br /&gt;
553	CTerrorPlayer::RecordDamageTaken(char  const*,int)&lt;br /&gt;
554	CTerrorPlayer::OnPlayerDisconnected(CTerrorPlayer*)&lt;br /&gt;
555	CTerrorPlayer::OnSpawn(void)&lt;br /&gt;
556	CTerrorPlayer::RestoreSpawn(void)&lt;br /&gt;
557	CTerrorPlayer::OnBeginChangeLevel(char  const*)&lt;br /&gt;
558	CTerrorPlayer::OnEndChangeLevel(void)&lt;br /&gt;
559	CTerrorPlayer::SetDoingRestore(bool)&lt;br /&gt;
560	CTerrorPlayer::GetTeamSwitchRule(void)const&lt;br /&gt;
561	CTerrorPlayer::IsReadyToShove(void)&lt;br /&gt;
562	CTerrorPlayer::SetNextShoveTime(float)&lt;br /&gt;
563	CTerrorPlayer::CommitSuicide(bool)&lt;br /&gt;
564	CTerrorPlayer::OnSpokeConcept(CAI_Concept,AI_Response *)&lt;br /&gt;
565	CTerrorPlayer::RestoreWeapons(void)&lt;br /&gt;
566	CTerrorPlayer::DropWeaponInSlot(int)&lt;br /&gt;
567	CTerrorPlayer::QueueScreenBloodSplatter(int,float,CTerrorPlayer::SplatterType_t)&lt;br /&gt;
568	CTerrorPlayer::OnReloadEnd(void)&lt;br /&gt;
569	CTerrorPlayer::OnReloadAbort(void)&lt;br /&gt;
570	CTerrorPlayer::OnAttackSuccess(CBaseCombatCharacter *,bool)&lt;br /&gt;
571	CTerrorPlayer::CanBeShoved(CBaseEntity *)const&lt;br /&gt;
572	CTerrorPlayer::IsWielding(CSWeaponID)const&lt;br /&gt;
573	CTerrorPlayer::IsWieldingWeaponOfType(CSWeaponType)const&lt;br /&gt;
574	CTerrorPlayer::IsZoomed(void)&lt;br /&gt;
575	CTerrorPlayer::CanPlayerJump(void)const&lt;br /&gt;
576	CTerrorPlayer::PlayerZombieAbortControl(void)&lt;br /&gt;
577	CTerrorPlayer::CanBeShoved(void)&lt;br /&gt;
578	CTerrorPlayer::SetClass(ZombieClassType)&lt;br /&gt;
579	CTerrorPlayer::SetCharacter(void)&lt;br /&gt;
580	CTerrorPlayer::OnRevived(void)&lt;br /&gt;
581	CTerrorPlayer::OnAwardEarned(AwardType,CBaseEntity *)&lt;br /&gt;
582	CTerrorPlayer::OnAwardLost(AwardType)&lt;br /&gt;
583	CTerrorPlayer::ScoreKilledZombie(ZombieClassType)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Metamod:Source&amp;diff=7426</id>
		<title>Metamod:Source</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Metamod:Source&amp;diff=7426"/>
		<updated>2009-10-05T12:52:25Z</updated>

		<summary type="html">&lt;p&gt;DS: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:{{owned_project}}&lt;br /&gt;
==Introduction==&lt;br /&gt;
Metamod:Source is an API manager and interception handler that sits in between the [[Half-Life_2|Half-Life 2]] Engine (Source) and a subsequent Game Modification (MOD). It can dynamically load &amp;quot;Metamod:Source Plugins&amp;quot;, written in C++, to intercept, override, and hook Engine and GameDLL API interfaces. It also allows for inter-plugin communication.  As a backend it contains [[SourceHook]], a powerful library for safely manipulating virtual table hooks.&lt;br /&gt;
&lt;br /&gt;
[[Category:Half-Life 2]]&lt;br /&gt;
[[Category:Metamod:Source Documentation]]&lt;br /&gt;
&lt;br /&gt;
==Where to Download==&lt;br /&gt;
Metamod:Source is hosted on [http://sourceforge.net/projects/sourcemm Source Forge] or can be accessed via the [http://www.sourcemm.net/ Metamod:Source Home Page].&lt;br /&gt;
&lt;br /&gt;
==Naming Conventions==&lt;br /&gt;
The name &amp;quot;SourceMM&amp;quot; is no longer used.&lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
Metamod:Source is derived from the [[Metamod]] concept of intercepting calls between a game's engine and mod library.  While not based on the same code, the API is designed to be similar and familiar to [[Half-Life 1]] programmers.&lt;br /&gt;
&lt;br /&gt;
====SourceMod Core1====&lt;br /&gt;
Initially, the [[SourceMod]] project was started as the next-generation continuation of the [[AMX Mod X]] project.  It was designed to be a meta-interface layer for inter-communicating plugins.  However, as development continued, it was soon realized that the [[Valve Server Plugin]] interface would not be sufficient to provide proper engine access.&lt;br /&gt;
&lt;br /&gt;
[[User:PM|Pavol Marko]] (core1 developer) decided to add &amp;quot;SourceHook&amp;quot; to SourceMod core1.  It was embedded as a large library for hooking specific virtual table functions.  After multiple revisions (see [[SourceHook]] history), it became apparent that 1)SourceHook needed to be game and interface generic, and 2)SourceMod and SourceHook needed to be split into two separate projects.  The logic behind this was that SourceHook needed to be a layer above [[Valve Server Plugin]]s, in order to properly manage hooks with the least possibility of conflicts.  Furthermore, SourceMod should be a plugin to the SourceHook interface, rather than managing it.  This decision can be likened to [[Admin-Mod]]'s early decision to split into the first [[Metamod]] project.&lt;br /&gt;
&lt;br /&gt;
====SourceHook Finalized====&lt;br /&gt;
After four major revisions, [[SourceHook]] was mature enough to be used in a production environment.  While [[User:PM|PM]] concentrated on fleshing out [[SourceHook]], [[User:BAILOPAN|BAILOPAN]] and [[User:DS|DS]] created the GameDLL wrapper portion.&lt;br /&gt;
&lt;br /&gt;
====Version 1.0====&lt;br /&gt;
On May 6, 2005, Metamod:Source 1.0 was released with SourceHook v4.1 as a backend.  GameDLL wrapping was achieved by providing the engine with fake copies of the IServerGame* interfaces.  Once the true GameDLL location was known it would be loaded by Metamod:Source.  The fake interface then directly wrapped calls to the real GameDLL.&lt;br /&gt;
&lt;br /&gt;
====Version 1.1====&lt;br /&gt;
On October 21, 2005, the first major revision of Metamod:Source was released, featuring SourceHook v4.4, internal event listeners, dropped reliance on STL, and rewritten GameDLL hooking code.  The [[Day of Defeat|Day of Defeat:Source]] release by [[VALVe_Software|Valve Software]] revealed that the binary interface between the engine and mod wasn't necessarily public or current, and MM:S's detection was improved for compatibility and speed.  Furthermore, Metamod:Source stopped wrapping the GameDLL interfaces and began using SourceHook to hook them.&lt;br /&gt;
&lt;br /&gt;
====Version 1.2====&lt;br /&gt;
On January 7th, 2006, Metamod:Source was updated for SourceHook v4.3, but received no major API changes.&lt;br /&gt;
&lt;br /&gt;
====Version 1.3====&lt;br /&gt;
On August 16th, 2006, Metamod:Source was updated for SourceHook v4.4, minor API changes, bug fixes, and a sync to the latest HL2SDK.&lt;br /&gt;
&lt;br /&gt;
====Version 1.4====&lt;br /&gt;
On April 5th, 2007, Metamod:Source was updated with API for [[Valve Server Plugin]] interface hooking and crash-safe user message enumeration. An experimental gameinfo.txt update tool was also added. No SourceHook changes were made in this release.&lt;br /&gt;
&lt;br /&gt;
====Version 1.6====&lt;br /&gt;
Currently in development, Metamod:Source received a near complete overhaul to abstract engine-specific code to support Orange Box.  Additionally, SourceHook received a massive overhaul and is now v5.0, adding global hooks and various major API simplifications.  It is the first backwards compatibility break since 1.1.&lt;br /&gt;
&lt;br /&gt;
==Design Considerations==&lt;br /&gt;
====Metamod====&lt;br /&gt;
Originally, Metamod:Source was a plugin co-existing with SourceMod.  However, there are factories, pointers, and certain capabilities not possible from a [[Valve Server Plugin]].  Furthermore, the [[Half-Life 2]] engine does not properly unload VSPs, making debugging and resource unloading more difficult.  Eventually it was decided the added functionality and fine-tuned control outweighed the extra cost of having to configure an intercepting binary.&lt;br /&gt;
&lt;br /&gt;
====Plugins====&lt;br /&gt;
Plugins are specific to Metamod:Source.  This means that [[Valve Server Plugin]]s and [[Open_Source_Plugins_for_Metamod:Source|Metamod:Source Plugins]] are entirely separate in the API characteristics.  While it is certainly possible to expose the necessary interfaces to VSPs, it creates an added layer of complexity for dealing with things that Metamod:Source might not directly control.  For example, when a Metamod:Source plugin is removed at runtime, all of the necessary hooks are also removed.  A VSP has no clear callback for detecting this event, therefore it would be more difficult to ensure proper unloading.  VSP and MM:S plugins also have different ways of attaching and detaching server [[Cvars|cvars]] and [[Console commands|concmds]].&lt;br /&gt;
&lt;br /&gt;
By keeping the plugin system isolated, Metamod:Source can also provide a unique set of console commands and API.  For example, plugins can listen for certain Metamod:Source-specific events and provide communication channels with other plugins.&lt;br /&gt;
&lt;br /&gt;
====Hooking====&lt;br /&gt;
Metamod:Source is powered by [[SourceHook]], a versatile library for hooking virtual functions.  The original [[Half-Life 1]] engine used structs of function pointers which could easily be modified as they passed from one library to another.  However, HL2 is comprised almost entirely of pure virtual interfaces.  SourceHook was designed for declaring single hooks against a given virtual function and a this pointer, which is not only faster than a blanket hooking system like Metamod's, but more flexible and precise.&lt;br /&gt;
&lt;br /&gt;
Hooking under Metamod:Source has a number of features that don't exist in a hooking system style like Metamod's, and it achieves something closer to [[Detours|detours]], rather than Metamod, which is hardcoded.  For example&lt;br /&gt;
*You can change parent parameters during a hooked call&lt;br /&gt;
*You can hook member functions, both by a pre-existing declaration or given vtable offset&lt;br /&gt;
*You can call the original function and still fire its associated hooks, or you can call it without firing hooks in order to prevent infinite recursion&lt;br /&gt;
&lt;br /&gt;
==Documentation==&lt;br /&gt;
For more information on installing, configuring, and coding for Metamod:Source, see [[:Category:Documentation (SourceMM)|Documentation]].&lt;br /&gt;
&lt;br /&gt;
==The Future==&lt;br /&gt;
While Metamod:Source is a stable/production product, more features are on the horizon.  There are distant plans for a [[Detours|detouring]] library and a library for efficiently automated [[Signature Scanning|signature scanning]].&lt;br /&gt;
&lt;br /&gt;
==License==&lt;br /&gt;
Metamod:Source is licensed under the [[zLib/libpng License]].  It is free to use for both open-source and proprietary projects.&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
*[http://www.sourcemm.net/ Metamod:Source Website]&lt;br /&gt;
*[http://www.metamod.org/ Metamod Website]&lt;br /&gt;
*[http://www.sourcemod.net/ SourceMod Website]&lt;br /&gt;
*[http://resonus.net/doxygen_sourcemm/ Doxygen of Metamod:Source]&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=CTerrorPlayer_Offset_List_(Left_4_Dead)&amp;diff=7371</id>
		<title>CTerrorPlayer Offset List (Left 4 Dead)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=CTerrorPlayer_Offset_List_(Left_4_Dead)&amp;diff=7371"/>
		<updated>2009-08-16T06:08:46Z</updated>

		<summary type="html">&lt;p&gt;DS: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Also for use when using [[Virtual Offsets (Source Mods)|virtual offsets]].&lt;br /&gt;
&lt;br /&gt;
These are the &amp;lt;b&amp;gt;Windows&amp;lt;/b&amp;gt; offsets. &amp;lt;b&amp;gt;Linux offsets are 1 greater.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The List ==&lt;br /&gt;
This comes from the symbol tables, so you'll have to look in the SDK for return types.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Last Updated 16 August 2009&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Auto reconstructed from vtable block @ 0x00F14300&lt;br /&gt;
// from &amp;quot;server_i486.so&amp;quot;, by ida_vtables.idc&lt;br /&gt;
0	CTerrorPlayer::~CTerrorPlayer()&lt;br /&gt;
1	CBaseEntity::SetRefEHandle(CBaseHandle  const&amp;amp;)&lt;br /&gt;
2	CBaseEntity::GetRefEHandle(void)const&lt;br /&gt;
3	CBaseEntity::GetCollideable(void)&lt;br /&gt;
4	CBaseEntity::GetNetworkable(void)&lt;br /&gt;
5	CBaseEntity::GetBaseEntity(void)&lt;br /&gt;
6	CBaseEntity::GetModelIndex(void)const&lt;br /&gt;
7	CBaseEntity::GetModelName(void)const&lt;br /&gt;
8	CCSPlayer::SetModelIndex(int)&lt;br /&gt;
9	CTerrorPlayer::GetServerClass(void)&lt;br /&gt;
10	CTerrorPlayer::YouForgotToImplementOrDeclareServerClass(void)&lt;br /&gt;
11	CTerrorPlayer::GetDataDescMap(void)&lt;br /&gt;
12	CBaseAnimating::TestCollision(Ray_t  const&amp;amp;,unsigned int,CGameTrace &amp;amp;)&lt;br /&gt;
13	CTerrorPlayer::TestHitboxes(Ray_t  const&amp;amp;,unsigned int,CGameTrace &amp;amp;)&lt;br /&gt;
14	CBaseEntity::ComputeWorldSpaceSurroundingBox(Vector *,Vector *)&lt;br /&gt;
15	CTerrorPlayer::ShouldCollide(int,int)const&lt;br /&gt;
16	CBaseEntity::SetOwnerEntity(CBaseEntity*)&lt;br /&gt;
17	CTerrorPlayer::ShouldTransmit(CCheckTransmitInfo  const*)&lt;br /&gt;
18	CBasePlayer::UpdateTransmitState(void)&lt;br /&gt;
19	CBaseCombatCharacter::SetTransmit(CCheckTransmitInfo *,bool)&lt;br /&gt;
20	CBasePlayer::GetTracerType(void)&lt;br /&gt;
21	CTerrorPlayer::Spawn(void)&lt;br /&gt;
22	CTerrorPlayer::Precache(void)&lt;br /&gt;
23	CBasePlayer::SetModel(char  const*)&lt;br /&gt;
24	CBaseMultiplayerPlayer::PostConstructor(char  const*)&lt;br /&gt;
25	CBaseEntity::PostClientActive(void)&lt;br /&gt;
26	CBaseEntity::ParseMapData(CEntityMapData *)&lt;br /&gt;
27	CBaseEntity::KeyValue(char  const*,char  const*)&lt;br /&gt;
28	CBaseEntity::KeyValue(char  const*,float)&lt;br /&gt;
29	CBaseEntity::KeyValue(char  const*,Vector  const&amp;amp;)&lt;br /&gt;
30	CBaseEntity::GetKeyValue(char  const*,char *,int)&lt;br /&gt;
31	CBasePlayer::Activate(void)&lt;br /&gt;
32	CBaseEntity::SetParent(CBaseEntity*,int)&lt;br /&gt;
33	CTerrorPlayer::ObjectCaps(void)&lt;br /&gt;
34	CTerrorPlayer::GetUsePriority(CBaseEntity *)&lt;br /&gt;
35	CBaseEntity::GetGlowEntity(void)&lt;br /&gt;
36	CBaseEntity::GetUseType(CBaseEntity*)&lt;br /&gt;
37	CBaseEntity::AcceptInput(char  const*,CBaseEntity*,CBaseEntity*,variant_t,int)&lt;br /&gt;
38	CBasePlayer::DrawDebugGeometryOverlays(void)&lt;br /&gt;
39	CBaseAnimating::DrawDebugTextOverlays(void)&lt;br /&gt;
40	CBasePlayer::Save(ISave &amp;amp;)&lt;br /&gt;
41	CBasePlayer::Restore(IRestore &amp;amp;)&lt;br /&gt;
42	CBasePlayer::ShouldSavePhysics(void)&lt;br /&gt;
43	CBaseEntity::OnSave(IEntitySaveUtils *)&lt;br /&gt;
44	CBasePlayer::OnRestore(void)&lt;br /&gt;
45	CBasePlayer::RequiredEdictIndex(void)&lt;br /&gt;
46	CBaseEntity::MoveDone(void)&lt;br /&gt;
47	CBaseEntity::Think(void)&lt;br /&gt;
48	CBasePlayer::NetworkStateChanged_m_nNextThinkTick(void)&lt;br /&gt;
49	CBasePlayer::NetworkStateChanged_m_nNextThinkTick(void *)&lt;br /&gt;
50	CBaseAnimating::GetBaseAnimating(void)&lt;br /&gt;
51	CTerrorPlayer::GetResponseSystem(void)&lt;br /&gt;
52	CAI_ExpresserHost&amp;lt;CBasePlayer&amp;gt;::DispatchResponse(char  const*)&lt;br /&gt;
53	CBasePlayer::Classify(void)&lt;br /&gt;
54	CBaseEntity::DeathNotice(CBaseEntity*)&lt;br /&gt;
55	CTerrorPlayer::ShouldAttractAutoAim(CBaseEntity *)&lt;br /&gt;
56	CBaseEntity::GetAutoAimRadius(void)&lt;br /&gt;
57	CBaseEntity::GetAutoAimCenter(void)&lt;br /&gt;
58	CBaseEntity::GetBeamTraceFilter(void)&lt;br /&gt;
59	CBaseEntity::PassesDamageFilter(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
60	CCSPlayer::TraceAttack(CTakeDamageInfo  const&amp;amp;,Vector  const&amp;amp;,CGameTrace *)&lt;br /&gt;
61	CBaseEntity::CanBeHitByMeleeAttack(CBaseEntity*)&lt;br /&gt;
62	CTerrorPlayer::OnTakeDamage(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
63	CTerrorPlayer::TakeHealth(float,int)&lt;br /&gt;
64	CBaseEntity::IsAlive(void)const&lt;br /&gt;
65	CTerrorPlayer::Event_Killed(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
66	CBasePlayer::Event_KilledOther(CBaseEntity *,CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
67	CBaseCombatCharacter::BloodColor(void)&lt;br /&gt;
68	CBaseEntity::IsTriggered(CBaseEntity*)&lt;br /&gt;
69	CBaseEntity::IsNPC(void)const&lt;br /&gt;
70	CBaseCombatCharacter::MyCombatCharacterPointer(void)&lt;br /&gt;
71	CBaseEntity::MyNextBotPointer(void)&lt;br /&gt;
72	CBaseEntity::MyInfectedPointer(void)&lt;br /&gt;
73	CBaseEntity::GetDelay(void)&lt;br /&gt;
74	CBaseEntity::IsMoving(void)&lt;br /&gt;
75	CBaseEntity::DamageDecal(int,int)&lt;br /&gt;
76	CBaseEntity::DecalTrace(CGameTrace *,char  const*)&lt;br /&gt;
77	CBaseEntity::ImpactTrace(CGameTrace *,int,char *)&lt;br /&gt;
78	CBaseEntity::OnControls(CBaseEntity*)&lt;br /&gt;
79	CBaseEntity::HasTarget(string_t)&lt;br /&gt;
80	CBasePlayer::IsPlayer(void)const&lt;br /&gt;
81	CBasePlayer::IsNetClient(void)const&lt;br /&gt;
82	CBaseEntity::IsTemplate(void)&lt;br /&gt;
83	CBaseEntity::IsBaseObject(void)const&lt;br /&gt;
84	CBaseEntity::IsBaseCombatWeapon(void)const&lt;br /&gt;
85	CBaseEntity::MyCombatWeaponPointer(void)&lt;br /&gt;
86	CBaseEntity::GetServerVehicle(void)&lt;br /&gt;
87	CBaseEntity::IsViewable(void)&lt;br /&gt;
88	CTerrorPlayer::ChangeTeam(int)&lt;br /&gt;
89	CBaseEntity::OnEntityEvent(EntityEvent_t,void *)&lt;br /&gt;
90	CBaseEntity::CanStandOn(CBaseEntity*)const&lt;br /&gt;
91	CBaseEntity::CanStandOn(edict_t *)const&lt;br /&gt;
92	CBaseEntity::GetEnemy(void)&lt;br /&gt;
93	CBaseEntity::GetEnemy(void)const&lt;br /&gt;
94	CBaseEntity::Use(CBaseEntity*,CBaseEntity*,USE_TYPE,float)&lt;br /&gt;
95	CBaseEntity::StartTouch(CBaseEntity*)&lt;br /&gt;
96	CTerrorPlayer::Touch(CBaseEntity *)&lt;br /&gt;
97	CBaseEntity::EndTouch(CBaseEntity*)&lt;br /&gt;
98	CBaseEntity::StartBlocked(CBaseEntity*)&lt;br /&gt;
99	CBaseEntity::Blocked(CBaseEntity*)&lt;br /&gt;
100	CBaseEntity::EndBlocked(void)&lt;br /&gt;
101	CBasePlayer::PhysicsSimulate(void)&lt;br /&gt;
102	CBasePlayer::UpdateOnRemove(void)&lt;br /&gt;
103	CBaseEntity::StopLoopingSounds(void)&lt;br /&gt;
104	CBaseEntity::SUB_AllowedToFade(void)&lt;br /&gt;
105	CTerrorPlayer::Teleport(Vector  const*,QAngle  const*,Vector  const*)&lt;br /&gt;
106	CBaseEntity::NotifySystemEvent(CBaseEntity*,notify_system_event_t,notify_system_event_params_t  const&amp;amp;)&lt;br /&gt;
107	CBasePlayer::MakeTracer(Vector  const&amp;amp;,CGameTrace  const&amp;amp;,int)&lt;br /&gt;
108	CBaseEntity::GetTracerAttachment(void)&lt;br /&gt;
109	CBaseEntity::FireBullets(FireBulletsInfo_t  const&amp;amp;)&lt;br /&gt;
110	CBasePlayer::DoImpactEffect(CGameTrace &amp;amp;,int)&lt;br /&gt;
111	CBaseEntity::Respawn(void)&lt;br /&gt;
112	CBaseEntity::IsLockedByMaster(void)&lt;br /&gt;
113	CTerrorPlayer::ModifyOrAppendCriteria(AI_CriteriaSet &amp;amp;)&lt;br /&gt;
114	CTerrorPlayer::ModifyOrAppendDerivedCriteria(AI_CriteriaSet &amp;amp;)&lt;br /&gt;
115	CTerrorPlayer::NetworkStateChanged_m_iMaxHealth(void)&lt;br /&gt;
116	CTerrorPlayer::NetworkStateChanged_m_iMaxHealth(void *)&lt;br /&gt;
117	CBasePlayer::NetworkStateChanged_m_iHealth(void)&lt;br /&gt;
118	CBasePlayer::NetworkStateChanged_m_iHealth(void *)&lt;br /&gt;
119	CBasePlayer::NetworkStateChanged_m_lifeState(void)&lt;br /&gt;
120	CBasePlayer::NetworkStateChanged_m_lifeState(void *)&lt;br /&gt;
121	CBaseEntity::NetworkStateChanged_m_takedamage(void)&lt;br /&gt;
122	CBaseEntity::NetworkStateChanged_m_takedamage(void *)&lt;br /&gt;
123	CBaseEntity::GetDamageType(void)const&lt;br /&gt;
124	CBaseEntity::GetDamage(void)&lt;br /&gt;
125	CBaseEntity::SetDamage(float)&lt;br /&gt;
126	CBasePlayer::EyePosition(void)&lt;br /&gt;
127	CBasePlayer::EyeAngles(void)&lt;br /&gt;
128	CBasePlayer::LocalEyeAngles(void)&lt;br /&gt;
129	CBaseEntity::EarPosition(void)&lt;br /&gt;
130	CBasePlayer::BodyTarget(Vector  const&amp;amp;,bool)&lt;br /&gt;
131	CBaseEntity::HeadTarget(Vector  const&amp;amp;)&lt;br /&gt;
132	CBaseEntity::GetVectors(Vector *,Vector *,Vector *)const&lt;br /&gt;
133	CBaseEntity::GetViewOffset(void)const&lt;br /&gt;
134	CBaseEntity::SetViewOffset(Vector  const&amp;amp;)&lt;br /&gt;
135	CBasePlayer::GetSmoothedVelocity(void)&lt;br /&gt;
136	CBaseAnimating::GetVelocity(Vector *,Vector *)&lt;br /&gt;
137	CTerrorPlayer::GetFriction(void)const&lt;br /&gt;
138	CBaseCombatCharacter::FVisible(CBaseEntity *,int,CBaseEntity **)&lt;br /&gt;
139	CBaseCombatCharacter::FVisible(Vector  const&amp;amp;,int,CBaseEntity **)&lt;br /&gt;
140	CBaseEntity::CanBeSeenBy(CAI_BaseNPC *)&lt;br /&gt;
141	CBaseEntity::GetAttackDamageScale(CBaseEntity*)&lt;br /&gt;
142	CBaseEntity::GetReceivedDamageScale(CBaseEntity*)&lt;br /&gt;
143	CTerrorPlayer::OnGroundChanged(CBaseEntity *,CBaseEntity *)&lt;br /&gt;
144	CBaseEntity::GetGroundVelocityToApply(Vector &amp;amp;)&lt;br /&gt;
145	CBaseEntity::PhysicsSplash(Vector  const&amp;amp;,Vector  const&amp;amp;,float,float)&lt;br /&gt;
146	CBaseEntity::Splash(void)&lt;br /&gt;
147	CBaseEntity::WorldSpaceCenter(void)const&lt;br /&gt;
148	CCSPlayer::GetSoundEmissionOrigin(void)const&lt;br /&gt;
149	CBaseEntity::CreateVPhysics(void)&lt;br /&gt;
150	CBaseEntity::ForceVPhysicsCollide(CBaseEntity*)&lt;br /&gt;
151	CBasePlayer::VPhysicsDestroyObject(void)&lt;br /&gt;
152	CBasePlayer::VPhysicsUpdate(IPhysicsObject *)&lt;br /&gt;
153	CBaseEntity::VPhysicsTakeDamage(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
154	CBaseCombatCharacter::VPhysicsShadowCollision(int,gamevcollisionevent_t *)&lt;br /&gt;
155	CTerrorPlayer::VPhysicsShadowUpdate(IPhysicsObject *)&lt;br /&gt;
156	CBasePlayer::VPhysicsCollision(int,gamevcollisionevent_t *)&lt;br /&gt;
157	CBaseEntity::VPhysicsFriction(IPhysicsObject *,float,int,int)&lt;br /&gt;
158	CBaseEntity::UpdatePhysicsShadowToCurrentPosition(float)&lt;br /&gt;
159	CBaseEntity::VPhysicsGetObjectList(IPhysicsObject **,int)&lt;br /&gt;
160	CBaseEntity::VPhysicsIsFlesh(void)&lt;br /&gt;
161	CBaseEntity::CanPushEntity(CBaseEntity*)const&lt;br /&gt;
162	CBaseEntity::HasPhysicsAttacker(float)&lt;br /&gt;
163	CBasePlayer::PhysicsSolidMaskForEntity(void)const&lt;br /&gt;
164	CBaseEntity::ResolveFlyCollisionCustom(CGameTrace &amp;amp;,Vector &amp;amp;)&lt;br /&gt;
165	CBaseEntity::PerformCustomPhysics(Vector *,Vector *,QAngle *,QAngle *)&lt;br /&gt;
166	CBaseAnimating::GetStepOrigin(void)const&lt;br /&gt;
167	CBaseAnimating::GetStepAngles(void)const&lt;br /&gt;
168	CBaseEntity::ShouldDrawWaterImpacts(void)&lt;br /&gt;
169	CBasePlayer::NetworkStateChanged_m_fFlags(void)&lt;br /&gt;
170	CBasePlayer::NetworkStateChanged_m_fFlags(void *)&lt;br /&gt;
171	CBasePlayer::NetworkStateChanged_m_nWaterLevel(void)&lt;br /&gt;
172	CBasePlayer::NetworkStateChanged_m_nWaterLevel(void *)&lt;br /&gt;
173	CBasePlayer::NetworkStateChanged_m_hGroundEntity(void)&lt;br /&gt;
174	CBasePlayer::NetworkStateChanged_m_hGroundEntity(void *)&lt;br /&gt;
175	CBasePlayer::NetworkStateChanged_m_vecBaseVelocity(void)&lt;br /&gt;
176	CBasePlayer::NetworkStateChanged_m_vecBaseVelocity(void *)&lt;br /&gt;
177	CBasePlayer::NetworkStateChanged_m_flFriction(void)&lt;br /&gt;
178	CBasePlayer::NetworkStateChanged_m_flFriction(void *)&lt;br /&gt;
179	CBasePlayer::NetworkStateChanged_m_vecVelocity(void)&lt;br /&gt;
180	CBasePlayer::NetworkStateChanged_m_vecVelocity(void *)&lt;br /&gt;
181	CBaseEntity::NetworkStateChanged_m_bClientSideRagdoll(void)&lt;br /&gt;
182	CBaseEntity::NetworkStateChanged_m_bClientSideRagdoll(void *)&lt;br /&gt;
183	CBasePlayer::NetworkStateChanged_m_vecViewOffset(void)&lt;br /&gt;
184	CBasePlayer::NetworkStateChanged_m_vecViewOffset(void *)&lt;br /&gt;
185	CBaseAnimating::GetIdealSpeed(void)const&lt;br /&gt;
186	CBaseAnimating::GetIdealAccel(void)const&lt;br /&gt;
187	CBaseAnimatingOverlay::StudioFrameAdvance(void)&lt;br /&gt;
188	CBaseAnimating::OnSequenceSet(int)&lt;br /&gt;
189	CBaseAnimating::IsActivityFinished(void)&lt;br /&gt;
190	CBaseAnimating::GetSequenceGroundSpeed(CStudioHdr *,int)&lt;br /&gt;
191	CBaseAnimating::ClampRagdollForce(Vector  const&amp;amp;,Vector*)&lt;br /&gt;
192	CBaseAnimating::BecomeRagdollOnClient(Vector  const&amp;amp;)&lt;br /&gt;
193	CBaseAnimating::IsRagdoll(void)&lt;br /&gt;
194	CBaseAnimating::CanBecomeRagdoll(void)&lt;br /&gt;
195	CBaseAnimatingOverlay::GetSkeleton(CStudioHdr *,Vector *,QuaternionAligned *,int)&lt;br /&gt;
196	CBaseAnimating::GetBoneTransform(int,matrix3x4_t &amp;amp;)&lt;br /&gt;
197	CBaseAnimating::SetupBones(matrix3x4_t *,int)&lt;br /&gt;
198	CBaseAnimating::CalculateIKLocks(float)&lt;br /&gt;
199	CBaseAnimatingOverlay::DispatchAnimEvents(CBaseAnimating *)&lt;br /&gt;
200	CTerrorPlayer::HandleAnimEvent(animevent_t *)&lt;br /&gt;
201	CBaseAnimating::PopulatePoseParameters(void)&lt;br /&gt;
202	CBaseAnimating::GetAttachment(int,matrix3x4_t &amp;amp;)&lt;br /&gt;
203	CBaseAnimating::InitBoneControllers(void)&lt;br /&gt;
204	CBaseAnimating::GetGroundSpeedVelocity(void)&lt;br /&gt;
205	CBaseAnimating::IsViewModel(void)const&lt;br /&gt;
206	CTerrorPlayer::Ignite(float,bool,float,bool)&lt;br /&gt;
207	CBaseAnimating::IgniteLifetime(float)&lt;br /&gt;
208	CBaseAnimating::IgniteNumHitboxFires(int)&lt;br /&gt;
209	CBaseAnimating::IgniteHitboxFireScale(float)&lt;br /&gt;
210	CTerrorPlayer::Extinguish(void)&lt;br /&gt;
211	CBaseAnimating::SetLightingOrigin(CBaseEntity *)&lt;br /&gt;
212	CBaseFlex::SetViewtarget(Vector  const&amp;amp;)&lt;br /&gt;
213	CBaseFlex::StartSceneEvent(CSceneEventInfo *,CChoreoScene *,CChoreoEvent *,CChoreoActor *,CBaseEntity *)&lt;br /&gt;
214	CBaseFlex::ProcessSceneEvents(void)&lt;br /&gt;
215	CBaseFlex::ProcessSceneEvent(CSceneEventInfo *,CChoreoScene *,CChoreoEvent *)&lt;br /&gt;
216	CBaseFlex::ClearSceneEvent(CSceneEventInfo *,bool,bool)&lt;br /&gt;
217	CBaseFlex::CheckSceneEventCompletion(CSceneEventInfo *,float,CChoreoScene *,CChoreoEvent *)&lt;br /&gt;
218	CTerrorPlayer::PlayScene(char  const*,float,AI_Response *,IRecipientFilter *)&lt;br /&gt;
219	CBaseFlex::PlayAutoGeneratedSoundScene(char  const*)&lt;br /&gt;
220	CBasePlayer::GetPhysicsImpactDamageTable(void)&lt;br /&gt;
221	CBaseCombatCharacter::FInViewCone(CBaseEntity *)&lt;br /&gt;
222	CBaseCombatCharacter::FInViewCone(Vector  const&amp;amp;)&lt;br /&gt;
223	CBaseCombatCharacter::FInAimCone(CBaseEntity *)&lt;br /&gt;
224	CBaseCombatCharacter::FInAimCone(Vector  const&amp;amp;)&lt;br /&gt;
225	CBaseCombatCharacter::ShouldShootMissTarget(CBaseCombatCharacter*)&lt;br /&gt;
226	CBaseCombatCharacter::FindMissTarget(void)&lt;br /&gt;
227	CBaseCombatCharacter::HandleInteraction(int,void *,CBaseCombatCharacter*)&lt;br /&gt;
228	CBasePlayer::BodyAngles(void)&lt;br /&gt;
229	CBaseCombatCharacter::BodyDirection2D(void)&lt;br /&gt;
230	CBaseCombatCharacter::BodyDirection3D(void)&lt;br /&gt;
231	CBaseCombatCharacter::HeadDirection2D(void)&lt;br /&gt;
232	CBaseCombatCharacter::HeadDirection3D(void)&lt;br /&gt;
233	CBaseCombatCharacter::EyeDirection2D(void)&lt;br /&gt;
234	CBaseCombatCharacter::EyeDirection3D(void)&lt;br /&gt;
235	CBaseCombatCharacter::IsHiddenByFog(Vector  const&amp;amp;)const&lt;br /&gt;
236	CBaseCombatCharacter::IsHiddenByFog(CBaseEntity *)const&lt;br /&gt;
237	CBaseCombatCharacter::IsHiddenByFog(float)const&lt;br /&gt;
238	CBaseCombatCharacter::GetFogObscuredRatio(Vector  const&amp;amp;)const&lt;br /&gt;
239	CBaseCombatCharacter::GetFogObscuredRatio(CBaseEntity *)const&lt;br /&gt;
240	CBaseCombatCharacter::GetFogObscuredRatio(float)const&lt;br /&gt;
241	CBaseCombatCharacter::GetFogParams(fogparams_t *)const&lt;br /&gt;
242	CBaseCombatCharacter::IsLookingTowards(CBaseEntity  const*,float)const&lt;br /&gt;
243	CBaseCombatCharacter::IsLookingTowards(Vector  const&amp;amp;,float)const&lt;br /&gt;
244	CBaseCombatCharacter::IsInFieldOfView(CBaseEntity *)const&lt;br /&gt;
245	CBaseCombatCharacter::IsInFieldOfView(Vector  const&amp;amp;)const&lt;br /&gt;
246	CBaseCombatCharacter::IsLineOfSightClear(CBaseEntity *,CBaseCombatCharacter::LineOfSightCheckType)const&lt;br /&gt;
247	CBaseCombatCharacter::IsLineOfSightClear(Vector  const&amp;amp;,CBaseCombatCharacter::LineOfSightCheckType,CBaseEntity *)const&lt;br /&gt;
248	CTerrorPlayer::OnFootstep(Vector  const&amp;amp;,bool,bool,bool,bool)&lt;br /&gt;
249	CCSPlayer::GetGroundSurface(void)const&lt;br /&gt;
250	CTerrorPlayer::GetFootstepSound(char  const*,bool,float,bool)const&lt;br /&gt;
251	CTerrorPlayer::AreFootstepsAudible(void)const&lt;br /&gt;
252	CTerrorPlayer::IsFootstepAudible(float,bool)const&lt;br /&gt;
253	CBaseCombatCharacter::GetFootstepRunThreshold(void)const&lt;br /&gt;
254	CBaseCombatCharacter::GiveAmmo(int,int,bool)&lt;br /&gt;
255	CBaseCombatCharacter::NPC_TranslateActivity(Activity)&lt;br /&gt;
256	CBaseCombatCharacter::Weapon_TranslateActivity(Activity,bool *)&lt;br /&gt;
257	CBaseCombatCharacter::Weapon_FrameUpdate(void)&lt;br /&gt;
258	CBaseCombatCharacter::Weapon_HandleAnimEvent(animevent_t *)&lt;br /&gt;
259	CTerrorPlayer::Weapon_CanUse(CBaseCombatWeapon *)&lt;br /&gt;
260	CTerrorPlayer::Weapon_Equip(CBaseCombatWeapon *)&lt;br /&gt;
261	CBaseCombatCharacter::Weapon_EquipAmmoOnly(CBaseCombatWeapon *)&lt;br /&gt;
262	CBasePlayer::Weapon_Drop(CBaseCombatWeapon *,Vector  const*,Vector  const*)&lt;br /&gt;
263	CCSPlayer::Weapon_Switch(CBaseCombatWeapon *,int)&lt;br /&gt;
264	CTerrorPlayer::Weapon_ShootPosition(void)&lt;br /&gt;
265	CCSPlayer::Weapon_CanSwitchTo(CBaseCombatWeapon *)&lt;br /&gt;
266	CBaseCombatCharacter::Weapon_SlotOccupied(CBaseCombatWeapon *)&lt;br /&gt;
267	CBaseCombatCharacter::Weapon_GetSlot(int)const&lt;br /&gt;
268	CBaseCombatCharacter::AddPlayerItem(CBaseCombatWeapon *)&lt;br /&gt;
269	CBasePlayer::RemovePlayerItem(CBaseCombatWeapon *)&lt;br /&gt;
270	CBaseCombatCharacter::CanBecomeServerRagdoll(void)&lt;br /&gt;
271	CTerrorPlayer::OnTakeDamage_Alive(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
272	CBaseCombatCharacter::OnTakeDamage_Dying(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
273	CBaseCombatCharacter::OnTakeDamage_Dead(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
274	CBaseCombatCharacter::GetAliveDuration(void)const&lt;br /&gt;
275	CBaseCombatCharacter::OnFriendDamaged(CBaseCombatCharacter*,CBaseEntity *)&lt;br /&gt;
276	CBaseCombatCharacter::NotifyFriendsOfDamage(CBaseEntity *)&lt;br /&gt;
277	CBaseCombatCharacter::HasEverBeenInjured(int)const&lt;br /&gt;
278	CBaseCombatCharacter::GetTimeSinceLastInjury(int)const&lt;br /&gt;
279	CBaseCombatCharacter::OnPlayerKilledOther(CBaseEntity *,CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
280	CBaseCombatCharacter::GetDeathActivity(void)&lt;br /&gt;
281	CBaseCombatCharacter::CorpseGib(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
282	CBaseCombatCharacter::CorpseFade(void)&lt;br /&gt;
283	CBaseCombatCharacter::HasHumanGibs(void)&lt;br /&gt;
284	CBaseCombatCharacter::HasAlienGibs(void)&lt;br /&gt;
285	CBaseCombatCharacter::ShouldGib(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
286	CBaseCombatCharacter::OnKilledNPC(CBaseCombatCharacter*)&lt;br /&gt;
287	CBaseCombatCharacter::Event_Gibbed(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
288	CBasePlayer::Event_Dying(void)&lt;br /&gt;
289	CBaseCombatCharacter::BecomeRagdoll(CTakeDamageInfo  const&amp;amp;,Vector  const&amp;amp;)&lt;br /&gt;
290	CBaseCombatCharacter::FixupBurningServerRagdoll(CBaseEntity *)&lt;br /&gt;
291	CBaseCombatCharacter::BecomeRagdollBoogie(CBaseEntity *,Vector  const&amp;amp;,float,int)&lt;br /&gt;
292	CBaseCombatCharacter::CheckTraceHullAttack(float,Vector  const&amp;amp;,Vector  const&amp;amp;,int,int,float,bool)&lt;br /&gt;
293	CBaseCombatCharacter::CheckTraceHullAttack(Vector  const&amp;amp;,Vector  const&amp;amp;,Vector  const&amp;amp;,Vector  const&amp;amp;,int,int,float,bool)&lt;br /&gt;
294	CBaseCombatCharacter::PushawayTouch(CBaseEntity *)&lt;br /&gt;
295	CBaseCombatCharacter::IRelationType(CBaseEntity *)&lt;br /&gt;
296	CBaseCombatCharacter::IRelationPriority(CBaseEntity *)&lt;br /&gt;
297	CBasePlayer::IsInAVehicle(void)const&lt;br /&gt;
298	CBasePlayer::GetVehicle(void)&lt;br /&gt;
299	CBasePlayer::GetVehicleEntity(void)&lt;br /&gt;
300	CBaseCombatCharacter::ExitVehicle(void)&lt;br /&gt;
301	CBaseCombatCharacter::CalcWeaponProficiency(CBaseCombatWeapon *)&lt;br /&gt;
302	CBaseCombatCharacter::GetAttackSpread(CBaseCombatWeapon *,CBaseEntity *)&lt;br /&gt;
303	CBaseCombatCharacter::GetSpreadBias(CBaseCombatWeapon *,CBaseEntity *)&lt;br /&gt;
304	CBasePlayer::DoMuzzleFlash(void)&lt;br /&gt;
305	CBaseCombatCharacter::AddEntityRelationship(CBaseEntity *,Disposition_t,int)&lt;br /&gt;
306	CBaseCombatCharacter::RemoveEntityRelationship(CBaseEntity *)&lt;br /&gt;
307	CBaseCombatCharacter::AddClassRelationship(Class_T,Disposition_t,int)&lt;br /&gt;
308	CBaseCombatCharacter::OnChangeActiveWeapon(CBaseCombatWeapon *,CBaseCombatWeapon *)&lt;br /&gt;
309	CTerrorPlayer::GetLastKnownArea(void)const&lt;br /&gt;
310	CTerrorPlayer::IsAreaTraversable(CNavArea  const*)const&lt;br /&gt;
311	CBaseCombatCharacter::ClearLastKnownArea(void)&lt;br /&gt;
312	CBaseCombatCharacter::UpdateLastKnownArea(void)&lt;br /&gt;
313	CTerrorPlayer::OnNavAreaChanged(CNavArea *,CNavArea *)&lt;br /&gt;
314	CTerrorPlayer::OnNavAreaRemoved(CNavArea *)&lt;br /&gt;
315	CTerrorPlayer::GetClass(void)const&lt;br /&gt;
316	CTerrorPlayer::CanBeA(ZombieClassType)const&lt;br /&gt;
317	CTerrorPlayer::OnPursuedBy(INextBot *)&lt;br /&gt;
318	CTerrorPlayer::IsGhost(void)const&lt;br /&gt;
319	CBasePlayer::NetworkStateChanged_m_iAmmo(void)&lt;br /&gt;
320	CBasePlayer::NetworkStateChanged_m_iAmmo(void *)&lt;br /&gt;
321	CCSPlayer::CreateViewModel(int)&lt;br /&gt;
322	CCSPlayer::SetupVisibility(CBaseEntity *,unsigned char *,int)&lt;br /&gt;
323	CTerrorPlayer::WantsLagCompensationOnEntity(CBaseAnimatingOverlay  const*,CUserCmd  const*,CBitVec&amp;lt;2048&amp;gt;  const*)const&lt;br /&gt;
324	CBasePlayer::SharedSpawn(void)&lt;br /&gt;
325	CBasePlayer::ForceRespawn(void)&lt;br /&gt;
326	CTerrorPlayer::InitialSpawn(void)&lt;br /&gt;
327	CBasePlayer::InitHUD(void)&lt;br /&gt;
328	CCSPlayer::ShowViewPortPanel(char  const*,bool,KeyValues *)&lt;br /&gt;
329	CCSPlayer::PlayerDeathThink(void)&lt;br /&gt;
330	CBasePlayer::Jump(void)&lt;br /&gt;
331	CBasePlayer::Duck(void)&lt;br /&gt;
332	CTerrorPlayer::Cough(CBasePlayer *)&lt;br /&gt;
333	CTerrorPlayer::PreThink(void)&lt;br /&gt;
334	CTerrorPlayer::PostThink(void)&lt;br /&gt;
335	CBasePlayer::DamageEffect(float,int)&lt;br /&gt;
336	CCSPlayer::OnDamagedByExplosion(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
337	CBasePlayer::ShouldFadeOnDeath(void)&lt;br /&gt;
338	CBasePlayer::IsFakeClient(void)const&lt;br /&gt;
339	CTerrorPlayer::GetCharacterDisplayName(void)&lt;br /&gt;
340	CBasePlayer::GetPlayerMins(void)const&lt;br /&gt;
341	CBasePlayer::GetPlayerMaxs(void)const&lt;br /&gt;
342	CTerrorPlayer::UpdateCollisionBounds(void)&lt;br /&gt;
343	CBasePlayer::CalcRoll(QAngle  const&amp;amp;,Vector  const&amp;amp;,float,float)&lt;br /&gt;
344	CBasePlayer::PackDeadPlayerItems(void)&lt;br /&gt;
345	CCSPlayer::RemoveAllItems(bool)&lt;br /&gt;
346	CTerrorPlayer::IsRunning(void)const&lt;br /&gt;
347	CBasePlayer::Weapon_SetLast(CBaseCombatWeapon *)&lt;br /&gt;
348	CBasePlayer::Weapon_ShouldSetLast(CBaseCombatWeapon *,CBaseCombatWeapon *)&lt;br /&gt;
349	CBasePlayer::Weapon_ShouldSelectItem(CBaseCombatWeapon *)&lt;br /&gt;
350	CBasePlayer::UpdateClientData(void)&lt;br /&gt;
351	CBasePlayer::ExitLadder(void)&lt;br /&gt;
352	CBasePlayer::GetLadderSurface(Vector  const&amp;amp;)&lt;br /&gt;
353	CTerrorPlayer::IsAbleToAutoCenterOnLadders(void)const&lt;br /&gt;
354	CBasePlayer::SetFlashlightEnabled(bool)&lt;br /&gt;
355	CCSPlayer::FlashlightIsOn(void)&lt;br /&gt;
356	CTerrorPlayer::FlashlightTurnOn(bool)&lt;br /&gt;
357	CTerrorPlayer::FlashlightTurnOff(bool)&lt;br /&gt;
358	CBasePlayer::IsIlluminatedByFlashlight(CBaseEntity *,float *)&lt;br /&gt;
359	CCSPlayer::UpdateStepSound(surfacedata_t *,Vector  const&amp;amp;,Vector  const&amp;amp;)&lt;br /&gt;
360	CCSPlayer::PlayStepSound(Vector &amp;amp;,surfacedata_t *,float,bool)&lt;br /&gt;
361	CBasePlayer::GetStepSoundVelocities(float *,float *)&lt;br /&gt;
362	CBasePlayer::SetStepSoundTime(stepsoundtimes_t,bool)&lt;br /&gt;
363	CTerrorPlayer::DeathSound(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
364	CCSPlayer::SetAnimation(PLAYER_ANIM)&lt;br /&gt;
365	CTerrorPlayer::OnMainActivityComplete(Activity,Activity)&lt;br /&gt;
366	CTerrorPlayer::OnMainActivityInterrupted(Activity,Activity)&lt;br /&gt;
367	CTerrorPlayer::ImpulseCommands(void)&lt;br /&gt;
368	CTerrorPlayer::CheatImpulseCommands(int)&lt;br /&gt;
369	CTerrorPlayer::ClientCommand(CCommand  const&amp;amp;)&lt;br /&gt;
370	CBasePlayer::StartObserverMode(int)&lt;br /&gt;
371	CBasePlayer::StopObserverMode(void)&lt;br /&gt;
372	CBasePlayer::ModeWantsSpectatorGUI(int)&lt;br /&gt;
373	CTerrorPlayer::SetObserverMode(int)&lt;br /&gt;
374	CBasePlayer::GetObserverMode(void)&lt;br /&gt;
375	CTerrorPlayer::SetObserverTarget(CBaseEntity *)&lt;br /&gt;
376	CBasePlayer::ObserverUse(bool)&lt;br /&gt;
377	CBasePlayer::GetObserverTarget(void)&lt;br /&gt;
378	CTerrorPlayer::FindNextObserverTarget(bool)&lt;br /&gt;
379	CCSPlayer::GetNextObserverSearchStartPoint(bool)&lt;br /&gt;
380	CTerrorPlayer::PassesObserverFilter(CBaseEntity  const*)&lt;br /&gt;
381	CTerrorPlayer::IsValidObserverTarget(CBaseEntity *)&lt;br /&gt;
382	CBasePlayer::CheckObserverSettings(void)&lt;br /&gt;
383	CBasePlayer::JumptoPosition(Vector  const&amp;amp;,QAngle  const&amp;amp;)&lt;br /&gt;
384	CBasePlayer::ForceObserverMode(int)&lt;br /&gt;
385	CCSPlayer::ResetObserverMode(void)&lt;br /&gt;
386	CBasePlayer::ValidateCurrentObserverTarget(void)&lt;br /&gt;
387	CBasePlayer::AttemptToExitFreezeCam(void)&lt;br /&gt;
388	CTerrorPlayer::WantsRoamingObserverMode(void)const&lt;br /&gt;
389	CCSPlayer::StartReplayMode(float,float,int)&lt;br /&gt;
390	CCSPlayer::StopReplayMode(void)&lt;br /&gt;
391	CBasePlayer::GetDelayTicks(void)&lt;br /&gt;
392	CBasePlayer::GetReplayEntity(void)&lt;br /&gt;
393	CBasePlayer::CreateCorpse(void)&lt;br /&gt;
394	CTerrorPlayer::EntSelectSpawnPoint(void)&lt;br /&gt;
395	CBasePlayer::GetInVehicle(IServerVehicle *,int)&lt;br /&gt;
396	CBasePlayer::LeaveVehicle(Vector  const&amp;amp;,QAngle  const&amp;amp;)&lt;br /&gt;
397	CBasePlayer::OnVehicleStart(void)&lt;br /&gt;
398	CBasePlayer::OnVehicleEnd(Vector &amp;amp;)&lt;br /&gt;
399	CTerrorPlayer::BumpWeapon(CBaseCombatWeapon *)&lt;br /&gt;
400	CBasePlayer::SelectLastItem(void)&lt;br /&gt;
401	CBasePlayer::SelectItem(char  const*,int)&lt;br /&gt;
402	CBasePlayer::SelectItem(CBaseCombatWeapon *)&lt;br /&gt;
403	CTerrorPlayer::ItemPostFrame(void)&lt;br /&gt;
404	CTerrorPlayer::GiveNamedItem(char  const*,int,bool)&lt;br /&gt;
405	CBasePlayer::CheckTrainUpdate(void)&lt;br /&gt;
406	CBasePlayer::SetPlayerUnderwater(bool)&lt;br /&gt;
407	CTerrorPlayer::PlayWadeSound(void)&lt;br /&gt;
408	CTerrorPlayer::CanBreatheUnderwater(void)const&lt;br /&gt;
409	CTerrorPlayer::CanRecoverCurrentDrowningDamage(void)const&lt;br /&gt;
410	CTerrorPlayer::PlayerUse(CBaseEntity *)&lt;br /&gt;
411	CCSPlayer::PlayUseDenySound(void)&lt;br /&gt;
412	CTerrorPlayer::FindUseEntity(float,float,bool *)&lt;br /&gt;
413	CTerrorPlayer::IsUseableEntity(CBaseEntity *,unsigned int)&lt;br /&gt;
414	CTerrorPlayer::OnUseEntity(CBaseEntity *,USE_TYPE)&lt;br /&gt;
415	CTerrorPlayer::PickupObject(CBaseEntity *,bool)&lt;br /&gt;
416	CTerrorPlayer::ForceDropOfCarriedPhysObjects(CBaseEntity *)&lt;br /&gt;
417	CTerrorPlayer::GetHeldObjectMass(IPhysicsObject *)&lt;br /&gt;
418	CTerrorPlayer::IsHoldingEntity(CBaseEntity *)&lt;br /&gt;
419	CBasePlayer::UpdateGeigerCounter(void)&lt;br /&gt;
420	CBasePlayer::GetAutoaimVector(float)&lt;br /&gt;
421	CBasePlayer::GetAutoaimVector(float,float)&lt;br /&gt;
422	CBasePlayer::GetAutoaimVector(float,float,float,AimResults *)&lt;br /&gt;
423	CBasePlayer::GetAutoaimVector(autoaim_params_t &amp;amp;)&lt;br /&gt;
424	CBasePlayer::ShouldAutoaim(void)&lt;br /&gt;
425	CBasePlayer::ForceClientDllUpdate(void)&lt;br /&gt;
426	CBasePlayer::ProcessUsercmds(CUserCmd *,int,int,int,bool)&lt;br /&gt;
427	CTerrorPlayer::PlayerRunCommand(CUserCmd *,IMoveHelper *)&lt;br /&gt;
428	CBaseMultiplayerPlayer::CanHearAndReadChatFrom(CBasePlayer *)&lt;br /&gt;
429	CBaseMultiplayerPlayer::CanSpeak(void)&lt;br /&gt;
430	CCSPlayer::ModifyOrAppendPlayerCriteria(AI_CriteriaSet &amp;amp;)&lt;br /&gt;
431	CTerrorPlayer::CheckChatText(char *,int)&lt;br /&gt;
432	CBasePlayer::CreateRagdollEntity(void)&lt;br /&gt;
433	CBasePlayer::ShouldAnnounceAchievement(void)&lt;br /&gt;
434	CBasePlayer::EnsureSplitScreenTeam(void)&lt;br /&gt;
435	CBasePlayer::ForceChangeTeam(int)&lt;br /&gt;
436	CBasePlayer::IsFollowingPhysics(void)&lt;br /&gt;
437	CTerrorPlayer::InitVCollision(Vector  const&amp;amp;,Vector  const&amp;amp;)&lt;br /&gt;
438	CBasePlayer::UpdatePhysicsShadowToCurrentPosition(void)&lt;br /&gt;
439	CBasePlayer::Hints(void)&lt;br /&gt;
440	CBasePlayer::IsReadyToPlay(void)&lt;br /&gt;
441	CBasePlayer::IsReadyToSpawn(void)&lt;br /&gt;
442	CBasePlayer::ShouldGainInstantSpawn(void)&lt;br /&gt;
443	CBasePlayer::ResetPerRoundStats(void)&lt;br /&gt;
444	CBasePlayer::ResetScores(void)&lt;br /&gt;
445	CBasePlayer::EquipSuit(bool)&lt;br /&gt;
446	CBasePlayer::RemoveSuit(void)&lt;br /&gt;
447	CTerrorPlayer::OnUseEntityChanged(void)&lt;br /&gt;
448	CBasePlayer::CommitSuicide(bool,bool)&lt;br /&gt;
449	CBasePlayer::CommitSuicide(Vector  const&amp;amp;,bool,bool)&lt;br /&gt;
450	CBasePlayer::IsBot(void)const&lt;br /&gt;
451	CBaseMultiplayerPlayer::GetExpresser(void)&lt;br /&gt;
452	CCSPlayer::SpawnArmorValue(void)const&lt;br /&gt;
453	CTerrorPlayer::UpdateTonemapController(void)&lt;br /&gt;
454	CCSPlayer::NetworkStateChanged_m_ArmorValue(void)&lt;br /&gt;
455	CCSPlayer::NetworkStateChanged_m_ArmorValue(void *)&lt;br /&gt;
456	CTerrorPlayer::IsAutoCrouched(void)const&lt;br /&gt;
457	CBasePlayer::HasHaptics(void)&lt;br /&gt;
458	CBasePlayer::SetHaptics(bool)&lt;br /&gt;
459	CTerrorPlayer::GetAvailableSteadyStateSlots(void)&lt;br /&gt;
460	CTerrorPlayer::OnSpeak(CBasePlayer *,char  const*,float)&lt;br /&gt;
461	CTerrorPlayer::OnVoiceTransmit(void)&lt;br /&gt;
462	CTerrorPlayer::PlayerSolidMask(bool)const&lt;br /&gt;
463	CAI_ExpresserHost&amp;lt;CBasePlayer&amp;gt;::NoteSpeaking(float,float)&lt;br /&gt;
464	CAI_ExpresserHost&amp;lt;CBasePlayer&amp;gt;::Speak(CAI_Concept,char  const*,char *,unsigned int,IRecipientFilter *)&lt;br /&gt;
465	CAI_ExpresserHost&amp;lt;CBasePlayer&amp;gt;::Speak(CAI_Concept,AI_CriteriaSet *,char *,unsigned int,IRecipientFilter *)&lt;br /&gt;
466	CAI_ExpresserHost&amp;lt;CBasePlayer&amp;gt;::PostSpeakDispatchResponse(CAI_Concept,AI_Response *)&lt;br /&gt;
467	CTerrorPlayer::SpeakIfAllowed(CAI_Concept,SpeechPriorityType,char  const*,char *,unsigned int,IRecipientFilter *)&lt;br /&gt;
468	CBaseMultiplayerPlayer::SpeakConceptIfAllowed(int,char  const*,char *,unsigned int,IRecipientFilter *)&lt;br /&gt;
469	CBaseMultiplayerPlayer::CanSpeakVoiceCommand(void)&lt;br /&gt;
470	CBaseMultiplayerPlayer::ShouldShowVoiceSubtitleToEnemy(void)&lt;br /&gt;
471	CBaseMultiplayerPlayer::NoteSpokeVoiceCommand(char  const*)&lt;br /&gt;
472	CBaseMultiplayerPlayer::GetMultiplayerExpresser(void)&lt;br /&gt;
473	CBaseMultiplayerPlayer::CalculateTeamBalanceScore(void)&lt;br /&gt;
474	CBaseMultiplayerPlayer::CreateExpresser(void)&lt;br /&gt;
475	CCSPlayer::FirePlayerHurtEvent(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
476	CTerrorPlayer::OnTakeDamageInternal(CTakeDamageInfo &amp;amp;)&lt;br /&gt;
477	CTerrorPlayer::AllowDamage(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
478	CTerrorPlayer::GetHealthBuffer(void)const&lt;br /&gt;
479	CTerrorPlayer::IsIncapacitated(void)const&lt;br /&gt;
480	CTerrorPlayer::GetAdjustedDamage(CTakeDamageInfo  const&amp;amp;,float,float,bool)&lt;br /&gt;
481	CTerrorPlayer::DoBloodEffect(float,CTakeDamageInfo  const&amp;amp;,Vector  const&amp;amp;,CGameTrace *)&lt;br /&gt;
482	CCSPlayer::GiveNamedItem(char  const*,int)&lt;br /&gt;
483	CCSPlayer::IsBeingGivenItem(void)const&lt;br /&gt;
484	CTerrorPlayer::DoAnimationEvent(PlayerAnimEvent_t,int)&lt;br /&gt;
485	CCSPlayer::CSAnim_GetActiveWeapon(void)&lt;br /&gt;
486	CCSPlayer::CSAnim_CanMove(void)&lt;br /&gt;
487	CTerrorPlayer::KickBack(float,float,float,float,float,float,int)&lt;br /&gt;
488	CTerrorPlayer::IsImmobilized(void)const&lt;br /&gt;
489	CTerrorPlayer::GiveDefaultItems(void)&lt;br /&gt;
490	CTerrorPlayer::RoundRespawn(void)&lt;br /&gt;
491	CTerrorPlayer::ObserverRoundRespawn(void)&lt;br /&gt;
492	CCSPlayer::Blind(float,float,float)&lt;br /&gt;
493	CTerrorPlayer::Deafen(float,float,float)&lt;br /&gt;
494	CTerrorPlayer::ResetMaxSpeed(void)&lt;br /&gt;
495	CCSPlayer::HandleCommand_JoinClass(int)&lt;br /&gt;
496	CTerrorPlayer::HandleCommand_JoinTeam(int,char  const*,bool)&lt;br /&gt;
497	CTerrorPlayer::GetIntoGame(void)&lt;br /&gt;
498	CTerrorPlayer::WantsMOTD(void)const&lt;br /&gt;
499	CTerrorPlayer::AutoSelectTeam(void)&lt;br /&gt;
500	CTerrorPlayer::OnLeaveActiveState(void)&lt;br /&gt;
501	CTerrorPlayer::Pain(bool)&lt;br /&gt;
502	CTerrorPlayer::OnTeamChanged(int)&lt;br /&gt;
503	CTerrorPlayer::CanAttack(void)const&lt;br /&gt;
504	CTerrorPlayer::OnWeaponFired(void)&lt;br /&gt;
505	CTerrorPlayer::OnHitPlayer(int,float,float,int)&lt;br /&gt;
506	CTerrorPlayer::OnReloadStart(bool,int,bool)&lt;br /&gt;
507	CTerrorPlayer::CreateNoise(float)&lt;br /&gt;
508	CTerrorPlayer::OnPreThinkObserverMode(void)&lt;br /&gt;
509	CTerrorPlayer::OnEnterRescueState(void)&lt;br /&gt;
510	CTerrorPlayer::OnPreThinkRescueState(void)&lt;br /&gt;
511	CTerrorPlayer::OnLeaveRescueState(void)&lt;br /&gt;
512	CTerrorPlayer::OnEnterGhostState(void)&lt;br /&gt;
513	CTerrorPlayer::OnPreThinkGhostState(void)&lt;br /&gt;
514	CTerrorPlayer::OnLeaveGhostState(void)&lt;br /&gt;
515	CTerrorPlayer::OnEnterIntroCameraState(void)&lt;br /&gt;
516	CTerrorPlayer::OnPreThinkIntroCameraState(void)&lt;br /&gt;
517	CTerrorPlayer::OnLeaveIntroCameraState(void)&lt;br /&gt;
518	CTerrorPlayer::OnLeaveDeathAnimState(void)&lt;br /&gt;
519	CTerrorPlayer::OnLeaveDeathWaitForKeyState(void)&lt;br /&gt;
520	CTerrorPlayer::CanUseFlashlight(void)const&lt;br /&gt;
521	CTerrorPlayer::UpdateAddonBits(void)&lt;br /&gt;
522	CTerrorPlayer::UpdateRadar(void)&lt;br /&gt;
523	CTerrorPlayer::SelectDeathPose(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
524	CTerrorPlayer::CanChangeName(void)const&lt;br /&gt;
525	CTerrorPlayer::ChangeName(char  const*)&lt;br /&gt;
526	CTerrorPlayer::IsProgressBarActive(void)const&lt;br /&gt;
527	CTerrorPlayer::CreateRagdollEntity(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
528	CTerrorPlayer::GetRagdollType(void)const&lt;br /&gt;
529	CTerrorPlayer::SetModelFromClass(void)&lt;br /&gt;
530	CTerrorPlayer::SetModelFromClassAtSpawn(void)&lt;br /&gt;
531	CTerrorPlayer::DropWeapons(bool)&lt;br /&gt;
532	CTerrorPlayer::RecordDamageTaken(char  const*,int)&lt;br /&gt;
533	CTerrorPlayer::OnPlayerDisconnected(CTerrorPlayer*)&lt;br /&gt;
534	CTerrorPlayer::OnSpawn(void)&lt;br /&gt;
535	CTerrorPlayer::RestoreSpawn(void)&lt;br /&gt;
536	CTerrorPlayer::OnBeginChangeLevel(char  const*,KeyValues *)&lt;br /&gt;
537	CTerrorPlayer::OnEndChangeLevel(void)&lt;br /&gt;
538	CTerrorPlayer::SetDoingRestore(bool)&lt;br /&gt;
539	CTerrorPlayer::GetTeamSwitchRule(void)const&lt;br /&gt;
540	CTerrorPlayer::IsReadyToShove(void)&lt;br /&gt;
541	CTerrorPlayer::SetNextShoveTime(float)&lt;br /&gt;
542	CTerrorPlayer::CommitSuicide(bool)&lt;br /&gt;
543	CTerrorPlayer::OnSpokeConcept(CAI_Concept,AI_Response *)&lt;br /&gt;
544	CTerrorPlayer::RestoreWeapons(void)&lt;br /&gt;
545	CTerrorPlayer::OnReloadEnd(void)&lt;br /&gt;
546	CTerrorPlayer::OnReloadAbort(void)&lt;br /&gt;
547	CTerrorPlayer::OnAttackSuccess(CBaseCombatCharacter *,bool)&lt;br /&gt;
548	CTerrorPlayer::IsWielding(CSWeaponID)const&lt;br /&gt;
549	CTerrorPlayer::IsZoomed(void)&lt;br /&gt;
550	CTerrorPlayer::CanPlayerJump(void)const&lt;br /&gt;
551	CTerrorPlayer::PlayerZombieAbortControl(void)&lt;br /&gt;
552	CTerrorPlayer::CanBeShoved(void)&lt;br /&gt;
553	CTerrorPlayer::SetClass(ZombieClassType)&lt;br /&gt;
554	CTerrorPlayer::SetCharacter(void)&lt;br /&gt;
555	CTerrorPlayer::OnRevived(void)&lt;br /&gt;
556	CTerrorPlayer::OnAwardEarned(AwardType,CBaseEntity *)&lt;br /&gt;
557	CTerrorPlayer::OnAwardLost(AwardType)&lt;br /&gt;
558	CTerrorPlayer::ScoreKilledZombie(ZombieClassType)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=SourceMod_1.2.0_Release_Notes&amp;diff=6994</id>
		<title>SourceMod 1.2.0 Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=SourceMod_1.2.0_Release_Notes&amp;diff=6994"/>
		<updated>2009-03-05T21:45:15Z</updated>

		<summary type="html">&lt;p&gt;DS: /* Changelog */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__&lt;br /&gt;
SourceMod 1.2 is a major update.  It is backwards compatible with all known plugins (see notes for details).&lt;br /&gt;
&lt;br /&gt;
This release includes configuration changes to &amp;lt;tt&amp;gt;core.cfg&amp;lt;/tt&amp;gt;.  You should either overwrite your old &amp;lt;tt&amp;gt;core.cfg&amp;lt;/tt&amp;gt;, or merge in the new settings available.&lt;br /&gt;
&lt;br /&gt;
=New Game Support=&lt;br /&gt;
SourceMod 1.2 includes full support for two additional game engines:&lt;br /&gt;
*[http://www.l4d.com/ Left 4 Dead], a new game released by Valve.  Notes:&lt;br /&gt;
**This game uses a new engine, similar to Orange Box.  Metamod:Source support is available in 1.7.0+.&lt;br /&gt;
**&amp;lt;tt&amp;gt;nextmap.smx&amp;lt;/tt&amp;gt; will appear disabled, since it has no use.&lt;br /&gt;
**[[Multiple_or_Forked_Servers_(SourceMod)|Do not use forked servers over one copy of SourceMod.]]&lt;br /&gt;
**Selecting an unavailable menu item will cause menus to disappear, without any &amp;quot;end of menu&amp;quot; callback being fired.  This is a bug in the game client (see discussion at {{bz|3566}}).&lt;br /&gt;
*[http://darkmessiahmightandmagic.us.ubi.com/ Dark Messiah of Might and Magic], by Ubisoft.  Notes:&lt;br /&gt;
**This game only has a Windows server, so SourceMod only supports it on Windows.&lt;br /&gt;
**This game uses a modified pre-Episode 1 engine, similar but more deviating than The Ship.  Metamod:Source support is included in 1.7.1+, and uses the &amp;quot;new&amp;quot; MM:S API, not the legacy API (unlike other earlier engines).&lt;br /&gt;
**Reverse engineered HL2SDK headers are available on the [http://hg.alliedmods.net/ AlliedModders Mercurial Forest].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=New Updater=&lt;br /&gt;
SourceMod 1.2 includes a rewrite of the gamedata updating system.  It has been moved from Core into an extension, and uses an HTTP connection instead of a hand-crafted protocol.  This was done to make maintenance easier and to simplify protocol changes.&lt;br /&gt;
&lt;br /&gt;
The gamedata fetcher no longer skips default files which have custom changes.  These will be overwritten if updates are pending.  '''You have been warned.'''  See the Gamedata Changes section on this page for more information on how to add custom changes.&lt;br /&gt;
&lt;br /&gt;
[[Multiple_or_Forked_Servers_(SourceMod)|Do not use forked or multiple server instances over one copy of SourceMod.]]  This is essential.  The updater, while it doesn't create lock files anymore, can potentially write new files to the gamedata folder.  If multiple servers are trying to do this at once, the end result could be undefined.  Use separate copies of SourceMod.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Gamedata Changes=&lt;br /&gt;
Gamedata files can now be placed in &amp;quot;gamedata folders,&amp;quot; which if they exist, completely override the existence of old files (in that they do not get parsed).&lt;br /&gt;
&lt;br /&gt;
For example, if SDKTools asks for &amp;quot;sdktools.games&amp;quot;, Core will now read &amp;lt;tt&amp;gt;gamedata/sdktools.games/master.games.txt&amp;lt;/tt&amp;gt; instead.  This file has a simple format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;Game Master&amp;quot;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;file&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;rule1&amp;quot;     &amp;quot;value&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each section under the main section is a file name.  The file is loaded if all the rules underneath it match.  Available rules are:&lt;br /&gt;
*&amp;quot;engine&amp;quot; as one of &amp;quot;original&amp;quot;, &amp;quot;orangebox&amp;quot;, &amp;quot;left4dead&amp;quot;, or &amp;quot;darkmessiah&amp;quot;&lt;br /&gt;
*&amp;quot;game&amp;quot; as used in normal gamedata files.&lt;br /&gt;
&lt;br /&gt;
This helps minimize the amount of file maintenance and complexity in systems with many gamedata entries across many games.&lt;br /&gt;
&lt;br /&gt;
In addition, there is a &amp;quot;custom&amp;quot; folder underneath new gamedata folders.  You can use these to place new files that will get parsed after all other parsing is done.  Custom files are read in an undefined order, and are immune from automatic updates.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Compatibility=&lt;br /&gt;
*If you compile plugins (or extensions) with SourceMod 1.2, they cannot be run on SourceMod 1.1, even if they do not use new features.  &lt;br /&gt;
*SourceMod 1.2 cannot be &amp;quot;downgraded&amp;quot; to SourceMod 1.1 unless the extensions folder is cleared.  This is because the &amp;quot;bintools&amp;quot; extension is in a new location, and the new version will be loaded over the old after downgrading.&lt;br /&gt;
*'''Developers:''' The &amp;quot;usermessage&amp;quot; API has changed.  &amp;lt;tt&amp;gt;MsgNotify&amp;lt;/tt&amp;gt; has been removed entirely, and replaced with &amp;lt;tt&amp;gt;MsgPostHook&amp;lt;/tt&amp;gt;.  This change is transparent, and no plugins appeared to have been using the API.  If you have a plugin relying on the &amp;lt;tt&amp;gt;MsgNotify&amp;lt;/tt&amp;gt; functionality, your plugin will now receive intercepted calls that are blocked as well.  Update your source, recompile, and use the new &amp;lt;tt&amp;gt;sent&amp;lt;/tt&amp;gt; parameter to filter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Translations=&lt;br /&gt;
SourceMod 1.2 comes with the following languages translated, thanks to [http://www.sourcemod.net/translator/?go=translate&amp;amp;op=status community translators]:&lt;br /&gt;
*Brazilian Portuguese&lt;br /&gt;
*Chinese Simplified&lt;br /&gt;
*Danish&lt;br /&gt;
*Dutch&lt;br /&gt;
*French&lt;br /&gt;
*German&lt;br /&gt;
*Hungarian&lt;br /&gt;
*Italian&lt;br /&gt;
*Japanese&lt;br /&gt;
*Latvian&lt;br /&gt;
*Norwegian&lt;br /&gt;
*Polish&lt;br /&gt;
*Romanian&lt;br /&gt;
*Russian&lt;br /&gt;
*Spanish&lt;br /&gt;
*Turkish&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Changelog=&lt;br /&gt;
*Added Left 4 Dead support ({{bz|3414}}).&lt;br /&gt;
*Added Dark Messiah game support (requires Metamod:Source 1.7.1 or higher).&lt;br /&gt;
*Added sm_name command ({{bz|2150}}).&lt;br /&gt;
*Added extension-level dynamic hooking to bintools ({{bz|2616}}).&lt;br /&gt;
*Added client validation API to replace passing userids asynchronously.&lt;br /&gt;
*Added cURL extension, available to other extensions ({{bz|3560}}).&lt;br /&gt;
*Added parsing of custom gamedata files ({{bz|3644}}).&lt;br /&gt;
*Added case insensitivity search to ReplaceString ({{bz|3639}}, Fyren).&lt;br /&gt;
*Added more detail to certain player-oriented menu titles ({{bz|2740}}, Fyren).&lt;br /&gt;
*Added sv_tags API ({{bz|3688}}).&lt;br /&gt;
*Greatly improved admin-sql-prefetch performance for large tables ({{bz|3354}}, FLOOR_MASTER).&lt;br /&gt;
*Exposed IServer address to extensions ({{bz|3545}}).&lt;br /&gt;
*New gamedata organization; files are now smaller and per-game ({{bz|3546}}).&lt;br /&gt;
*Split sound functions into a new plugin, sounds.smx.&lt;br /&gt;
*Fixed slap and slay on Insurgency ({{bz|2560}}).&lt;br /&gt;
*Fixed blank admins being created from invalid admin file lines ({{bz|3431}}).&lt;br /&gt;
*Fixed basetriggers not working on Insurgency ({{bz|3497}}).&lt;br /&gt;
*Fixed client preferences missing some clients ({{bz|3616}}).&lt;br /&gt;
*Improved database fallback mechanism in clientprefs ({{bz|3564}}).&lt;br /&gt;
*Improved timer handling in funcommands ({{bz|3498}}).&lt;br /&gt;
*Improved compile.sh to take filenames ({{bz|3550}}, jonasfietz).&lt;br /&gt;
*sm_kick now shows the kick reason when available.&lt;br /&gt;
*Fixed MsgPostHook (ex MsgSentNotify) callbacks not firing on intercept hook ({{bz|3631}}).&lt;br /&gt;
*Note: SourceMod now adds &amp;quot;sourcemod&amp;quot; to the sv_tags cvar.&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Releasing_Products&amp;diff=6957</id>
		<title>Releasing Products</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Releasing_Products&amp;diff=6957"/>
		<updated>2009-02-27T06:16:38Z</updated>

		<summary type="html">&lt;p&gt;DS: /* Cleaning up the Tree */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is an internal page for doing AlliedModders product releases.&lt;br /&gt;
&lt;br /&gt;
=Making Builds=&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Once you are '''absolutely sure''' the product is ready for a release...&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Jump to a Linux system, check out the source tree.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Update the changelog (&amp;lt;tt&amp;gt;changelog.txt&amp;lt;/tt&amp;gt; for SourceMod, &amp;lt;tt&amp;gt;support/changelog.txt&amp;lt;/tt&amp;gt; for Metamod:Source).&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;For Metamod:Source, edit &amp;lt;tt&amp;gt;support/buildbot/bootstrap.pl&amp;lt;/tt&amp;gt;.  For SourceMod, edit &amp;lt;tt&amp;gt;tools/buildbot/bootstrap.pl&amp;lt;/tt&amp;gt;.  Change the file like [http://hg.alliedmods.net/sourcemod-1.1/rev/4bfc362ba419 this changeset].  In both files this is the last line.  It must be commented so BuildBot does not run the &amp;lt;tt&amp;gt;versionchanger.pl&amp;lt;/tt&amp;gt; script.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Once &amp;lt;tt&amp;gt;bootstrap.pl&amp;lt;/tt&amp;gt; has been edited, commit the change.  Do not push.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;For Metamod:Source, be at the top level of the tree, and run:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
support/versionchanger.pl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
For SourceMod, be at the top level of the tree, and run:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tools/versionchanger.pl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 Once you're done, use &amp;lt;tt&amp;gt;hg diff&amp;lt;/tt&amp;gt; to verify that version numbers have been bumped.  Commit the change.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Push.  Watch the waterfall page until builds are complete.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Post-Build Work=&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Grab the binaries from the drop site ([http://metamodsource.net/mmsdrop/ MM:S drop site], [http://sourcemod.net/smdrop/ SourceMod drop site]).  It will be the latest package.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Install the packages on both Linux and Windows.  '''MAKE SURE THE VERSIONS ARE CORRECT.  THERE SHOULD BE NO -dev TAG.'''&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Metamod:Source checks:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
meta version&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
SourceMod checks:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sm plugins list&lt;br /&gt;
sm exts list&lt;br /&gt;
sm version&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;If the versions are not correct, do not release.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;For SourceMod, you need to add the language translation packs.  &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  '''If this is a major release (1.X.0), there is no prior pack.  Make one:'''&lt;br /&gt;
  &amp;lt;ol&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Extract both the tar.gz and zip files to separate folders.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Visit the [http://www.sourcemod.net/translator/?go=translate&amp;amp;op=status translator status page].&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Click &amp;quot;export languages.cfg&amp;quot; - save the new version to &amp;lt;tt&amp;gt;addons/sourcemod/configs/&amp;lt;/tt&amp;gt;, overwriting the old one.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Click &amp;quot;export&amp;quot; next to each language that is finished.  Extract the folder to &amp;lt;tt&amp;gt;addons/sourcemod/translations/&amp;lt;/tt&amp;gt;.  For example, if you extract Spanish, you should have &amp;lt;tt&amp;gt;addons/sourcemod/translations/es/&amp;lt;/tt&amp;gt; complete with ML files.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Repackage thefolders using the correct compression types (.tar.gz for Linux, .zip for Windows).&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;If this is a minor release (1.X.Y where Y != 0), there is already a prior pack.  Add it in:&amp;lt;/b&amp;gt;&lt;br /&gt;
  &amp;lt;ol&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Extract both the tar.gz and zip files to separate folders.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Download the last minor release from the same branch as this release.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Copy the &amp;lt;tt&amp;gt;addons/sourcemod/configs/languages.cfg&amp;lt;/tt&amp;gt; file from the old release over the new one.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Copy the &amp;lt;tt&amp;gt;addons/sourcemod/translations/&amp;lt;/tt&amp;gt; sub-folders from the old release over to the new one.&amp;lt;/li&amp;gt;&lt;br /&gt;
   &amp;lt;li&amp;gt;Repackage thefolders using the correct compression types (.tar.gz for Linux, .zip for Windows).&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;/ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;The build is done!&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Releasing to Mirrors=&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Log into iroh as yourself.  Upload your final builds to your home directory.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Run:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/scripts/amjump mirror&lt;br /&gt;
cd /scripts/mirror&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Copy your final builds from your home directory into the mirror folder.  Rename them to release names, for example: &amp;lt;tt&amp;gt;sourcemod-1.1.2.zip&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;mmsource-1.8.0.zip&amp;lt;/tt&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Mirror distribution is done with the following command:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./mirror.pl &amp;lt;projectID&amp;gt; &amp;lt;releaseName&amp;gt; &amp;lt;file&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Metamod:Source's ID is 4, SourceMod's ID is 2.  For example, these commands mirrored the Metamod:Source 1.7.0 release:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./mirror.pl 4 1.7.0 mmsource-1.7.0.zip&lt;br /&gt;
./mirror.pl 4 1.7.0 mmsource-1.7.0.tar.gz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
These commands mirrored the last SourceMod release:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./mirror.pl 2 1.1.1 sourcemod-1.1.1.tar.gz&lt;br /&gt;
./mirror.pl 2 1.1.1 sourcemod-1.1.1.zip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Type &amp;lt;tt&amp;gt;exit&amp;lt;/tt&amp;gt; to get back to your user account.  You're done!&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Cleaning up the Tree=&lt;br /&gt;
It's time to make sure the tree is set for future development.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Run &amp;lt;tt&amp;gt;hg tag&amp;lt;/tt&amp;gt; on the last revision of the release.  Usually this is the changeset that bumped versions, and usually this is &amp;lt;tt&amp;gt;tip&amp;lt;/tt&amp;gt;.  For example, Metamod:Source:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg tag mmsource-1.7.2&amp;lt;/pre&amp;gt;&lt;br /&gt;
SourceMod:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg tag sourcemod-1.1.2&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Bump the minor version in &amp;lt;tt&amp;gt;product.version&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;modules.version&amp;lt;/tt&amp;gt; at the root of the tree.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Run &amp;lt;tt&amp;gt;versionchanger.pl&amp;lt;/tt&amp;gt; again, from the root of the tree (see section 1, step 6). This time, however, add &amp;lt;tt&amp;gt;--buildstring=-dev&amp;lt;/tt&amp;gt; to the command line so that the -dev tag is added on any manual builds.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Back out the &amp;lt;tt&amp;gt;bootstrap.pl&amp;lt;/tt&amp;gt; change, so &amp;lt;tt&amp;gt;versionchanger.pl&amp;lt;/tt&amp;gt; runs with the -dev tag again.&lt;br /&gt;
 &amp;lt;li&amp;gt;Commit and push.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Updating the SourceMod Site=&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Visit a [http://wiki.alliedmods.net/SourceMod_Release_Notes Release Notes] page.  Copy the contents, make a new one for your specific release.  Update the changelog, relnote anything big and important.  Link back to it from the &amp;quot;main&amp;quot; relnotes page.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Jump to the sourcemod account by logging into iroh as yourself:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/scripts/amjump sourcemod&lt;br /&gt;
cd /home/groups/sourcemod&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Edit the &amp;lt;tt&amp;gt;public_html/downloads.php&amp;lt;/tt&amp;gt; file with your favorite text editor.  Edit all instances of the old version with the new one.  Make sure to get every link, including relnotes.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Post news.  If you deviate from normal style, don't forget links for downloads, upgrading, and relnotes.  It also helps to say &amp;quot;this is backwards compatible&amp;quot; because users will always ask.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Exit out of the sourcemod account.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Updating the Metamod:Source Site=&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Jump to the sourcemm account by logging into iroh as yourself:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/scripts/amjump sourcemm&lt;br /&gt;
cd /home/groups/sourcemm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Edit the &amp;lt;tt&amp;gt;public_html/templates/content_downloads.tpl&amp;lt;/tt&amp;gt; file with your favorite text editor.  Edit all instances of the old version with the new one.  Update all Mercurial links with the tagged changeset ID for this release.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Post news.  Do this by making a post in [https://forums.alliedmods.net/forumdisplay.php?f=124 this forum], which is private.  LOOK AT OLDER POSTS - you need to write valid XHTML!&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;Exit out of the sourcemm account.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=CTerrorPlayer_Offset_List_(Left_4_Dead)&amp;diff=6791</id>
		<title>CTerrorPlayer Offset List (Left 4 Dead)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=CTerrorPlayer_Offset_List_(Left_4_Dead)&amp;diff=6791"/>
		<updated>2009-01-15T04:56:27Z</updated>

		<summary type="html">&lt;p&gt;DS: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Also for use when using [[Virtual Offsets (Source Mods)|virtual offsets]].&lt;br /&gt;
&lt;br /&gt;
These are the &amp;lt;b&amp;gt;Windows&amp;lt;/b&amp;gt; offsets. &amp;lt;b&amp;gt;Linux offsets are 1 greater.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The List ==&lt;br /&gt;
This comes from the symbol tables, so you'll have to look in the SDK for return types.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Last Updated 14 January 2009&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Auto reconstructed from vtable block @ 0x00F1C440&lt;br /&gt;
// from &amp;quot;server_i486.so&amp;quot;, by ida_vtables.idc&lt;br /&gt;
0	CTerrorPlayer::~CTerrorPlayer()&lt;br /&gt;
1	CBaseEntity::SetRefEHandle(CBaseHandle  const&amp;amp;)&lt;br /&gt;
2	CBaseEntity::GetRefEHandle(void)const&lt;br /&gt;
3	CBaseEntity::GetCollideable(void)&lt;br /&gt;
4	CBaseEntity::GetNetworkable(void)&lt;br /&gt;
5	CBaseEntity::GetBaseEntity(void)&lt;br /&gt;
6	CBaseEntity::GetModelIndex(void)const&lt;br /&gt;
7	CBaseEntity::GetModelName(void)const&lt;br /&gt;
8	CCSPlayer::SetModelIndex(int)&lt;br /&gt;
9	CTerrorPlayer::GetServerClass(void)&lt;br /&gt;
10	CTerrorPlayer::YouForgotToImplementOrDeclareServerClass(void)&lt;br /&gt;
11	CTerrorPlayer::GetDataDescMap(void)&lt;br /&gt;
12	CBaseAnimating::TestCollision(Ray_t  const&amp;amp;,unsigned int,CGameTrace &amp;amp;)&lt;br /&gt;
13	CTerrorPlayer::TestHitboxes(Ray_t  const&amp;amp;,unsigned int,CGameTrace &amp;amp;)&lt;br /&gt;
14	CBaseEntity::ComputeWorldSpaceSurroundingBox(Vector *,Vector *)&lt;br /&gt;
15	CTerrorPlayer::ShouldCollide(int,int)const&lt;br /&gt;
16	CBaseEntity::SetOwnerEntity(CBaseEntity*)&lt;br /&gt;
17	CTerrorPlayer::ShouldTransmit(CCheckTransmitInfo  const*)&lt;br /&gt;
18	CBasePlayer::UpdateTransmitState(void)&lt;br /&gt;
19	CBaseCombatCharacter::SetTransmit(CCheckTransmitInfo *,bool)&lt;br /&gt;
20	CBasePlayer::GetTracerType(void)&lt;br /&gt;
21	CTerrorPlayer::Spawn(void)&lt;br /&gt;
22	CTerrorPlayer::Precache(void)&lt;br /&gt;
23	CBasePlayer::SetModel(char  const*)&lt;br /&gt;
24	CBaseMultiplayerPlayer::PostConstructor(char  const*)&lt;br /&gt;
25	CBaseEntity::PostClientActive(void)&lt;br /&gt;
26	CBaseEntity::ParseMapData(CEntityMapData *)&lt;br /&gt;
27	CBaseEntity::KeyValue(char  const*,char  const*)&lt;br /&gt;
28	CBaseEntity::KeyValue(char  const*,float)&lt;br /&gt;
29	CBaseEntity::KeyValue(char  const*,Vector  const&amp;amp;)&lt;br /&gt;
30	CBaseEntity::GetKeyValue(char  const*,char *,int)&lt;br /&gt;
31	CBasePlayer::Activate(void)&lt;br /&gt;
32	CBaseEntity::SetParent(CBaseEntity*,int)&lt;br /&gt;
33	CTerrorPlayer::ObjectCaps(void)&lt;br /&gt;
34	CTerrorPlayer::GetUsePriority(CBaseEntity *)&lt;br /&gt;
35	CBaseEntity::GetGlowEntity(void)&lt;br /&gt;
36	CBaseEntity::GetUseType(CBaseEntity*)&lt;br /&gt;
37	CBaseEntity::AcceptInput(char  const*,CBaseEntity*,CBaseEntity*,variant_t,int)&lt;br /&gt;
38	CBasePlayer::DrawDebugGeometryOverlays(void)&lt;br /&gt;
39	CBaseAnimating::DrawDebugTextOverlays(void)&lt;br /&gt;
40	CBasePlayer::Save(ISave &amp;amp;)&lt;br /&gt;
41	CBasePlayer::Restore(IRestore &amp;amp;)&lt;br /&gt;
42	CBasePlayer::ShouldSavePhysics(void)&lt;br /&gt;
43	CBaseEntity::OnSave(IEntitySaveUtils *)&lt;br /&gt;
44	CBasePlayer::OnRestore(void)&lt;br /&gt;
45	CBasePlayer::RequiredEdictIndex(void)&lt;br /&gt;
46	CBaseEntity::MoveDone(void)&lt;br /&gt;
47	CBaseEntity::Think(void)&lt;br /&gt;
48	CBasePlayer::NetworkStateChanged_m_nNextThinkTick(void)&lt;br /&gt;
49	CBasePlayer::NetworkStateChanged_m_nNextThinkTick(void *)&lt;br /&gt;
50	CBaseAnimating::GetBaseAnimating(void)&lt;br /&gt;
51	CTerrorPlayer::GetResponseSystem(void)&lt;br /&gt;
52	CAI_ExpresserHost&amp;lt;CBasePlayer&amp;gt;::DispatchResponse(char  const*)&lt;br /&gt;
53	CBasePlayer::Classify(void)&lt;br /&gt;
54	CBaseEntity::DeathNotice(CBaseEntity*)&lt;br /&gt;
55	CTerrorPlayer::ShouldAttractAutoAim(CBaseEntity *)&lt;br /&gt;
56	CBaseEntity::GetAutoAimRadius(void)&lt;br /&gt;
57	CBaseEntity::GetAutoAimCenter(void)&lt;br /&gt;
58	CBaseEntity::GetBeamTraceFilter(void)&lt;br /&gt;
59	CBaseEntity::PassesDamageFilter(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
60	CCSPlayer::TraceAttack(CTakeDamageInfo  const&amp;amp;,Vector  const&amp;amp;,CGameTrace *)&lt;br /&gt;
61	CBaseEntity::CanBeHitByMeleeAttack(CBaseEntity*)&lt;br /&gt;
62	CTerrorPlayer::OnTakeDamage(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
63	CTerrorPlayer::TakeHealth(float,int)&lt;br /&gt;
64	CBaseEntity::IsAlive(void)const&lt;br /&gt;
65	CTerrorPlayer::Event_Killed(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
66	CBasePlayer::Event_KilledOther(CBaseEntity *,CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
67	CBaseCombatCharacter::BloodColor(void)&lt;br /&gt;
68	CBaseEntity::IsTriggered(CBaseEntity*)&lt;br /&gt;
69	CBaseEntity::IsNPC(void)const&lt;br /&gt;
70	CBaseCombatCharacter::MyCombatCharacterPointer(void)&lt;br /&gt;
71	CBaseEntity::MyNextBotPointer(void)&lt;br /&gt;
72	CBaseEntity::MyInfectedPointer(void)&lt;br /&gt;
73	CBaseEntity::GetDelay(void)&lt;br /&gt;
74	CBaseEntity::IsMoving(void)&lt;br /&gt;
75	CBaseEntity::DamageDecal(int,int)&lt;br /&gt;
76	CBaseEntity::DecalTrace(CGameTrace *,char  const*)&lt;br /&gt;
77	CBaseEntity::ImpactTrace(CGameTrace *,int,char *)&lt;br /&gt;
78	CBaseEntity::OnControls(CBaseEntity*)&lt;br /&gt;
79	CBaseEntity::HasTarget(string_t)&lt;br /&gt;
80	CBasePlayer::IsPlayer(void)const&lt;br /&gt;
81	CBasePlayer::IsNetClient(void)const&lt;br /&gt;
82	CBaseEntity::IsTemplate(void)&lt;br /&gt;
83	CBaseEntity::IsBaseObject(void)const&lt;br /&gt;
84	CBaseEntity::IsBaseCombatWeapon(void)const&lt;br /&gt;
85	CBaseEntity::MyCombatWeaponPointer(void)&lt;br /&gt;
86	CBaseEntity::GetServerVehicle(void)&lt;br /&gt;
87	CBaseEntity::IsViewable(void)&lt;br /&gt;
88	CTerrorPlayer::ChangeTeam(int)&lt;br /&gt;
89	CBaseEntity::OnEntityEvent(EntityEvent_t,void *)&lt;br /&gt;
90	CBaseEntity::CanStandOn(CBaseEntity*)const&lt;br /&gt;
91	CBaseEntity::CanStandOn(edict_t *)const&lt;br /&gt;
92	CBaseEntity::GetEnemy(void)&lt;br /&gt;
93	CBaseEntity::GetEnemy(void)const&lt;br /&gt;
94	CBaseEntity::Use(CBaseEntity*,CBaseEntity*,USE_TYPE,float)&lt;br /&gt;
95	CBaseEntity::StartTouch(CBaseEntity*)&lt;br /&gt;
96	CTerrorPlayer::Touch(CBaseEntity *)&lt;br /&gt;
97	CBaseEntity::EndTouch(CBaseEntity*)&lt;br /&gt;
98	CBaseEntity::StartBlocked(CBaseEntity*)&lt;br /&gt;
99	CBaseEntity::Blocked(CBaseEntity*)&lt;br /&gt;
100	CBaseEntity::EndBlocked(void)&lt;br /&gt;
101	CBasePlayer::PhysicsSimulate(void)&lt;br /&gt;
102	CBasePlayer::UpdateOnRemove(void)&lt;br /&gt;
103	CBaseEntity::StopLoopingSounds(void)&lt;br /&gt;
104	CBaseEntity::SUB_AllowedToFade(void)&lt;br /&gt;
105	CTerrorPlayer::Teleport(Vector  const*,QAngle  const*,Vector  const*)&lt;br /&gt;
106	CBaseEntity::NotifySystemEvent(CBaseEntity*,notify_system_event_t,notify_system_event_params_t  const&amp;amp;)&lt;br /&gt;
107	CBasePlayer::MakeTracer(Vector  const&amp;amp;,CGameTrace  const&amp;amp;,int)&lt;br /&gt;
108	CBaseEntity::GetTracerAttachment(void)&lt;br /&gt;
109	CBaseEntity::FireBullets(FireBulletsInfo_t  const&amp;amp;)&lt;br /&gt;
110	CBasePlayer::DoImpactEffect(CGameTrace &amp;amp;,int)&lt;br /&gt;
111	CBaseEntity::Respawn(void)&lt;br /&gt;
112	CBaseEntity::IsLockedByMaster(void)&lt;br /&gt;
113	CTerrorPlayer::ModifyOrAppendCriteria(AI_CriteriaSet &amp;amp;)&lt;br /&gt;
114	CTerrorPlayer::ModifyOrAppendDerivedCriteria(AI_CriteriaSet &amp;amp;)&lt;br /&gt;
115	CTerrorPlayer::NetworkStateChanged_m_iMaxHealth(void)&lt;br /&gt;
116	CTerrorPlayer::NetworkStateChanged_m_iMaxHealth(void *)&lt;br /&gt;
117	CBasePlayer::NetworkStateChanged_m_iHealth(void)&lt;br /&gt;
118	CBasePlayer::NetworkStateChanged_m_iHealth(void *)&lt;br /&gt;
119	CBasePlayer::NetworkStateChanged_m_lifeState(void)&lt;br /&gt;
120	CBasePlayer::NetworkStateChanged_m_lifeState(void *)&lt;br /&gt;
121	CBaseEntity::NetworkStateChanged_m_takedamage(void)&lt;br /&gt;
122	CBaseEntity::NetworkStateChanged_m_takedamage(void *)&lt;br /&gt;
123	CBaseEntity::GetDamageType(void)const&lt;br /&gt;
124	CBaseEntity::GetDamage(void)&lt;br /&gt;
125	CBaseEntity::SetDamage(float)&lt;br /&gt;
126	CBasePlayer::EyePosition(void)&lt;br /&gt;
127	CBasePlayer::EyeAngles(void)&lt;br /&gt;
128	CBasePlayer::LocalEyeAngles(void)&lt;br /&gt;
129	CBaseEntity::EarPosition(void)&lt;br /&gt;
130	CBasePlayer::BodyTarget(Vector  const&amp;amp;,bool)&lt;br /&gt;
131	CBaseEntity::HeadTarget(Vector  const&amp;amp;)&lt;br /&gt;
132	CBaseEntity::GetVectors(Vector *,Vector *,Vector *)const&lt;br /&gt;
133	CBaseEntity::GetViewOffset(void)const&lt;br /&gt;
134	CBaseEntity::SetViewOffset(Vector  const&amp;amp;)&lt;br /&gt;
135	CBasePlayer::GetSmoothedVelocity(void)&lt;br /&gt;
136	CBaseAnimating::GetVelocity(Vector *,Vector *)&lt;br /&gt;
137	CTerrorPlayer::GetFriction(void)const&lt;br /&gt;
138	CBaseCombatCharacter::FVisible(CBaseEntity *,int,CBaseEntity **)&lt;br /&gt;
139	CBaseCombatCharacter::FVisible(Vector  const&amp;amp;,int,CBaseEntity **)&lt;br /&gt;
140	CBaseEntity::CanBeSeenBy(CAI_BaseNPC *)&lt;br /&gt;
141	CBaseEntity::GetAttackDamageScale(CBaseEntity*)&lt;br /&gt;
142	CBaseEntity::GetReceivedDamageScale(CBaseEntity*)&lt;br /&gt;
143	CTerrorPlayer::OnGroundChanged(CBaseEntity *,CBaseEntity *)&lt;br /&gt;
144	CBaseEntity::GetGroundVelocityToApply(Vector &amp;amp;)&lt;br /&gt;
145	CBaseEntity::PhysicsSplash(Vector  const&amp;amp;,Vector  const&amp;amp;,float,float)&lt;br /&gt;
146	CBaseEntity::Splash(void)&lt;br /&gt;
147	CBaseEntity::WorldSpaceCenter(void)const&lt;br /&gt;
148	CCSPlayer::GetSoundEmissionOrigin(void)const&lt;br /&gt;
149	CBaseEntity::CreateVPhysics(void)&lt;br /&gt;
150	CBaseEntity::ForceVPhysicsCollide(CBaseEntity*)&lt;br /&gt;
151	CBasePlayer::VPhysicsDestroyObject(void)&lt;br /&gt;
152	CBasePlayer::VPhysicsUpdate(IPhysicsObject *)&lt;br /&gt;
153	CBaseEntity::VPhysicsTakeDamage(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
154	CBaseCombatCharacter::VPhysicsShadowCollision(int,gamevcollisionevent_t *)&lt;br /&gt;
155	CTerrorPlayer::VPhysicsShadowUpdate(IPhysicsObject *)&lt;br /&gt;
156	CBasePlayer::VPhysicsCollision(int,gamevcollisionevent_t *)&lt;br /&gt;
157	CBaseEntity::VPhysicsFriction(IPhysicsObject *,float,int,int)&lt;br /&gt;
158	CBaseEntity::UpdatePhysicsShadowToCurrentPosition(float)&lt;br /&gt;
159	CBaseEntity::VPhysicsGetObjectList(IPhysicsObject **,int)&lt;br /&gt;
160	CBaseEntity::VPhysicsIsFlesh(void)&lt;br /&gt;
161	CBaseEntity::CanPushEntity(CBaseEntity*)const&lt;br /&gt;
162	CBaseEntity::HasPhysicsAttacker(float)&lt;br /&gt;
163	CBasePlayer::PhysicsSolidMaskForEntity(void)const&lt;br /&gt;
164	CBaseEntity::ResolveFlyCollisionCustom(CGameTrace &amp;amp;,Vector &amp;amp;)&lt;br /&gt;
165	CBaseEntity::PerformCustomPhysics(Vector *,Vector *,QAngle *,QAngle *)&lt;br /&gt;
166	CBaseAnimating::GetStepOrigin(void)const&lt;br /&gt;
167	CBaseAnimating::GetStepAngles(void)const&lt;br /&gt;
168	CBaseEntity::ShouldDrawWaterImpacts(void)&lt;br /&gt;
169	CBasePlayer::NetworkStateChanged_m_fFlags(void)&lt;br /&gt;
170	CBasePlayer::NetworkStateChanged_m_fFlags(void *)&lt;br /&gt;
171	CBasePlayer::NetworkStateChanged_m_nWaterLevel(void)&lt;br /&gt;
172	CBasePlayer::NetworkStateChanged_m_nWaterLevel(void *)&lt;br /&gt;
173	CBasePlayer::NetworkStateChanged_m_hGroundEntity(void)&lt;br /&gt;
174	CBasePlayer::NetworkStateChanged_m_hGroundEntity(void *)&lt;br /&gt;
175	CBasePlayer::NetworkStateChanged_m_vecBaseVelocity(void)&lt;br /&gt;
176	CBasePlayer::NetworkStateChanged_m_vecBaseVelocity(void *)&lt;br /&gt;
177	CBasePlayer::NetworkStateChanged_m_flFriction(void)&lt;br /&gt;
178	CBasePlayer::NetworkStateChanged_m_flFriction(void *)&lt;br /&gt;
179	CBasePlayer::NetworkStateChanged_m_vecVelocity(void)&lt;br /&gt;
180	CBasePlayer::NetworkStateChanged_m_vecVelocity(void *)&lt;br /&gt;
181	CBaseEntity::NetworkStateChanged_m_bClientSideRagdoll(void)&lt;br /&gt;
182	CBaseEntity::NetworkStateChanged_m_bClientSideRagdoll(void *)&lt;br /&gt;
183	CBasePlayer::NetworkStateChanged_m_vecViewOffset(void)&lt;br /&gt;
184	CBasePlayer::NetworkStateChanged_m_vecViewOffset(void *)&lt;br /&gt;
185	CBaseAnimating::GetIdealSpeed(void)const&lt;br /&gt;
186	CBaseAnimating::GetIdealAccel(void)const&lt;br /&gt;
187	CBaseAnimatingOverlay::StudioFrameAdvance(void)&lt;br /&gt;
188	CBaseAnimating::OnSequenceSet(int)&lt;br /&gt;
189	CBaseAnimating::IsActivityFinished(void)&lt;br /&gt;
190	CBaseAnimating::GetSequenceGroundSpeed(CStudioHdr *,int)&lt;br /&gt;
191	CBaseAnimating::ClampRagdollForce(Vector  const&amp;amp;,Vector*)&lt;br /&gt;
192	CBaseAnimating::BecomeRagdollOnClient(Vector  const&amp;amp;)&lt;br /&gt;
193	CBaseAnimating::IsRagdoll(void)&lt;br /&gt;
194	CBaseAnimating::CanBecomeRagdoll(void)&lt;br /&gt;
195	CBaseAnimatingOverlay::GetSkeleton(CStudioHdr *,Vector *,QuaternionAligned *,int)&lt;br /&gt;
196	CBaseAnimating::GetBoneTransform(int,matrix3x4_t &amp;amp;)&lt;br /&gt;
197	CBaseAnimating::SetupBones(matrix3x4_t *,int)&lt;br /&gt;
198	CBaseAnimating::CalculateIKLocks(float)&lt;br /&gt;
199	CBaseAnimatingOverlay::DispatchAnimEvents(CBaseAnimating *)&lt;br /&gt;
200	CTerrorPlayer::HandleAnimEvent(animevent_t *)&lt;br /&gt;
201	CBaseAnimating::PopulatePoseParameters(void)&lt;br /&gt;
202	CBaseAnimating::GetAttachment(int,matrix3x4_t &amp;amp;)&lt;br /&gt;
203	CBaseAnimating::InitBoneControllers(void)&lt;br /&gt;
204	CBaseAnimating::GetGroundSpeedVelocity(void)&lt;br /&gt;
205	CBaseAnimating::IsViewModel(void)const&lt;br /&gt;
206	CTerrorPlayer::Ignite(float,bool,float,bool)&lt;br /&gt;
207	CBaseAnimating::IgniteLifetime(float)&lt;br /&gt;
208	CBaseAnimating::IgniteNumHitboxFires(int)&lt;br /&gt;
209	CBaseAnimating::IgniteHitboxFireScale(float)&lt;br /&gt;
210	CTerrorPlayer::Extinguish(void)&lt;br /&gt;
211	CBaseAnimating::SetLightingOrigin(CBaseEntity *)&lt;br /&gt;
212	CBaseFlex::SetViewtarget(Vector  const&amp;amp;)&lt;br /&gt;
213	CBaseFlex::StartSceneEvent(CSceneEventInfo *,CChoreoScene *,CChoreoEvent *,CChoreoActor *,CBaseEntity *)&lt;br /&gt;
214	CBaseFlex::ProcessSceneEvents(void)&lt;br /&gt;
215	CBaseFlex::ProcessSceneEvent(CSceneEventInfo *,CChoreoScene *,CChoreoEvent *)&lt;br /&gt;
216	CBaseFlex::ClearSceneEvent(CSceneEventInfo *,bool,bool)&lt;br /&gt;
217	CBaseFlex::CheckSceneEventCompletion(CSceneEventInfo *,float,CChoreoScene *,CChoreoEvent *)&lt;br /&gt;
218	CTerrorPlayer::PlayScene(char  const*,float,AI_Response *,IRecipientFilter *)&lt;br /&gt;
219	CBaseFlex::PlayAutoGeneratedSoundScene(char  const*)&lt;br /&gt;
220	CBasePlayer::GetPhysicsImpactDamageTable(void)&lt;br /&gt;
221	CBaseCombatCharacter::FInViewCone(CBaseEntity *)&lt;br /&gt;
222	CBaseCombatCharacter::FInViewCone(Vector  const&amp;amp;)&lt;br /&gt;
223	CBaseCombatCharacter::FInAimCone(CBaseEntity *)&lt;br /&gt;
224	CBaseCombatCharacter::FInAimCone(Vector  const&amp;amp;)&lt;br /&gt;
225	CBaseCombatCharacter::ShouldShootMissTarget(CBaseCombatCharacter*)&lt;br /&gt;
226	CBaseCombatCharacter::FindMissTarget(void)&lt;br /&gt;
227	CBaseCombatCharacter::HandleInteraction(int,void *,CBaseCombatCharacter*)&lt;br /&gt;
228	CBasePlayer::BodyAngles(void)&lt;br /&gt;
229	CBaseCombatCharacter::BodyDirection2D(void)&lt;br /&gt;
230	CBaseCombatCharacter::BodyDirection3D(void)&lt;br /&gt;
231	CBaseCombatCharacter::HeadDirection2D(void)&lt;br /&gt;
232	CBaseCombatCharacter::HeadDirection3D(void)&lt;br /&gt;
233	CBaseCombatCharacter::EyeDirection2D(void)&lt;br /&gt;
234	CBaseCombatCharacter::EyeDirection3D(void)&lt;br /&gt;
235	CBaseCombatCharacter::IsHiddenByFog(Vector  const&amp;amp;)const&lt;br /&gt;
236	CBaseCombatCharacter::IsHiddenByFog(CBaseEntity *)const&lt;br /&gt;
237	CBaseCombatCharacter::IsHiddenByFog(float)const&lt;br /&gt;
238	CBaseCombatCharacter::GetFogObscuredRatio(Vector  const&amp;amp;)const&lt;br /&gt;
239	CBaseCombatCharacter::GetFogObscuredRatio(CBaseEntity *)const&lt;br /&gt;
240	CBaseCombatCharacter::GetFogObscuredRatio(float)const&lt;br /&gt;
241	CBaseCombatCharacter::GetFogParams(fogparams_t *)const&lt;br /&gt;
242	CBaseCombatCharacter::IsLookingTowards(CBaseEntity  const*,float)const&lt;br /&gt;
243	CBaseCombatCharacter::IsLookingTowards(Vector  const&amp;amp;,float)const&lt;br /&gt;
244	CBaseCombatCharacter::IsInFieldOfView(CBaseEntity *)const&lt;br /&gt;
245	CBaseCombatCharacter::IsInFieldOfView(Vector  const&amp;amp;)const&lt;br /&gt;
246	CBaseCombatCharacter::IsLineOfSightClear(CBaseEntity *,CBaseCombatCharacter::LineOfSightCheckType)const&lt;br /&gt;
247	CBaseCombatCharacter::IsLineOfSightClear(Vector  const&amp;amp;,CBaseCombatCharacter::LineOfSightCheckType,CBaseEntity *)const&lt;br /&gt;
248	CTerrorPlayer::OnFootstep(Vector  const&amp;amp;,bool,bool,bool,bool)&lt;br /&gt;
249	CCSPlayer::GetGroundSurface(void)const&lt;br /&gt;
250	CTerrorPlayer::GetFootstepSound(char  const*,bool,float,bool)const&lt;br /&gt;
251	CTerrorPlayer::AreFootstepsAudible(void)const&lt;br /&gt;
252	CTerrorPlayer::IsFootstepAudible(float,bool)const&lt;br /&gt;
253	CBaseCombatCharacter::GetFootstepRunThreshold(void)const&lt;br /&gt;
254	CBaseCombatCharacter::GiveAmmo(int,int,bool)&lt;br /&gt;
255	CBaseCombatCharacter::NPC_TranslateActivity(Activity)&lt;br /&gt;
256	CBaseCombatCharacter::Weapon_TranslateActivity(Activity,bool *)&lt;br /&gt;
257	CBaseCombatCharacter::Weapon_FrameUpdate(void)&lt;br /&gt;
258	CBaseCombatCharacter::Weapon_HandleAnimEvent(animevent_t *)&lt;br /&gt;
259	CTerrorPlayer::Weapon_CanUse(CBaseCombatWeapon *)&lt;br /&gt;
260	CTerrorPlayer::Weapon_Equip(CBaseCombatWeapon *)&lt;br /&gt;
261	CBaseCombatCharacter::Weapon_EquipAmmoOnly(CBaseCombatWeapon *)&lt;br /&gt;
262	CBasePlayer::Weapon_Drop(CBaseCombatWeapon *,Vector  const*,Vector  const*)&lt;br /&gt;
263	CCSPlayer::Weapon_Switch(CBaseCombatWeapon *,int)&lt;br /&gt;
264	CTerrorPlayer::Weapon_ShootPosition(void)&lt;br /&gt;
265	CCSPlayer::Weapon_CanSwitchTo(CBaseCombatWeapon *)&lt;br /&gt;
266	CBaseCombatCharacter::Weapon_SlotOccupied(CBaseCombatWeapon *)&lt;br /&gt;
267	CBaseCombatCharacter::Weapon_GetSlot(int)const&lt;br /&gt;
268	CBaseCombatCharacter::AddPlayerItem(CBaseCombatWeapon *)&lt;br /&gt;
269	CBasePlayer::RemovePlayerItem(CBaseCombatWeapon *)&lt;br /&gt;
270	CBaseCombatCharacter::CanBecomeServerRagdoll(void)&lt;br /&gt;
271	CTerrorPlayer::OnTakeDamage_Alive(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
272	CBaseCombatCharacter::OnTakeDamage_Dying(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
273	CBaseCombatCharacter::OnTakeDamage_Dead(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
274	CBaseCombatCharacter::GetAliveDuration(void)const&lt;br /&gt;
275	CBaseCombatCharacter::OnFriendDamaged(CBaseCombatCharacter*,CBaseEntity *)&lt;br /&gt;
276	CBaseCombatCharacter::NotifyFriendsOfDamage(CBaseEntity *)&lt;br /&gt;
277	CBaseCombatCharacter::HasEverBeenInjured(int)const&lt;br /&gt;
278	CBaseCombatCharacter::GetTimeSinceLastInjury(int)const&lt;br /&gt;
279	CBaseCombatCharacter::OnPlayerKilledOther(CBaseEntity *,CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
280	CBaseCombatCharacter::GetDeathActivity(void)&lt;br /&gt;
281	CBaseCombatCharacter::CorpseGib(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
282	CBaseCombatCharacter::CorpseFade(void)&lt;br /&gt;
283	CBaseCombatCharacter::HasHumanGibs(void)&lt;br /&gt;
284	CBaseCombatCharacter::HasAlienGibs(void)&lt;br /&gt;
285	CBaseCombatCharacter::ShouldGib(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
286	CBaseCombatCharacter::OnKilledNPC(CBaseCombatCharacter*)&lt;br /&gt;
287	CBaseCombatCharacter::Event_Gibbed(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
288	CBasePlayer::Event_Dying(void)&lt;br /&gt;
289	CBaseCombatCharacter::BecomeRagdoll(CTakeDamageInfo  const&amp;amp;,Vector  const&amp;amp;)&lt;br /&gt;
290	CBaseCombatCharacter::FixupBurningServerRagdoll(CBaseEntity *)&lt;br /&gt;
291	CBaseCombatCharacter::BecomeRagdollBoogie(CBaseEntity *,Vector  const&amp;amp;,float,int)&lt;br /&gt;
292	CBaseCombatCharacter::CheckTraceHullAttack(float,Vector  const&amp;amp;,Vector  const&amp;amp;,int,int,float,bool)&lt;br /&gt;
293	CBaseCombatCharacter::CheckTraceHullAttack(Vector  const&amp;amp;,Vector  const&amp;amp;,Vector  const&amp;amp;,Vector  const&amp;amp;,int,int,float,bool)&lt;br /&gt;
294	CBaseCombatCharacter::PushawayTouch(CBaseEntity *)&lt;br /&gt;
295	CBaseCombatCharacter::IRelationType(CBaseEntity *)&lt;br /&gt;
296	CBaseCombatCharacter::IRelationPriority(CBaseEntity *)&lt;br /&gt;
297	CBasePlayer::IsInAVehicle(void)const&lt;br /&gt;
298	CBasePlayer::GetVehicle(void)&lt;br /&gt;
299	CBasePlayer::GetVehicleEntity(void)&lt;br /&gt;
300	CBaseCombatCharacter::ExitVehicle(void)&lt;br /&gt;
301	CBaseCombatCharacter::CalcWeaponProficiency(CBaseCombatWeapon *)&lt;br /&gt;
302	CBaseCombatCharacter::GetAttackSpread(CBaseCombatWeapon *,CBaseEntity *)&lt;br /&gt;
303	CBaseCombatCharacter::GetSpreadBias(CBaseCombatWeapon *,CBaseEntity *)&lt;br /&gt;
304	CBasePlayer::DoMuzzleFlash(void)&lt;br /&gt;
305	CBaseCombatCharacter::AddEntityRelationship(CBaseEntity *,Disposition_t,int)&lt;br /&gt;
306	CBaseCombatCharacter::RemoveEntityRelationship(CBaseEntity *)&lt;br /&gt;
307	CBaseCombatCharacter::AddClassRelationship(Class_T,Disposition_t,int)&lt;br /&gt;
308	CBaseCombatCharacter::OnChangeActiveWeapon(CBaseCombatWeapon *,CBaseCombatWeapon *)&lt;br /&gt;
309	CTerrorPlayer::GetLastKnownArea(void)const&lt;br /&gt;
310	CTerrorPlayer::IsAreaTraversable(CNavArea  const*)const&lt;br /&gt;
311	CBaseCombatCharacter::ClearLastKnownArea(void)&lt;br /&gt;
312	CBaseCombatCharacter::UpdateLastKnownArea(void)&lt;br /&gt;
313	CTerrorPlayer::OnNavAreaChanged(CNavArea *,CNavArea *)&lt;br /&gt;
314	CTerrorPlayer::OnNavAreaRemoved(CNavArea *)&lt;br /&gt;
315	CTerrorPlayer::GetClass(void)const&lt;br /&gt;
316	CTerrorPlayer::CanBeA(ZombieClassType)const&lt;br /&gt;
317	CTerrorPlayer::OnPursuedBy(INextBot *)&lt;br /&gt;
318	CTerrorPlayer::IsGhost(void)const&lt;br /&gt;
319	CBasePlayer::NetworkStateChanged_m_iAmmo(void)&lt;br /&gt;
320	CBasePlayer::NetworkStateChanged_m_iAmmo(void *)&lt;br /&gt;
321	CCSPlayer::CreateViewModel(int)&lt;br /&gt;
322	CCSPlayer::SetupVisibility(CBaseEntity *,unsigned char *,int)&lt;br /&gt;
323	CTerrorPlayer::WantsLagCompensationOnEntity(CBaseAnimatingOverlay  const*,CUserCmd  const*,CBitVec&amp;lt;2048&amp;gt;  const*)const&lt;br /&gt;
324	CBasePlayer::SharedSpawn(void)&lt;br /&gt;
325	CBasePlayer::ForceRespawn(void)&lt;br /&gt;
326	CTerrorPlayer::InitialSpawn(void)&lt;br /&gt;
327	CBasePlayer::InitHUD(void)&lt;br /&gt;
328	CCSPlayer::ShowViewPortPanel(char  const*,bool,KeyValues *)&lt;br /&gt;
329	CCSPlayer::PlayerDeathThink(void)&lt;br /&gt;
330	CBasePlayer::Jump(void)&lt;br /&gt;
331	CBasePlayer::Duck(void)&lt;br /&gt;
332	CTerrorPlayer::Cough(CBasePlayer *)&lt;br /&gt;
333	CTerrorPlayer::PreThink(void)&lt;br /&gt;
334	CTerrorPlayer::PostThink(void)&lt;br /&gt;
335	CBasePlayer::DamageEffect(float,int)&lt;br /&gt;
336	CCSPlayer::OnDamagedByExplosion(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
337	CBasePlayer::ShouldFadeOnDeath(void)&lt;br /&gt;
338	CBasePlayer::IsFakeClient(void)const&lt;br /&gt;
339	CTerrorPlayer::GetCharacterDisplayName(void)&lt;br /&gt;
340	CBasePlayer::GetPlayerMins(void)const&lt;br /&gt;
341	CBasePlayer::GetPlayerMaxs(void)const&lt;br /&gt;
342	CTerrorPlayer::UpdateCollisionBounds(void)&lt;br /&gt;
343	CBasePlayer::CalcRoll(QAngle  const&amp;amp;,Vector  const&amp;amp;,float,float)&lt;br /&gt;
344	CBasePlayer::PackDeadPlayerItems(void)&lt;br /&gt;
345	CCSPlayer::RemoveAllItems(bool)&lt;br /&gt;
346	CTerrorPlayer::IsRunning(void)const&lt;br /&gt;
347	CBasePlayer::Weapon_SetLast(CBaseCombatWeapon *)&lt;br /&gt;
348	CBasePlayer::Weapon_ShouldSetLast(CBaseCombatWeapon *,CBaseCombatWeapon *)&lt;br /&gt;
349	CBasePlayer::Weapon_ShouldSelectItem(CBaseCombatWeapon *)&lt;br /&gt;
350	CBasePlayer::UpdateClientData(void)&lt;br /&gt;
351	CBasePlayer::ExitLadder(void)&lt;br /&gt;
352	CBasePlayer::GetLadderSurface(Vector  const&amp;amp;)&lt;br /&gt;
353	CTerrorPlayer::IsAbleToAutoCenterOnLadders(void)const&lt;br /&gt;
354	CBasePlayer::SetFlashlightEnabled(bool)&lt;br /&gt;
355	CCSPlayer::FlashlightIsOn(void)&lt;br /&gt;
356	CTerrorPlayer::FlashlightTurnOn(bool)&lt;br /&gt;
357	CTerrorPlayer::FlashlightTurnOff(bool)&lt;br /&gt;
358	CBasePlayer::IsIlluminatedByFlashlight(CBaseEntity *,float *)&lt;br /&gt;
359	CCSPlayer::UpdateStepSound(surfacedata_t *,Vector  const&amp;amp;,Vector  const&amp;amp;)&lt;br /&gt;
360	CCSPlayer::PlayStepSound(Vector &amp;amp;,surfacedata_t *,float,bool)&lt;br /&gt;
361	CBasePlayer::GetStepSoundVelocities(float *,float *)&lt;br /&gt;
362	CBasePlayer::SetStepSoundTime(stepsoundtimes_t,bool)&lt;br /&gt;
363	CTerrorPlayer::DeathSound(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
364	CCSPlayer::SetAnimation(PLAYER_ANIM)&lt;br /&gt;
365	CTerrorPlayer::OnMainActivityComplete(Activity,Activity)&lt;br /&gt;
366	CTerrorPlayer::OnMainActivityInterrupted(Activity,Activity)&lt;br /&gt;
367	CTerrorPlayer::ImpulseCommands(void)&lt;br /&gt;
368	CTerrorPlayer::CheatImpulseCommands(int)&lt;br /&gt;
369	CTerrorPlayer::ClientCommand(CCommand  const&amp;amp;)&lt;br /&gt;
370	CBasePlayer::StartObserverMode(int)&lt;br /&gt;
371	CBasePlayer::StopObserverMode(void)&lt;br /&gt;
372	CBasePlayer::ModeWantsSpectatorGUI(int)&lt;br /&gt;
373	CTerrorPlayer::SetObserverMode(int)&lt;br /&gt;
374	CBasePlayer::GetObserverMode(void)&lt;br /&gt;
375	CTerrorPlayer::SetObserverTarget(CBaseEntity *)&lt;br /&gt;
376	CBasePlayer::ObserverUse(bool)&lt;br /&gt;
377	CBasePlayer::GetObserverTarget(void)&lt;br /&gt;
378	CTerrorPlayer::FindNextObserverTarget(bool)&lt;br /&gt;
379	CCSPlayer::GetNextObserverSearchStartPoint(bool)&lt;br /&gt;
380	CTerrorPlayer::PassesObserverFilter(CBaseEntity  const*)&lt;br /&gt;
381	CTerrorPlayer::IsValidObserverTarget(CBaseEntity *)&lt;br /&gt;
382	CBasePlayer::CheckObserverSettings(void)&lt;br /&gt;
383	CBasePlayer::JumptoPosition(Vector  const&amp;amp;,QAngle  const&amp;amp;)&lt;br /&gt;
384	CBasePlayer::ForceObserverMode(int)&lt;br /&gt;
385	CCSPlayer::ResetObserverMode(void)&lt;br /&gt;
386	CBasePlayer::ValidateCurrentObserverTarget(void)&lt;br /&gt;
387	CBasePlayer::AttemptToExitFreezeCam(void)&lt;br /&gt;
388	CTerrorPlayer::WantsRoamingObserverMode(void)const&lt;br /&gt;
389	CCSPlayer::StartReplayMode(float,float,int)&lt;br /&gt;
390	CCSPlayer::StopReplayMode(void)&lt;br /&gt;
391	CBasePlayer::GetDelayTicks(void)&lt;br /&gt;
392	CBasePlayer::GetReplayEntity(void)&lt;br /&gt;
393	CBasePlayer::CreateCorpse(void)&lt;br /&gt;
394	CTerrorPlayer::EntSelectSpawnPoint(void)&lt;br /&gt;
395	CBasePlayer::GetInVehicle(IServerVehicle *,int)&lt;br /&gt;
396	CBasePlayer::LeaveVehicle(Vector  const&amp;amp;,QAngle  const&amp;amp;)&lt;br /&gt;
397	CBasePlayer::OnVehicleStart(void)&lt;br /&gt;
398	CBasePlayer::OnVehicleEnd(Vector &amp;amp;)&lt;br /&gt;
399	CTerrorPlayer::BumpWeapon(CBaseCombatWeapon *)&lt;br /&gt;
400	CBasePlayer::SelectLastItem(void)&lt;br /&gt;
401	CBasePlayer::SelectItem(char  const*,int)&lt;br /&gt;
402	CBasePlayer::SelectItem(CBaseCombatWeapon *)&lt;br /&gt;
403	CTerrorPlayer::ItemPostFrame(void)&lt;br /&gt;
404	CTerrorPlayer::GiveNamedItem(char  const*,int,bool)&lt;br /&gt;
405	CBasePlayer::CheckTrainUpdate(void)&lt;br /&gt;
406	CBasePlayer::SetPlayerUnderwater(bool)&lt;br /&gt;
407	CTerrorPlayer::PlayWadeSound(void)&lt;br /&gt;
408	CTerrorPlayer::CanBreatheUnderwater(void)const&lt;br /&gt;
409	CTerrorPlayer::CanRecoverCurrentDrowningDamage(void)const&lt;br /&gt;
410	CTerrorPlayer::PlayerUse(CBaseEntity *)&lt;br /&gt;
411	CCSPlayer::PlayUseDenySound(void)&lt;br /&gt;
412	CTerrorPlayer::FindUseEntity(float,float,bool *)&lt;br /&gt;
413	CTerrorPlayer::IsUseableEntity(CBaseEntity *,unsigned int)&lt;br /&gt;
414	CTerrorPlayer::OnUseEntity(CBaseEntity *,USE_TYPE)&lt;br /&gt;
415	CTerrorPlayer::PickupObject(CBaseEntity *,bool)&lt;br /&gt;
416	CTerrorPlayer::ForceDropOfCarriedPhysObjects(CBaseEntity *)&lt;br /&gt;
417	CTerrorPlayer::GetHeldObjectMass(IPhysicsObject *)&lt;br /&gt;
418	CTerrorPlayer::IsHoldingEntity(CBaseEntity *)&lt;br /&gt;
419	CBasePlayer::UpdateGeigerCounter(void)&lt;br /&gt;
420	CBasePlayer::GetAutoaimVector(float)&lt;br /&gt;
421	CBasePlayer::GetAutoaimVector(float,float)&lt;br /&gt;
422	CBasePlayer::GetAutoaimVector(float,float,float,AimResults *)&lt;br /&gt;
423	CBasePlayer::GetAutoaimVector(autoaim_params_t &amp;amp;)&lt;br /&gt;
424	CBasePlayer::ShouldAutoaim(void)&lt;br /&gt;
425	CBasePlayer::ForceClientDllUpdate(void)&lt;br /&gt;
426	CBasePlayer::ProcessUsercmds(CUserCmd *,int,int,int,bool)&lt;br /&gt;
427	CTerrorPlayer::PlayerRunCommand(CUserCmd *,IMoveHelper *)&lt;br /&gt;
428	CBaseMultiplayerPlayer::CanHearAndReadChatFrom(CBasePlayer *)&lt;br /&gt;
429	CBaseMultiplayerPlayer::CanSpeak(void)&lt;br /&gt;
430	CCSPlayer::ModifyOrAppendPlayerCriteria(AI_CriteriaSet &amp;amp;)&lt;br /&gt;
431	CTerrorPlayer::CheckChatText(char *,int)&lt;br /&gt;
432	CBasePlayer::CreateRagdollEntity(void)&lt;br /&gt;
433	CBasePlayer::ShouldAnnounceAchievement(void)&lt;br /&gt;
434	CBasePlayer::EnsureSplitScreenTeam(void)&lt;br /&gt;
435	CBasePlayer::ForceChangeTeam(int)&lt;br /&gt;
436	CBasePlayer::IsFollowingPhysics(void)&lt;br /&gt;
437	CTerrorPlayer::InitVCollision(Vector  const&amp;amp;,Vector  const&amp;amp;)&lt;br /&gt;
438	CBasePlayer::UpdatePhysicsShadowToCurrentPosition(void)&lt;br /&gt;
439	CBasePlayer::Hints(void)&lt;br /&gt;
440	CBasePlayer::IsReadyToPlay(void)&lt;br /&gt;
441	CBasePlayer::IsReadyToSpawn(void)&lt;br /&gt;
442	CBasePlayer::ShouldGainInstantSpawn(void)&lt;br /&gt;
443	CBasePlayer::ResetPerRoundStats(void)&lt;br /&gt;
444	CBasePlayer::ResetScores(void)&lt;br /&gt;
445	CBasePlayer::EquipSuit(bool)&lt;br /&gt;
446	CBasePlayer::RemoveSuit(void)&lt;br /&gt;
447	CTerrorPlayer::OnUseEntityChanged(void)&lt;br /&gt;
448	CBasePlayer::CommitSuicide(bool,bool)&lt;br /&gt;
449	CBasePlayer::CommitSuicide(Vector  const&amp;amp;,bool,bool)&lt;br /&gt;
450	CBasePlayer::IsBot(void)const&lt;br /&gt;
451	CBaseMultiplayerPlayer::GetExpresser(void)&lt;br /&gt;
452	CCSPlayer::SpawnArmorValue(void)const&lt;br /&gt;
453	CTerrorPlayer::UpdateTonemapController(void)&lt;br /&gt;
454	CCSPlayer::NetworkStateChanged_m_ArmorValue(void)&lt;br /&gt;
455	CCSPlayer::NetworkStateChanged_m_ArmorValue(void *)&lt;br /&gt;
456	CTerrorPlayer::IsAutoCrouched(void)const&lt;br /&gt;
457	CTerrorPlayer::GetAvailableSteadyStateSlots(void)&lt;br /&gt;
458	CTerrorPlayer::OnSpeak(CBasePlayer *,char  const*,float)&lt;br /&gt;
459	CTerrorPlayer::OnVoiceTransmit(void)&lt;br /&gt;
460	CTerrorPlayer::PlayerSolidMask(bool)const&lt;br /&gt;
461	CAI_ExpresserHost&amp;lt;CBasePlayer&amp;gt;::NoteSpeaking(float,float)&lt;br /&gt;
462	CAI_ExpresserHost&amp;lt;CBasePlayer&amp;gt;::Speak(CAI_Concept,char  const*,char *,unsigned int,IRecipientFilter *)&lt;br /&gt;
463	CAI_ExpresserHost&amp;lt;CBasePlayer&amp;gt;::Speak(CAI_Concept,AI_CriteriaSet *,char *,unsigned int,IRecipientFilter *)&lt;br /&gt;
464	CAI_ExpresserHost&amp;lt;CBasePlayer&amp;gt;::PostSpeakDispatchResponse(CAI_Concept,AI_Response *)&lt;br /&gt;
465	CTerrorPlayer::SpeakIfAllowed(CAI_Concept,SpeechPriorityType,char  const*,char *,unsigned int,IRecipientFilter *)&lt;br /&gt;
466	CBaseMultiplayerPlayer::SpeakConceptIfAllowed(int,char  const*,char *,unsigned int,IRecipientFilter *)&lt;br /&gt;
467	CBaseMultiplayerPlayer::CanSpeakVoiceCommand(void)&lt;br /&gt;
468	CBaseMultiplayerPlayer::ShouldShowVoiceSubtitleToEnemy(void)&lt;br /&gt;
469	CBaseMultiplayerPlayer::NoteSpokeVoiceCommand(char  const*)&lt;br /&gt;
470	CBaseMultiplayerPlayer::GetMultiplayerExpresser(void)&lt;br /&gt;
471	CBaseMultiplayerPlayer::CalculateTeamBalanceScore(void)&lt;br /&gt;
472	CBaseMultiplayerPlayer::CreateExpresser(void)&lt;br /&gt;
473	CCSPlayer::FirePlayerHurtEvent(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
474	CTerrorPlayer::OnTakeDamageInternal(CTakeDamageInfo &amp;amp;)&lt;br /&gt;
475	CTerrorPlayer::AllowDamage(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
476	CTerrorPlayer::GetHealthBuffer(void)const&lt;br /&gt;
477	CTerrorPlayer::IsIncapacitated(void)const&lt;br /&gt;
478	CTerrorPlayer::GetAdjustedDamage(CTakeDamageInfo  const&amp;amp;,float,float,bool)&lt;br /&gt;
479	CTerrorPlayer::DoBloodEffect(float,CTakeDamageInfo  const&amp;amp;,Vector  const&amp;amp;,CGameTrace *)&lt;br /&gt;
480	CCSPlayer::GiveNamedItem(char  const*,int)&lt;br /&gt;
481	CCSPlayer::IsBeingGivenItem(void)const&lt;br /&gt;
482	CTerrorPlayer::DoAnimationEvent(PlayerAnimEvent_t,int)&lt;br /&gt;
483	CCSPlayer::CSAnim_GetActiveWeapon(void)&lt;br /&gt;
484	CCSPlayer::CSAnim_CanMove(void)&lt;br /&gt;
485	CTerrorPlayer::KickBack(float,float,float,float,float,float,int)&lt;br /&gt;
486	CTerrorPlayer::IsImmobilized(void)const&lt;br /&gt;
487	CTerrorPlayer::GiveDefaultItems(void)&lt;br /&gt;
488	CTerrorPlayer::RoundRespawn(void)&lt;br /&gt;
489	CTerrorPlayer::ObserverRoundRespawn(void)&lt;br /&gt;
490	CCSPlayer::Blind(float,float,float)&lt;br /&gt;
491	CTerrorPlayer::Deafen(float,float,float)&lt;br /&gt;
492	CTerrorPlayer::ResetMaxSpeed(void)&lt;br /&gt;
493	CCSPlayer::HandleCommand_JoinClass(int)&lt;br /&gt;
494	CTerrorPlayer::HandleCommand_JoinTeam(int,char  const*,bool)&lt;br /&gt;
495	CTerrorPlayer::GetIntoGame(void)&lt;br /&gt;
496	CTerrorPlayer::WantsMOTD(void)const&lt;br /&gt;
497	CTerrorPlayer::AutoSelectTeam(void)&lt;br /&gt;
498	CTerrorPlayer::OnLeaveActiveState(void)&lt;br /&gt;
499	CTerrorPlayer::Pain(bool)&lt;br /&gt;
500	CTerrorPlayer::OnTeamChanged(int)&lt;br /&gt;
501	CTerrorPlayer::CanAttack(void)const&lt;br /&gt;
502	CTerrorPlayer::OnWeaponFired(void)&lt;br /&gt;
503	CTerrorPlayer::OnHitPlayer(int,float,float,int)&lt;br /&gt;
504	CTerrorPlayer::OnReloadStart(bool,int,bool)&lt;br /&gt;
505	CTerrorPlayer::CreateNoise(float)&lt;br /&gt;
506	CTerrorPlayer::OnPreThinkObserverMode(void)&lt;br /&gt;
507	CTerrorPlayer::OnEnterRescueState(void)&lt;br /&gt;
508	CTerrorPlayer::OnPreThinkRescueState(void)&lt;br /&gt;
509	CTerrorPlayer::OnLeaveRescueState(void)&lt;br /&gt;
510	CTerrorPlayer::OnEnterGhostState(void)&lt;br /&gt;
511	CTerrorPlayer::OnPreThinkGhostState(void)&lt;br /&gt;
512	CTerrorPlayer::OnLeaveGhostState(void)&lt;br /&gt;
513	CTerrorPlayer::OnEnterIntroCameraState(void)&lt;br /&gt;
514	CTerrorPlayer::OnPreThinkIntroCameraState(void)&lt;br /&gt;
515	CTerrorPlayer::OnLeaveIntroCameraState(void)&lt;br /&gt;
516	CTerrorPlayer::OnLeaveDeathAnimState(void)&lt;br /&gt;
517	CTerrorPlayer::OnLeaveDeathWaitForKeyState(void)&lt;br /&gt;
518	CTerrorPlayer::CanUseFlashlight(void)const&lt;br /&gt;
519	CTerrorPlayer::UpdateAddonBits(void)&lt;br /&gt;
520	CTerrorPlayer::UpdateRadar(void)&lt;br /&gt;
521	CTerrorPlayer::SelectDeathPose(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
522	CTerrorPlayer::CanChangeName(void)const&lt;br /&gt;
523	CTerrorPlayer::ChangeName(char  const*)&lt;br /&gt;
524	CTerrorPlayer::IsProgressBarActive(void)const&lt;br /&gt;
525	CTerrorPlayer::CreateRagdollEntity(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
526	CTerrorPlayer::GetRagdollType(void)const&lt;br /&gt;
527	CTerrorPlayer::SetModelFromClass(void)&lt;br /&gt;
528	CTerrorPlayer::SetModelFromClassAtSpawn(void)&lt;br /&gt;
529	CTerrorPlayer::DropWeapons(bool)&lt;br /&gt;
530	CTerrorPlayer::RecordDamageTaken(char  const*,int)&lt;br /&gt;
531	CTerrorPlayer::OnPlayerDisconnected(CTerrorPlayer*)&lt;br /&gt;
532	CTerrorPlayer::OnSpawn(void)&lt;br /&gt;
533	CTerrorPlayer::RestoreSpawn(void)&lt;br /&gt;
534	CTerrorPlayer::OnBeginChangeLevel(char  const*,KeyValues *)&lt;br /&gt;
535	CTerrorPlayer::OnEndChangeLevel(void)&lt;br /&gt;
536	CTerrorPlayer::SetDoingRestore(bool)&lt;br /&gt;
537	CTerrorPlayer::GetTeamSwitchRule(void)const&lt;br /&gt;
538	CTerrorPlayer::IsReadyToShove(void)&lt;br /&gt;
539	CTerrorPlayer::SetNextShoveTime(float)&lt;br /&gt;
540	CTerrorPlayer::CommitSuicide(bool)&lt;br /&gt;
541	CTerrorPlayer::OnSpokeConcept(CAI_Concept,AI_Response *)&lt;br /&gt;
542	CTerrorPlayer::RestoreWeapons(void)&lt;br /&gt;
543	CTerrorPlayer::OnReloadEnd(void)&lt;br /&gt;
544	CTerrorPlayer::OnReloadAbort(void)&lt;br /&gt;
545	CTerrorPlayer::OnAttackSuccess(CBaseCombatCharacter *,bool)&lt;br /&gt;
546	CTerrorPlayer::IsWielding(CSWeaponID)const&lt;br /&gt;
547	CTerrorPlayer::IsZoomed(void)&lt;br /&gt;
548	CTerrorPlayer::CanPlayerJump(void)const&lt;br /&gt;
549	CTerrorPlayer::CanHearChatFrom(CBasePlayer *)&lt;br /&gt;
550	CTerrorPlayer::PlayerZombieAbortControl(void)&lt;br /&gt;
551	CTerrorPlayer::CanBeShoved(void)&lt;br /&gt;
552	CTerrorPlayer::SetClass(ZombieClassType)&lt;br /&gt;
553	CTerrorPlayer::SetCharacter(void)&lt;br /&gt;
554	CTerrorPlayer::OnRevived(void)&lt;br /&gt;
555	CTerrorPlayer::OnAwardEarned(AwardType,CBaseEntity *)&lt;br /&gt;
556	CTerrorPlayer::OnAwardLost(AwardType)&lt;br /&gt;
557	CTerrorPlayer::ScoreKilledZombie(ZombieClassType)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Adding_Admins_(SourceMod)&amp;diff=6783</id>
		<title>Adding Admins (SourceMod)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Adding_Admins_(SourceMod)&amp;diff=6783"/>
		<updated>2009-01-02T06:38:53Z</updated>

		<summary type="html">&lt;p&gt;DS: /* Simple Admins */ Fixed a couple flag inconsistencies in the examples&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__&lt;br /&gt;
SourceMod has as very detailed and flexible administration system, and it can be quite daunting to users.  To simplify things, there are a number of &amp;quot;flags&amp;quot; which specify generic permissions administrators can have.&lt;br /&gt;
&lt;br /&gt;
Aside from that, there are (currently) two provided ways of storing admins.  One via a simplified flat file, and another via a more complex tree-based file.&lt;br /&gt;
&lt;br /&gt;
SourceMod provides three methods of authentication by default:&lt;br /&gt;
*''Steam ID'' (unique to a Steam account)&lt;br /&gt;
*''IP Address'' (semi-unique to a given computer, better for LANs)&lt;br /&gt;
*''Name'' (requires a password)&lt;br /&gt;
&lt;br /&gt;
=Levels=&lt;br /&gt;
First, let's quickly run down the provided levels:&lt;br /&gt;
:{| cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
|- class=&amp;quot;t2th&amp;quot;&lt;br /&gt;
| Name&lt;br /&gt;
| Flag&lt;br /&gt;
| Purpose&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| reservation&lt;br /&gt;
| a&lt;br /&gt;
| Reserved slot access.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| generic&lt;br /&gt;
| b&lt;br /&gt;
| Generic admin; required for admins.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| kick&lt;br /&gt;
| c&lt;br /&gt;
| Kick other players.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| ban&lt;br /&gt;
| d&lt;br /&gt;
| Ban other players.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| unban&lt;br /&gt;
| e&lt;br /&gt;
| Remove bans.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| slay&lt;br /&gt;
| f&lt;br /&gt;
| Slay/harm other players.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| changemap&lt;br /&gt;
| g&lt;br /&gt;
| Change the map or major gameplay features.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| cvar&lt;br /&gt;
| h&lt;br /&gt;
| Change most cvars.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| config&lt;br /&gt;
| i&lt;br /&gt;
| Execute config files.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| chat&lt;br /&gt;
| j&lt;br /&gt;
| Special chat privileges.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| vote&lt;br /&gt;
| k&lt;br /&gt;
| Start or create votes.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| password&lt;br /&gt;
| l&lt;br /&gt;
| Set a password on the server.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| rcon&lt;br /&gt;
| m&lt;br /&gt;
| Use RCON commands.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| cheats&lt;br /&gt;
| n&lt;br /&gt;
| Change sv_cheats or use cheating commands.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| root&lt;br /&gt;
| z&lt;br /&gt;
| Magically enables all flags.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Immunity=&lt;br /&gt;
In SourceMod, immunity is a flexible system based on ''immunity levels''.  Every admin can have an arbitrary immunity value assigned to them.  Whether an admin can target another admin depends on who has a higher immunity value.&lt;br /&gt;
&lt;br /&gt;
For example, say Admin #1 has an immunity level of &amp;quot;3&amp;quot; and Admin #2 has an immunity level of &amp;quot;10.&amp;quot;  Admin #2 can target Admin #1, but Admin #1 cannot target Admin #2.  The numbers are completely arbitrary, and they can be any number equal to or higher than 0.  Note that 0 always implies no immunity.&lt;br /&gt;
&lt;br /&gt;
By default, admins with the same immunity value can target each other.  This can be changed via &amp;lt;tt&amp;gt;sm_immunity_mode&amp;lt;/tt&amp;gt; in &amp;lt;tt&amp;gt;cfg/sourcemod.cfg&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Passwords=&lt;br /&gt;
For passwords to work, the server administrator must change the &amp;quot;PassInfoVar&amp;quot; line in &amp;lt;tt&amp;gt;addons/sourcemod/configs/core.cfg&amp;lt;/tt&amp;gt;.  For example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;PassInfoVar&amp;quot;			&amp;quot;_sm1337&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, if an admin has a password, he or she must set the password via the ''setinfo'' command in the client console.   For example, using the examples above, &amp;lt;tt&amp;gt;BAILOPAN&amp;lt;/tt&amp;gt; would need to type:&lt;br /&gt;
&amp;lt;pre&amp;gt;setinfo &amp;quot;_sm1337&amp;quot; &amp;quot;Gab3n&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To automate this upon connecting to a server, you can create an &amp;quot;autoexec.cfg&amp;quot; file in your client &amp;lt;tt&amp;gt;cstrike&amp;lt;/tt&amp;gt; folder.  This will be located under &amp;lt;tt&amp;gt;SteamApps\ACCOUNT\Counter-Strike Source\cstrike\cfg&amp;lt;/tt&amp;gt;.  For example:&lt;br /&gt;
*&amp;lt;tt&amp;gt;C:\program files\steam\steamapps\bailopan\counter-strike source\cstrike\cfg&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also set the password upon connecting.  For steam and IP authentication, your admin privileges will be automatically assigned if the password is correct.  For name based authentication, your password must be correct before you change your name, or else you will be kicked from the server.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Simple Admins=&lt;br /&gt;
The easiest way to add administrators is through &amp;lt;tt&amp;gt;configs/admins_simple.ini&amp;lt;/tt&amp;gt;.  This is a flat file which requires two parameters per line: authentication info, and flags.  The flag string is somewhat flexible and can have the following information:&lt;br /&gt;
*An optional immunity level value, followed by a colon (':');&lt;br /&gt;
*A flag string, '''or''';&lt;br /&gt;
*A group name, preceded by an '@' symbol&lt;br /&gt;
&lt;br /&gt;
Three examples are provided:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;STEAM_0:1:16&amp;quot;		&amp;quot;bce&amp;quot;			//generic, kick, unban for this steam ID.  no immunity&lt;br /&gt;
&amp;quot;!127.0.0.1&amp;quot;		&amp;quot;5:z&amp;quot;			//all permissions for this ip, immunity level = 5&lt;br /&gt;
&amp;quot;BAILOPAN&amp;quot;		&amp;quot;abc&amp;quot;	&amp;quot;Gab3n&amp;quot;		//name BAILOPAN, password &amp;quot;Gab3n&amp;quot;: gets reservation, generic, kick&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Detailed Admins=&lt;br /&gt;
Alternatively, you can add admins via &amp;lt;tt&amp;gt;configs/admins.cfg&amp;lt;/tt&amp;gt;, a more advanced file stored in a KeyValues format.  Each admin is its own block inside a main &amp;quot;Admin&amp;quot; block.  The format is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Admins&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;Admin Name&amp;quot;&lt;br /&gt;
	{&lt;br /&gt;
		&amp;quot;auth&amp;quot;		&amp;quot;[steam|name|ip]&amp;quot;&lt;br /&gt;
		&amp;quot;identity&amp;quot;	&amp;quot;[unique id]&amp;quot;&lt;br /&gt;
		&amp;quot;[option1]&amp;quot;	&amp;quot;[value1]&amp;quot;&lt;br /&gt;
		&amp;quot;[option2]&amp;quot;	&amp;quot;[value2]&amp;quot;&lt;br /&gt;
		/* .... */&lt;br /&gt;
	}&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Available options are:&lt;br /&gt;
*&amp;lt;tt&amp;gt;auth&amp;lt;/tt&amp;gt;: Required.  Must be one of &amp;lt;tt&amp;gt;steam&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt;, or &amp;lt;tt&amp;gt;ip&amp;lt;/tt&amp;gt; (unless there is a custom auth method), and instructs SourceMod how to interpret the &amp;lt;tt&amp;gt;identity&amp;lt;/tt&amp;gt; value.&lt;br /&gt;
*&amp;lt;tt&amp;gt;identity&amp;lt;/tt&amp;gt;: Required.  Unique value that allows SourceMod to find this admin given an authentication method and the given value.&lt;br /&gt;
*&amp;lt;tt&amp;gt;password&amp;lt;/tt&amp;gt;: Optional.  Specifies the password the user must enter (see above section on passwords).&lt;br /&gt;
*&amp;lt;tt&amp;gt;group&amp;lt;/tt&amp;gt;: Optional.  Specifies a group name the user should inherit if available.  More than one &amp;quot;group&amp;quot; line can be specified.  There should be no '@' symbol as there is no ambiguity.&lt;br /&gt;
*&amp;lt;tt&amp;gt;flags&amp;lt;/tt&amp;gt;: Optional.  Default access flags the user should receive.&lt;br /&gt;
*&amp;lt;tt&amp;gt;immunity&amp;lt;/tt&amp;gt;: Optional:  Default immunity level the user should receive.&lt;br /&gt;
&lt;br /&gt;
The admin name is optional (it can be blank).  It is not used internally and is intended for convenience usage by 3rd party tools.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;Admins&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;BAILOPAN&amp;quot;&lt;br /&gt;
	{&lt;br /&gt;
		&amp;quot;auth&amp;quot;		&amp;quot;steam&amp;quot;&lt;br /&gt;
		&amp;quot;identity&amp;quot;	&amp;quot;STEAM_0:1:2345&amp;quot;&lt;br /&gt;
		&amp;quot;flags&amp;quot;		&amp;quot;abcdef&amp;quot;&lt;br /&gt;
		&amp;quot;immunity&amp;quot;	&amp;quot;5&amp;quot;&lt;br /&gt;
		&amp;quot;group&amp;quot;		&amp;quot;Awesome Admins&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&amp;quot;Blue Crab&amp;quot;&lt;br /&gt;
	{&lt;br /&gt;
		&amp;quot;auth&amp;quot;		&amp;quot;steam&amp;quot;&lt;br /&gt;
		&amp;quot;identity&amp;quot;	&amp;quot;STEAM_0:1:666666&amp;quot;&lt;br /&gt;
		&amp;quot;flags&amp;quot;		&amp;quot;z&amp;quot;&lt;br /&gt;
		&amp;quot;immunity&amp;quot;	&amp;quot;99&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=See Also=&lt;br /&gt;
*[[Adding Groups (SourceMod)]]&lt;br /&gt;
*[[Overriding Command Access (SourceMod)]]&lt;br /&gt;
&lt;br /&gt;
[[Category:SourceMod Documentation]]&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=CTFPlayer_Offset_List_(Team_Fortress_2)&amp;diff=6564</id>
		<title>CTFPlayer Offset List (Team Fortress 2)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=CTFPlayer_Offset_List_(Team_Fortress_2)&amp;diff=6564"/>
		<updated>2008-12-12T20:26:01Z</updated>

		<summary type="html">&lt;p&gt;DS: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Also for use when using [[Virtual Offsets (Source Mods)|virtual offsets]].&lt;br /&gt;
&lt;br /&gt;
These are the &amp;lt;b&amp;gt;Windows&amp;lt;/b&amp;gt; offsets. &amp;lt;b&amp;gt;Linux offsets are 1 greater.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The List ==&lt;br /&gt;
This comes from the symbol tables, so you'll have to look in the SDK for return types.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Last Updated 12 December 2008&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Auto reconstructed from vtable block @ 0x00D3D380&lt;br /&gt;
// from &amp;quot;server_i486.so&amp;quot;, by ida_vtables.idc&lt;br /&gt;
0	CTFPlayer::~CTFPlayer()&lt;br /&gt;
1	CBaseEntity::SetRefEHandle(CBaseHandle  const&amp;amp;)&lt;br /&gt;
2	CBaseEntity::GetRefEHandle(void)const&lt;br /&gt;
3	CBaseEntity::GetCollideable(void)&lt;br /&gt;
4	CBaseEntity::GetNetworkable(void)&lt;br /&gt;
5	CBaseEntity::GetBaseEntity(void)&lt;br /&gt;
6	CBaseEntity::GetModelIndex(void)const&lt;br /&gt;
7	CBaseEntity::GetModelName(void)const&lt;br /&gt;
8	CBaseEntity::SetModelIndex(int)&lt;br /&gt;
9	CTFPlayer::GetServerClass(void)&lt;br /&gt;
10	CTFPlayer::YouForgotToImplementOrDeclareServerClass(void)&lt;br /&gt;
11	CTFPlayer::GetDataDescMap(void)&lt;br /&gt;
12	CBaseAnimating::TestCollision(Ray_t  const&amp;amp;,unsigned int,CGameTrace &amp;amp;)&lt;br /&gt;
13	CBaseAnimating::TestHitboxes(Ray_t  const&amp;amp;,unsigned int,CGameTrace &amp;amp;)&lt;br /&gt;
14	CBaseEntity::ComputeWorldSpaceSurroundingBox(Vector *,Vector *)&lt;br /&gt;
15	CTFPlayer::ShouldCollide(int,int)const&lt;br /&gt;
16	CBaseEntity::SetOwnerEntity(CBaseEntity*)&lt;br /&gt;
17	CBasePlayer::ShouldTransmit(CCheckTransmitInfo  const*)&lt;br /&gt;
18	CBasePlayer::UpdateTransmitState(void)&lt;br /&gt;
19	CBaseCombatCharacter::SetTransmit(CCheckTransmitInfo *,bool)&lt;br /&gt;
20	CBasePlayer::GetTracerType(void)&lt;br /&gt;
21	CTFPlayer::Spawn(void)&lt;br /&gt;
22	CTFPlayer::Precache(void)&lt;br /&gt;
23	CBasePlayer::SetModel(char  const*)&lt;br /&gt;
24	CBaseMultiplayerPlayer::PostConstructor(char  const*)&lt;br /&gt;
25	CBaseEntity::PostClientActive(void)&lt;br /&gt;
26	CBaseEntity::ParseMapData(CEntityMapData *)&lt;br /&gt;
27	CBaseEntity::KeyValue(char  const*,char  const*)&lt;br /&gt;
28	CBaseEntity::KeyValue(char  const*,float)&lt;br /&gt;
29	CBaseEntity::KeyValue(char  const*,Vector  const&amp;amp;)&lt;br /&gt;
30	CBaseEntity::GetKeyValue(char  const*,char *,int)&lt;br /&gt;
31	CBasePlayer::Activate(void)&lt;br /&gt;
32	CBaseEntity::SetParent(CBaseEntity*,int)&lt;br /&gt;
33	CBasePlayer::ObjectCaps(void)&lt;br /&gt;
34	CBaseEntity::AcceptInput(char  const*,CBaseEntity*,CBaseEntity*,variant_t,int)&lt;br /&gt;
35	CBaseAnimating::GetInputDispatchEffectPosition(char  const*,Vector &amp;amp;,QAngle &amp;amp;)&lt;br /&gt;
36	CBasePlayer::DrawDebugGeometryOverlays(void)&lt;br /&gt;
37	CTFPlayer::DrawDebugTextOverlays(void)&lt;br /&gt;
38	CBasePlayer::Save(ISave &amp;amp;)&lt;br /&gt;
39	CBasePlayer::Restore(IRestore &amp;amp;)&lt;br /&gt;
40	CBasePlayer::ShouldSavePhysics(void)&lt;br /&gt;
41	CBaseEntity::OnSave(IEntitySaveUtils *)&lt;br /&gt;
42	CBasePlayer::OnRestore(void)&lt;br /&gt;
43	CBasePlayer::RequiredEdictIndex(void)&lt;br /&gt;
44	CBaseEntity::MoveDone(void)&lt;br /&gt;
45	CBaseEntity::Think(void)&lt;br /&gt;
46	CBasePlayer::NetworkStateChanged_m_nNextThinkTick(void)&lt;br /&gt;
47	CBasePlayer::NetworkStateChanged_m_nNextThinkTick(void *)&lt;br /&gt;
48	CBaseAnimating::GetBaseAnimating(void)&lt;br /&gt;
49	CTFPlayer::GetResponseSystem(void)&lt;br /&gt;
50	CAI_ExpresserHost&amp;lt;CBasePlayer&amp;gt;::DispatchResponse(char  const*)&lt;br /&gt;
51	CBasePlayer::Classify(void)&lt;br /&gt;
52	CBaseEntity::DeathNotice(CBaseEntity*)&lt;br /&gt;
53	CBaseEntity::ShouldAttractAutoAim(CBaseEntity*)&lt;br /&gt;
54	CBaseEntity::GetAutoAimRadius(void)&lt;br /&gt;
55	CBaseEntity::GetAutoAimCenter(void)&lt;br /&gt;
56	CBaseEntity::GetBeamTraceFilter(void)&lt;br /&gt;
57	CBaseEntity::PassesDamageFilter(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
58	CTFPlayer::TraceAttack(CTakeDamageInfo  const&amp;amp;,Vector  const&amp;amp;,CGameTrace *)&lt;br /&gt;
59	CBaseEntity::CanBeHitByMeleeAttack(CBaseEntity*)&lt;br /&gt;
60	CTFPlayer::OnTakeDamage(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
61	CTFPlayer::TakeHealth(float,int)&lt;br /&gt;
62	CBaseEntity::IsAlive(void)&lt;br /&gt;
63	CTFPlayer::Event_Killed(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
64	CTFPlayer::Event_KilledOther(CBaseEntity *,CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
65	CBaseCombatCharacter::BloodColor(void)&lt;br /&gt;
66	CBaseEntity::IsTriggered(CBaseEntity*)&lt;br /&gt;
67	CBaseEntity::IsNPC(void)const&lt;br /&gt;
68	CBaseCombatCharacter::MyCombatCharacterPointer(void)&lt;br /&gt;
69	CBaseEntity::GetDelay(void)&lt;br /&gt;
70	CBaseEntity::IsMoving(void)&lt;br /&gt;
71	CBaseEntity::DamageDecal(int,int)&lt;br /&gt;
72	CBaseEntity::DecalTrace(CGameTrace *,char  const*)&lt;br /&gt;
73	CBaseEntity::ImpactTrace(CGameTrace *,int,char *)&lt;br /&gt;
74	CBaseEntity::OnControls(CBaseEntity*)&lt;br /&gt;
75	CBaseEntity::HasTarget(string_t)&lt;br /&gt;
76	CBasePlayer::IsPlayer(void)const&lt;br /&gt;
77	CBasePlayer::IsNetClient(void)const&lt;br /&gt;
78	CBaseEntity::IsTemplate(void)&lt;br /&gt;
79	CBaseEntity::IsBaseObject(void)const&lt;br /&gt;
80	CBaseEntity::IsBaseTrain(void)const&lt;br /&gt;
81	CBaseEntity::GetServerVehicle(void)&lt;br /&gt;
82	CBaseEntity::IsViewable(void)&lt;br /&gt;
83	CTFPlayer::ChangeTeam(int)&lt;br /&gt;
84	CBaseEntity::OnEntityEvent(EntityEvent_t,void *)&lt;br /&gt;
85	CBaseEntity::CanStandOn(CBaseEntity*)const&lt;br /&gt;
86	CBaseEntity::CanStandOn(edict_t *)const&lt;br /&gt;
87	CBaseEntity::GetEnemy(void)&lt;br /&gt;
88	CBaseEntity::GetEnemy(void)const&lt;br /&gt;
89	CBaseEntity::Use(CBaseEntity*,CBaseEntity*,USE_TYPE,float)&lt;br /&gt;
90	CBaseEntity::StartTouch(CBaseEntity*)&lt;br /&gt;
91	CTFPlayer::Touch(CBaseEntity *)&lt;br /&gt;
92	CBaseEntity::EndTouch(CBaseEntity*)&lt;br /&gt;
93	CBaseEntity::StartBlocked(CBaseEntity*)&lt;br /&gt;
94	CBaseEntity::Blocked(CBaseEntity*)&lt;br /&gt;
95	CBaseEntity::EndBlocked(void)&lt;br /&gt;
96	CBasePlayer::PhysicsSimulate(void)&lt;br /&gt;
97	CBasePlayer::UpdateOnRemove(void)&lt;br /&gt;
98	CBaseEntity::StopLoopingSounds(void)&lt;br /&gt;
99	CBaseEntity::SUB_AllowedToFade(void)&lt;br /&gt;
100	CBaseFlex::Teleport(Vector  const*,QAngle  const*,Vector  const*)&lt;br /&gt;
101	CBaseEntity::NotifySystemEvent(CBaseEntity*,notify_system_event_t,notify_system_event_params_t  const&amp;amp;)&lt;br /&gt;
102	CBasePlayer::MakeTracer(Vector  const&amp;amp;,CGameTrace  const&amp;amp;,int)&lt;br /&gt;
103	CBaseEntity::GetTracerAttachment(void)&lt;br /&gt;
104	CBaseEntity::FireBullets(FireBulletsInfo_t  const&amp;amp;)&lt;br /&gt;
105	CBasePlayer::DoImpactEffect(CGameTrace &amp;amp;,int)&lt;br /&gt;
106	CBaseEntity::Respawn(void)&lt;br /&gt;
107	CBaseEntity::IsLockedByMaster(void)&lt;br /&gt;
108	CTFPlayer::GetMaxHealth(void)const&lt;br /&gt;
109	CTFPlayer::ModifyOrAppendCriteria(AI_CriteriaSet &amp;amp;)&lt;br /&gt;
110	CBaseEntity::NetworkStateChanged_m_iMaxHealth(void)&lt;br /&gt;
111	CBaseEntity::NetworkStateChanged_m_iMaxHealth(void *)&lt;br /&gt;
112	CBasePlayer::NetworkStateChanged_m_iHealth(void)&lt;br /&gt;
113	CBasePlayer::NetworkStateChanged_m_iHealth(void *)&lt;br /&gt;
114	CBasePlayer::NetworkStateChanged_m_lifeState(void)&lt;br /&gt;
115	CBasePlayer::NetworkStateChanged_m_lifeState(void *)&lt;br /&gt;
116	CBaseEntity::NetworkStateChanged_m_takedamage(void)&lt;br /&gt;
117	CBaseEntity::NetworkStateChanged_m_takedamage(void *)&lt;br /&gt;
118	CBaseEntity::GetDamageType(void)const&lt;br /&gt;
119	CBaseEntity::GetDamage(void)&lt;br /&gt;
120	CBaseEntity::SetDamage(float)&lt;br /&gt;
121	CBasePlayer::EyePosition(void)&lt;br /&gt;
122	CBasePlayer::EyeAngles(void)&lt;br /&gt;
123	CBasePlayer::LocalEyeAngles(void)&lt;br /&gt;
124	CBaseEntity::EarPosition(void)&lt;br /&gt;
125	CBasePlayer::BodyTarget(Vector  const&amp;amp;,bool)&lt;br /&gt;
126	CBaseEntity::HeadTarget(Vector  const&amp;amp;)&lt;br /&gt;
127	CBaseEntity::GetVectors(Vector *,Vector *,Vector *)const&lt;br /&gt;
128	CBaseEntity::GetViewOffset(void)&lt;br /&gt;
129	CBasePlayer::GetSmoothedVelocity(void)&lt;br /&gt;
130	CBaseAnimating::GetVelocity(Vector *,Vector *)&lt;br /&gt;
131	CBaseCombatCharacter::FVisible(CBaseEntity *,int,CBaseEntity **)&lt;br /&gt;
132	CBaseCombatCharacter::FVisible(Vector  const&amp;amp;,int,CBaseEntity **)&lt;br /&gt;
133	CBaseEntity::CanBeSeenBy(CAI_BaseNPC *)&lt;br /&gt;
134	CBaseEntity::GetAttackDamageScale(CBaseEntity*)&lt;br /&gt;
135	CBaseEntity::GetReceivedDamageScale(CBaseEntity*)&lt;br /&gt;
136	CBaseEntity::GetGroundVelocityToApply(Vector &amp;amp;)&lt;br /&gt;
137	CBaseEntity::PhysicsSplash(Vector  const&amp;amp;,Vector  const&amp;amp;,float,float)&lt;br /&gt;
138	CBaseEntity::Splash(void)&lt;br /&gt;
139	CBaseEntity::WorldSpaceCenter(void)const&lt;br /&gt;
140	CBaseEntity::GetSoundEmissionOrigin(void)const&lt;br /&gt;
141	CBaseEntity::CreateVPhysics(void)&lt;br /&gt;
142	CBaseEntity::ForceVPhysicsCollide(CBaseEntity*)&lt;br /&gt;
143	CBasePlayer::VPhysicsDestroyObject(void)&lt;br /&gt;
144	CBasePlayer::VPhysicsUpdate(IPhysicsObject *)&lt;br /&gt;
145	CBaseEntity::VPhysicsTakeDamage(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
146	CBaseCombatCharacter::VPhysicsShadowCollision(int,gamevcollisionevent_t *)&lt;br /&gt;
147	CBasePlayer::VPhysicsShadowUpdate(IPhysicsObject *)&lt;br /&gt;
148	CBasePlayer::VPhysicsCollision(int,gamevcollisionevent_t *)&lt;br /&gt;
149	CBaseEntity::VPhysicsFriction(IPhysicsObject *,float,int,int)&lt;br /&gt;
150	CBaseEntity::UpdatePhysicsShadowToCurrentPosition(float)&lt;br /&gt;
151	CBaseEntity::VPhysicsGetObjectList(IPhysicsObject **,int)&lt;br /&gt;
152	CBaseEntity::VPhysicsIsFlesh(void)&lt;br /&gt;
153	CBaseEntity::HasPhysicsAttacker(float)&lt;br /&gt;
154	CBasePlayer::PhysicsSolidMaskForEntity(void)const&lt;br /&gt;
155	CBaseEntity::ResolveFlyCollisionCustom(CGameTrace &amp;amp;,Vector &amp;amp;)&lt;br /&gt;
156	CBaseEntity::PerformCustomPhysics(Vector *,Vector *,QAngle *,QAngle *)&lt;br /&gt;
157	CBaseAnimating::GetStepOrigin(void)const&lt;br /&gt;
158	CBaseAnimating::GetStepAngles(void)const&lt;br /&gt;
159	CBaseEntity::ShouldDrawWaterImpacts(void)&lt;br /&gt;
160	CBasePlayer::NetworkStateChanged_m_fFlags(void)&lt;br /&gt;
161	CBasePlayer::NetworkStateChanged_m_fFlags(void *)&lt;br /&gt;
162	CBasePlayer::NetworkStateChanged_m_nWaterLevel(void)&lt;br /&gt;
163	CBasePlayer::NetworkStateChanged_m_nWaterLevel(void *)&lt;br /&gt;
164	CBasePlayer::NetworkStateChanged_m_hGroundEntity(void)&lt;br /&gt;
165	CBasePlayer::NetworkStateChanged_m_hGroundEntity(void *)&lt;br /&gt;
166	CBasePlayer::NetworkStateChanged_m_vecBaseVelocity(void)&lt;br /&gt;
167	CBasePlayer::NetworkStateChanged_m_vecBaseVelocity(void *)&lt;br /&gt;
168	CBasePlayer::NetworkStateChanged_m_flFriction(void)&lt;br /&gt;
169	CBasePlayer::NetworkStateChanged_m_flFriction(void *)&lt;br /&gt;
170	CBasePlayer::NetworkStateChanged_m_vecVelocity(void)&lt;br /&gt;
171	CBasePlayer::NetworkStateChanged_m_vecVelocity(void *)&lt;br /&gt;
172	CBasePlayer::NetworkStateChanged_m_vecViewOffset(void)&lt;br /&gt;
173	CBasePlayer::NetworkStateChanged_m_vecViewOffset(void *)&lt;br /&gt;
174	CBaseAnimating::GetIdealSpeed(void)const&lt;br /&gt;
175	CBaseAnimating::GetIdealAccel(void)const&lt;br /&gt;
176	CBaseAnimatingOverlay::StudioFrameAdvance(void)&lt;br /&gt;
177	CBaseAnimating::IsActivityFinished(void)&lt;br /&gt;
178	CBaseAnimating::GetSequenceGroundSpeed(CStudioHdr *,int)&lt;br /&gt;
179	CBaseAnimating::ClampRagdollForce(Vector  const&amp;amp;,Vector*)&lt;br /&gt;
180	CBaseAnimating::BecomeRagdollOnClient(Vector  const&amp;amp;)&lt;br /&gt;
181	CBaseAnimating::IsRagdoll(void)&lt;br /&gt;
182	CBaseAnimating::CanBecomeRagdoll(void)&lt;br /&gt;
183	CBaseAnimatingOverlay::GetSkeleton(CStudioHdr *,Vector *,Quaternion *,int)&lt;br /&gt;
184	CBaseAnimating::GetBoneTransform(int,matrix3x4_t &amp;amp;)&lt;br /&gt;
185	CBaseAnimating::SetupBones(matrix3x4_t *,int)&lt;br /&gt;
186	CBaseAnimating::CalculateIKLocks(float)&lt;br /&gt;
187	CBaseAnimatingOverlay::DispatchAnimEvents(CBaseAnimating *)&lt;br /&gt;
188	CBasePlayer::HandleAnimEvent(animevent_t *)&lt;br /&gt;
189	CBaseAnimating::PopulatePoseParameters(void)&lt;br /&gt;
190	CBaseAnimating::GetAttachment(int,matrix3x4_t &amp;amp;)&lt;br /&gt;
191	CBaseAnimating::InitBoneControllers(void)&lt;br /&gt;
192	CBaseAnimating::GetGroundSpeedVelocity(void)&lt;br /&gt;
193	CBaseAnimating::Ignite(float,bool,float,bool)&lt;br /&gt;
194	CBaseAnimating::IgniteLifetime(float)&lt;br /&gt;
195	CBaseAnimating::IgniteNumHitboxFires(int)&lt;br /&gt;
196	CBaseAnimating::IgniteHitboxFireScale(float)&lt;br /&gt;
197	CBaseAnimating::Extinguish(void)&lt;br /&gt;
198	CBaseCombatCharacter::SetLightingOriginRelative(CBaseEntity *)&lt;br /&gt;
199	CBaseAnimating::SetLightingOrigin(CBaseEntity *)&lt;br /&gt;
200	CBaseFlex::SetViewtarget(Vector  const&amp;amp;)&lt;br /&gt;
201	CBaseFlex::StartSceneEvent(CSceneEventInfo *,CChoreoScene *,CChoreoEvent *,CChoreoActor *,CBaseEntity *)&lt;br /&gt;
202	CBaseFlex::ProcessSceneEvents(void)&lt;br /&gt;
203	CBaseFlex::ProcessSceneEvent(CSceneEventInfo *,CChoreoScene *,CChoreoEvent *)&lt;br /&gt;
204	CBaseFlex::ClearSceneEvent(CSceneEventInfo *,bool,bool)&lt;br /&gt;
205	CBaseFlex::CheckSceneEventCompletion(CSceneEventInfo *,float,CChoreoScene *,CChoreoEvent *)&lt;br /&gt;
206	CTFPlayer::PlayScene(char  const*,float,AI_Response *,IRecipientFilter *)&lt;br /&gt;
207	CBaseFlex::PlayAutoGeneratedSoundScene(char  const*)&lt;br /&gt;
208	CBasePlayer::GetPhysicsImpactDamageTable(void)&lt;br /&gt;
209	CBaseCombatCharacter::FInViewCone(CBaseEntity *)&lt;br /&gt;
210	CBaseCombatCharacter::FInViewCone(Vector  const&amp;amp;)&lt;br /&gt;
211	CBaseCombatCharacter::FInAimCone(CBaseEntity *)&lt;br /&gt;
212	CBaseCombatCharacter::FInAimCone(Vector  const&amp;amp;)&lt;br /&gt;
213	CBaseCombatCharacter::ShouldShootMissTarget(CBaseCombatCharacter*)&lt;br /&gt;
214	CBaseCombatCharacter::FindMissTarget(void)&lt;br /&gt;
215	CBaseCombatCharacter::HandleInteraction(int,void *,CBaseCombatCharacter*)&lt;br /&gt;
216	CBasePlayer::BodyAngles(void)&lt;br /&gt;
217	CBaseCombatCharacter::BodyDirection2D(void)&lt;br /&gt;
218	CBaseCombatCharacter::BodyDirection3D(void)&lt;br /&gt;
219	CBaseCombatCharacter::HeadDirection2D(void)&lt;br /&gt;
220	CBaseCombatCharacter::HeadDirection3D(void)&lt;br /&gt;
221	CBaseCombatCharacter::EyeDirection2D(void)&lt;br /&gt;
222	CBaseCombatCharacter::EyeDirection3D(void)&lt;br /&gt;
223	CTFPlayer::GiveAmmo(int,int,bool)&lt;br /&gt;
224	CBaseCombatCharacter::NPC_TranslateActivity(Activity)&lt;br /&gt;
225	CBaseCombatCharacter::Weapon_TranslateActivity(Activity,bool *)&lt;br /&gt;
226	CTFPlayer::Weapon_FrameUpdate(void)&lt;br /&gt;
227	CTFPlayer::Weapon_HandleAnimEvent(animevent_t *)&lt;br /&gt;
228	CBasePlayer::Weapon_CanUse(CBaseCombatWeapon *)&lt;br /&gt;
229	CBasePlayer::Weapon_Equip(CBaseCombatWeapon *)&lt;br /&gt;
230	CBaseCombatCharacter::Weapon_EquipAmmoOnly(CBaseCombatWeapon *)&lt;br /&gt;
231	CTFPlayer::Weapon_Drop(CBaseCombatWeapon *,Vector  const*,Vector  const*)&lt;br /&gt;
232	CTFPlayer::Weapon_Switch(CBaseCombatWeapon *,int)&lt;br /&gt;
233	CBasePlayer::Weapon_ShootPosition(void)&lt;br /&gt;
234	CBaseCombatCharacter::Weapon_CanSwitchTo(CBaseCombatWeapon *)&lt;br /&gt;
235	CBaseCombatCharacter::Weapon_SlotOccupied(CBaseCombatWeapon *)&lt;br /&gt;
236	CBaseCombatCharacter::Weapon_GetSlot(int)const&lt;br /&gt;
237	CBaseCombatCharacter::AddPlayerItem(CBaseCombatWeapon *)&lt;br /&gt;
238	CBasePlayer::RemovePlayerItem(CBaseCombatWeapon *)&lt;br /&gt;
239	CBaseCombatCharacter::CanBecomeServerRagdoll(void)&lt;br /&gt;
240	CTFPlayer::OnTakeDamage_Alive(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
241	CBaseCombatCharacter::OnTakeDamage_Dying(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
242	CBaseCombatCharacter::OnTakeDamage_Dead(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
243	CBaseCombatCharacter::OnFriendDamaged(CBaseCombatCharacter*,CBaseEntity *)&lt;br /&gt;
244	CBaseCombatCharacter::NotifyFriendsOfDamage(CBaseEntity *)&lt;br /&gt;
245	CBaseCombatCharacter::OnPlayerKilledOther(CBaseEntity *,CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
246	CBaseCombatCharacter::GetDeathActivity(void)&lt;br /&gt;
247	CBaseCombatCharacter::CorpseGib(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
248	CBaseCombatCharacter::CorpseFade(void)&lt;br /&gt;
249	CBaseCombatCharacter::HasHumanGibs(void)&lt;br /&gt;
250	CBaseCombatCharacter::HasAlienGibs(void)&lt;br /&gt;
251	CTFPlayer::ShouldGib(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
252	CBaseCombatCharacter::OnKilledNPC(CBaseCombatCharacter*)&lt;br /&gt;
253	CBaseCombatCharacter::Event_Gibbed(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
254	CBasePlayer::Event_Dying(void)&lt;br /&gt;
255	CBaseCombatCharacter::BecomeRagdoll(CTakeDamageInfo  const&amp;amp;,Vector  const&amp;amp;)&lt;br /&gt;
256	CBaseCombatCharacter::FixupBurningServerRagdoll(CBaseEntity *)&lt;br /&gt;
257	CBaseCombatCharacter::BecomeRagdollBoogie(CBaseEntity *,Vector  const&amp;amp;,float,int)&lt;br /&gt;
258	CBaseCombatCharacter::CheckTraceHullAttack(float,Vector  const&amp;amp;,Vector  const&amp;amp;,int,int,float,bool)&lt;br /&gt;
259	CBaseCombatCharacter::CheckTraceHullAttack(Vector  const&amp;amp;,Vector  const&amp;amp;,Vector  const&amp;amp;,Vector  const&amp;amp;,int,int,float,bool)&lt;br /&gt;
260	CBaseCombatCharacter::PushawayTouch(CBaseEntity *)&lt;br /&gt;
261	CBaseCombatCharacter::IRelationType(CBaseEntity *)&lt;br /&gt;
262	CBaseCombatCharacter::IRelationPriority(CBaseEntity *)&lt;br /&gt;
263	CBasePlayer::IsInAVehicle(void)const&lt;br /&gt;
264	CBasePlayer::GetVehicle(void)&lt;br /&gt;
265	CBasePlayer::GetVehicleEntity(void)&lt;br /&gt;
266	CBaseCombatCharacter::ExitVehicle(void)&lt;br /&gt;
267	CBaseCombatCharacter::CalcWeaponProficiency(CBaseCombatWeapon *)&lt;br /&gt;
268	CBaseCombatCharacter::GetAttackSpread(CBaseCombatWeapon *,CBaseEntity *)&lt;br /&gt;
269	CBaseCombatCharacter::GetSpreadBias(CBaseCombatWeapon *,CBaseEntity *)&lt;br /&gt;
270	CBasePlayer::DoMuzzleFlash(void)&lt;br /&gt;
271	CBaseCombatCharacter::AddEntityRelationship(CBaseEntity *,Disposition_t,int)&lt;br /&gt;
272	CBaseCombatCharacter::RemoveEntityRelationship(CBaseEntity *)&lt;br /&gt;
273	CBaseCombatCharacter::AddClassRelationship(Class_T,Disposition_t,int)&lt;br /&gt;
274	CBaseCombatCharacter::OnChangeActiveWeapon(CBaseCombatWeapon *,CBaseCombatWeapon *)&lt;br /&gt;
275	CBasePlayer::NetworkStateChanged_m_iAmmo(void)&lt;br /&gt;
276	CBasePlayer::NetworkStateChanged_m_iAmmo(void *)&lt;br /&gt;
277	CTFPlayer::CreateViewModel(int)&lt;br /&gt;
278	CBasePlayer::SetupVisibility(CBaseEntity *,unsigned char *,int)&lt;br /&gt;
279	CTFPlayer::WantsLagCompensationOnEntity(CBasePlayer  const*,CUserCmd  const*,CBitVec&amp;lt;2048&amp;gt;  const*)const&lt;br /&gt;
280	CBasePlayer::SharedSpawn(void)&lt;br /&gt;
281	CTFPlayer::ForceRespawn(void)&lt;br /&gt;
282	CTFPlayer::InitialSpawn(void)&lt;br /&gt;
283	CBasePlayer::InitHUD(void)&lt;br /&gt;
284	CBasePlayer::ShowViewPortPanel(char  const*,bool,KeyValues *)&lt;br /&gt;
285	CTFPlayer::PlayerDeathThink(void)&lt;br /&gt;
286	CBasePlayer::Jump(void)&lt;br /&gt;
287	CBasePlayer::Duck(void)&lt;br /&gt;
288	CTFPlayer::PreThink(void)&lt;br /&gt;
289	CTFPlayer::PostThink(void)&lt;br /&gt;
290	CTFPlayer::DamageEffect(float,int)&lt;br /&gt;
291	CTFPlayer::OnDamagedByExplosion(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
292	CBasePlayer::ShouldFadeOnDeath(void)&lt;br /&gt;
293	CBasePlayer::IsFakeClient(void)const&lt;br /&gt;
294	CBasePlayer::GetPlayerMins(void)const&lt;br /&gt;
295	CBasePlayer::GetPlayerMaxs(void)const&lt;br /&gt;
296	CBasePlayer::CalcRoll(QAngle  const&amp;amp;,Vector  const&amp;amp;,float,float)&lt;br /&gt;
297	CBasePlayer::PackDeadPlayerItems(void)&lt;br /&gt;
298	CTFPlayer::RemoveAllItems(bool)&lt;br /&gt;
299	CBasePlayer::Weapon_SetLast(CBaseCombatWeapon *)&lt;br /&gt;
300	CTFPlayer::Weapon_ShouldSetLast(CBaseCombatWeapon *,CBaseCombatWeapon *)&lt;br /&gt;
301	CBasePlayer::Weapon_ShouldSelectItem(CBaseCombatWeapon *)&lt;br /&gt;
302	CBasePlayer::UpdateClientData(void)&lt;br /&gt;
303	CBasePlayer::ExitLadder(void)&lt;br /&gt;
304	CBasePlayer::GetLadderSurface(Vector  const&amp;amp;)&lt;br /&gt;
305	CBasePlayer::SetFlashlightEnabled(bool)&lt;br /&gt;
306	CTFPlayer::FlashlightIsOn(void)&lt;br /&gt;
307	CTFPlayer::FlashlightTurnOn(void)&lt;br /&gt;
308	CTFPlayer::FlashlightTurnOff(void)&lt;br /&gt;
309	CBasePlayer::IsIlluminatedByFlashlight(CBaseEntity *,float *)&lt;br /&gt;
310	CBasePlayer::UpdateStepSound(surfacedata_t *,Vector  const&amp;amp;,Vector  const&amp;amp;)&lt;br /&gt;
311	CBasePlayer::PlayStepSound(Vector &amp;amp;,surfacedata_t *,float,bool)&lt;br /&gt;
312	CTFPlayer::GetStepSoundVelocities(float *,float *)&lt;br /&gt;
313	CTFPlayer::SetStepSoundTime(stepsoundtimes_t,bool)&lt;br /&gt;
314	CTFPlayer::DeathSound(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
315	CTFPlayer::SetAnimation(PLAYER_ANIM)&lt;br /&gt;
316	CBasePlayer::ImpulseCommands(void)&lt;br /&gt;
317	CTFPlayer::CheatImpulseCommands(int)&lt;br /&gt;
318	CTFPlayer::ClientCommand(CCommand  const&amp;amp;)&lt;br /&gt;
319	CBasePlayer::StartObserverMode(int)&lt;br /&gt;
320	CBasePlayer::StopObserverMode(void)&lt;br /&gt;
321	CTFPlayer::ModeWantsSpectatorGUI(int)&lt;br /&gt;
322	CTFPlayer::SetObserverMode(int)&lt;br /&gt;
323	CBasePlayer::GetObserverMode(void)&lt;br /&gt;
324	CTFPlayer::SetObserverTarget(CBaseEntity *)&lt;br /&gt;
325	CBasePlayer::ObserverUse(bool)&lt;br /&gt;
326	CBasePlayer::GetObserverTarget(void)&lt;br /&gt;
327	CTFPlayer::FindNextObserverTarget(bool)&lt;br /&gt;
328	CTFPlayer::GetNextObserverSearchStartPoint(bool)&lt;br /&gt;
329	CTFPlayer::IsValidObserverTarget(CBaseEntity *)&lt;br /&gt;
330	CTFPlayer::CheckObserverSettings(void)&lt;br /&gt;
331	CBasePlayer::JumptoPosition(Vector  const&amp;amp;,QAngle  const&amp;amp;)&lt;br /&gt;
332	CBasePlayer::ForceObserverMode(int)&lt;br /&gt;
333	CBasePlayer::ResetObserverMode(void)&lt;br /&gt;
334	CTFPlayer::ValidateCurrentObserverTarget(void)&lt;br /&gt;
335	CTFPlayer::AttemptToExitFreezeCam(void)&lt;br /&gt;
336	CBasePlayer::StartReplayMode(float,float,int)&lt;br /&gt;
337	CBasePlayer::StopReplayMode(void)&lt;br /&gt;
338	CBasePlayer::GetDelayTicks(void)&lt;br /&gt;
339	CBasePlayer::GetReplayEntity(void)&lt;br /&gt;
340	CBasePlayer::CreateCorpse(void)&lt;br /&gt;
341	CTFPlayer::EntSelectSpawnPoint(void)&lt;br /&gt;
342	CBasePlayer::GetInVehicle(IServerVehicle *,int)&lt;br /&gt;
343	CBasePlayer::LeaveVehicle(Vector  const&amp;amp;,QAngle  const&amp;amp;)&lt;br /&gt;
344	CBasePlayer::OnVehicleStart(void)&lt;br /&gt;
345	CBasePlayer::OnVehicleEnd(Vector &amp;amp;)&lt;br /&gt;
346	CTFPlayer::BumpWeapon(CBaseCombatWeapon *)&lt;br /&gt;
347	CBasePlayer::SelectLastItem(void)&lt;br /&gt;
348	CBasePlayer::SelectItem(char  const*,int)&lt;br /&gt;
349	CTFPlayer::ItemPostFrame(void)&lt;br /&gt;
350	CBasePlayer::GiveNamedItem(char  const*,int)&lt;br /&gt;
351	CBasePlayer::CheckTrainUpdate(void)&lt;br /&gt;
352	CBasePlayer::SetPlayerUnderwater(bool)&lt;br /&gt;
353	CBasePlayer::CanBreatheUnderwater(void)const&lt;br /&gt;
354	CBasePlayer::PlayerUse(void)&lt;br /&gt;
355	CBasePlayer::PlayUseDenySound(void)&lt;br /&gt;
356	CBasePlayer::FindUseEntity(void)&lt;br /&gt;
357	CBasePlayer::IsUseableEntity(CBaseEntity *,unsigned int)&lt;br /&gt;
358	CBasePlayer::PickupObject(CBaseEntity *,bool)&lt;br /&gt;
359	CBasePlayer::ForceDropOfCarriedPhysObjects(CBaseEntity *)&lt;br /&gt;
360	CBasePlayer::GetHeldObjectMass(IPhysicsObject *)&lt;br /&gt;
361	CBasePlayer::UpdateGeigerCounter(void)&lt;br /&gt;
362	CBasePlayer::GetAutoaimVector(float)&lt;br /&gt;
363	CBasePlayer::GetAutoaimVector(float,float)&lt;br /&gt;
364	CBasePlayer::GetAutoaimVector(autoaim_params_t &amp;amp;)&lt;br /&gt;
365	CBasePlayer::ShouldAutoaim(void)&lt;br /&gt;
366	CBasePlayer::ForceClientDllUpdate(void)&lt;br /&gt;
367	CBasePlayer::ProcessUsercmds(CUserCmd *,int,int,int,bool)&lt;br /&gt;
368	CBasePlayer::PlayerRunCommand(CUserCmd *,IMoveHelper *)&lt;br /&gt;
369	CTFPlayer::ChangeTeam(int,bool,bool)&lt;br /&gt;
370	CTFPlayer::CanHearAndReadChatFrom(CBasePlayer *)&lt;br /&gt;
371	CBaseMultiplayerPlayer::CanSpeak(void)&lt;br /&gt;
372	CBasePlayer::ModifyOrAppendPlayerCriteria(AI_CriteriaSet &amp;amp;)&lt;br /&gt;
373	CBasePlayer::CheckChatText(char *,int)&lt;br /&gt;
374	CTFPlayer::CreateRagdollEntity(void)&lt;br /&gt;
375	CTFPlayer::ShouldAnnounceAchievement(void)&lt;br /&gt;
376	CBasePlayer::IsFollowingPhysics(void)&lt;br /&gt;
377	CBasePlayer::InitVCollision(Vector  const&amp;amp;,Vector  const&amp;amp;)&lt;br /&gt;
378	CBasePlayer::UpdatePhysicsShadowToCurrentPosition(void)&lt;br /&gt;
379	CBasePlayer::Hints(void)&lt;br /&gt;
380	CTFPlayer::IsReadyToPlay(void)&lt;br /&gt;
381	CTFPlayer::IsReadyToSpawn(void)&lt;br /&gt;
382	CTFPlayer::ShouldGainInstantSpawn(void)&lt;br /&gt;
383	CTFPlayer::ResetPerRoundStats(void)&lt;br /&gt;
384	CTFPlayer::ResetScores(void)&lt;br /&gt;
385	CBasePlayer::EquipSuit(bool)&lt;br /&gt;
386	CBasePlayer::RemoveSuit(void)&lt;br /&gt;
387	CTFPlayer::CommitSuicide(bool,bool)&lt;br /&gt;
388	CBasePlayer::CommitSuicide(Vector  const&amp;amp;,bool,bool)&lt;br /&gt;
389	CBasePlayer::IsBot(void)const&lt;br /&gt;
390	CBaseMultiplayerPlayer::GetExpresser(void)&lt;br /&gt;
391	CBasePlayer::SpawnArmorValue(void)const&lt;br /&gt;
392	CBasePlayer::NetworkStateChanged_m_ArmorValue(void)&lt;br /&gt;
393	CBasePlayer::NetworkStateChanged_m_ArmorValue(void *)&lt;br /&gt;
394	CAI_ExpresserHost&amp;lt;CBasePlayer&amp;gt;::NoteSpeaking(float,float)&lt;br /&gt;
395	CAI_ExpresserHost&amp;lt;CBasePlayer&amp;gt;::Speak(char  const*,char  const*,char *,unsigned int,IRecipientFilter *)&lt;br /&gt;
396	CAI_ExpresserHost&amp;lt;CBasePlayer&amp;gt;::PostSpeakDispatchResponse(char  const*,AI_Response *)&lt;br /&gt;
397	CBaseMultiplayerPlayer::SpeakIfAllowed(char  const*,char  const*,char *,unsigned int,IRecipientFilter *)&lt;br /&gt;
398	CTFPlayer::SpeakConceptIfAllowed(int,char  const*,char *,unsigned int,IRecipientFilter *)&lt;br /&gt;
399	CTFPlayer::CanSpeakVoiceCommand(void)&lt;br /&gt;
400	CTFPlayer::ShouldShowVoiceSubtitleToEnemy(void)&lt;br /&gt;
401	CTFPlayer::NoteSpokeVoiceCommand(char  const*)&lt;br /&gt;
402	CBaseMultiplayerPlayer::OnAchievementEarned(int)&lt;br /&gt;
403	CBaseMultiplayerPlayer::GetMultiplayerExpresser(void)&lt;br /&gt;
404	CTFPlayer::CalculateTeamBalanceScore(void)&lt;br /&gt;
405	CBaseMultiplayerPlayer::CreateExpresser(void)&lt;br /&gt;
406	CTFPlayer::GetAttributeManager(void)&lt;br /&gt;
407	CTFPlayer::GetAttributeContainer(void)&lt;br /&gt;
408	CTFPlayer::GetAttributeOwner(void)&lt;br /&gt;
409	CTFPlayer::GiveNamedItem(char  const*,int,CScriptCreatedItem *)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Porting_to_Left_4_Dead&amp;diff=6549</id>
		<title>Porting to Left 4 Dead</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Porting_to_Left_4_Dead&amp;diff=6549"/>
		<updated>2008-12-02T16:35:37Z</updated>

		<summary type="html">&lt;p&gt;DS: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__&lt;br /&gt;
Porting Valve Server Plugins or Metamod:Source plugins to Left 4 Dead is not very difficult.  This article explores some of the changes and how to simplify them.&lt;br /&gt;
&lt;br /&gt;
Users of Metamod:Source must upgrade to Metamod:Source 1.7 and use the 1.6+ API (see [[MM:S API Differences]]).&lt;br /&gt;
&lt;br /&gt;
As there is no official SDK yet, we've simply reverse engineered the new header files.  These changes aren't guaranteed to be 100% correct and the SDK isn't complete for building mods -- just most plugins.&lt;br /&gt;
&lt;br /&gt;
=Changes=&lt;br /&gt;
*&amp;lt;tt&amp;gt;IVEngineServer::UserMessageBegin&amp;lt;/tt&amp;gt; now takes an additional string parameter containing the message name.&lt;br /&gt;
*The low-level datagram type for setting replicated convars on clients has changed from 5 to 6.&lt;br /&gt;
*&amp;lt;tt&amp;gt;CreateEntityByName&amp;lt;/tt&amp;gt; appears to have a third parameter (SourceMod sets it to true).&lt;br /&gt;
&lt;br /&gt;
=Removals=&lt;br /&gt;
==IVEngineServer Functions==&lt;br /&gt;
The &amp;lt;tt&amp;gt;IVEngineServer&amp;lt;/tt&amp;gt; functions &amp;lt;tt&amp;gt;PEntityOfEntIndex&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;IndexOfEdict&amp;lt;/tt&amp;gt; have been removed for faster code that can be inlined.  An example of how to re-implement this (as Valve has not released a new SDK yet):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
inline int IndexOfEdict(const edict_t *pEdict)&lt;br /&gt;
{&lt;br /&gt;
	return (int)(pEdict - gpGlobals-&amp;gt;baseEdict);&lt;br /&gt;
}&lt;br /&gt;
inline edict_t *PEntityOfEntIndex(int iEntIndex)&lt;br /&gt;
{&lt;br /&gt;
	if (iEntIndex &amp;gt;= 0 &amp;amp;&amp;amp; iEntIndex &amp;lt; gpGlobals-&amp;gt;maxEntities)&lt;br /&gt;
	{&lt;br /&gt;
		return (edict_t *)(gpGlobals-&amp;gt;baseEdict + iEntIndex);&lt;br /&gt;
	}&lt;br /&gt;
	return NULL;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ICVar functions==&lt;br /&gt;
The function &amp;lt;tt&amp;gt;GetCommands&amp;lt;/tt&amp;gt; has been removed.  In general, &amp;lt;tt&amp;gt;FindCommand&amp;lt;/tt&amp;gt; can be used as a replacement.&lt;br /&gt;
&lt;br /&gt;
However, if iterating across all ConCommandBases is a must, then use &amp;lt;tt&amp;gt;FactoryInternalIterator&amp;lt;/tt&amp;gt;.  This returns an &amp;lt;tt&amp;gt;ICvarIteratorInternal&amp;lt;/tt&amp;gt; pointer.  An example of how to use these:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
ICvarIteratorInternal *iter = icvar-&amp;gt;FactoryInternalIterator();&lt;br /&gt;
&lt;br /&gt;
iter-&amp;gt;SetFirst();&lt;br /&gt;
&lt;br /&gt;
while (iter-&amp;gt;IsValid())&lt;br /&gt;
{&lt;br /&gt;
	ConCommandBase *pCmd = iter-&amp;gt;Get();&lt;br /&gt;
	Msg(&amp;quot;ConCommandBase: %s\n&amp;quot;, pCmd-&amp;gt;GetName());&lt;br /&gt;
	iter-&amp;gt;Next();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// ICvarIteratorInternal does not have a virtual destructor.&lt;br /&gt;
g_pMemAlloc-&amp;gt;Free(iter);&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Annoyances=&lt;br /&gt;
The console will spew &amp;quot;VPK&amp;quot; warnings unless your file-backed KeyValues operations use relative paths instead of absolute paths.&lt;br /&gt;
&lt;br /&gt;
[[Category:Metamod:Source Development]]&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Metamod:Source_Environment&amp;diff=6477</id>
		<title>Metamod:Source Environment</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Metamod:Source_Environment&amp;diff=6477"/>
		<updated>2008-11-26T14:04:34Z</updated>

		<summary type="html">&lt;p&gt;DS: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article explains how to set up your Windows or Linux environment to compile Metamod:Source's sample plugins.  &lt;br /&gt;
&lt;br /&gt;
This article does not guarantee that you will be able to build third-party plugins, which may have their own build environment requirements.  However, it creates a baseline for making sure you can successfully build plugins.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' You can use Valve's HL2SDK source tree, but we have our own available.  It fixes all of Valve's mistakes such that you can build on both GCC and Visual Studio with no warnings or errors.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' This article is intended to be used against Metamod:Source 1.7.&lt;br /&gt;
&lt;br /&gt;
=Requirements=&lt;br /&gt;
&lt;br /&gt;
==Windows==&lt;br /&gt;
*Microsoft Visual C++ 2008 (Express or higher) is supported and used for official builds.&lt;br /&gt;
*Microsoft Visual C++ 2005 (Express or higher) is unsupported, though it should work as it is capable of building compatible binaries.&lt;br /&gt;
*Microsoft Visual C++ 2003 7.1 is unsupported.  It is capable of building compatible binaries against the original (non-Orange Box SDK) only.&lt;br /&gt;
*Microsoft Visual C++ 2003 7.0 or lower '''cannot''' be used.&lt;br /&gt;
&lt;br /&gt;
If you are installing Visual C++ 2005 Express, it may not come with Microsoft's Platform SDK installed.  If this is the case, you must manually install the Platform SDK.  You can find directions on how to do this and test your setup [http://www.microsoft.com/express/2005/platformsdk/default.aspx here].  According to Microsoft, Visual C++ 2008 &amp;quot;streamlines&amp;quot; the Platform SDK installation for you.&lt;br /&gt;
&lt;br /&gt;
==Linux==&lt;br /&gt;
For Linux, Metamod:Source requires the GNU C/C++ Compiler (from GCC):&lt;br /&gt;
*Version 4.1 is used for official binaries and is guaranteed to build.&lt;br /&gt;
*Versions 3.4 through 4.2 are guaranteed to be binary (ABI) compatible.  Metamod:Source and its sample plugins will probably build fine on them.&lt;br /&gt;
*Any GCC version below 3.4 '''cannot''' be used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Setup=&lt;br /&gt;
==Getting the Files==&lt;br /&gt;
This section describes which files you must have and how to get them.  Do not worry about where to place them yet -- that will be discussed on a per-platform basis.  You can download the files anywhere you'd like.&lt;br /&gt;
&lt;br /&gt;
You can use the HL2SDK from Valve, but it's recommended you use the one linked to here.  We have a patched version that fixes many compilation bugs and it will make your life easier on both operating systems.&lt;br /&gt;
&lt;br /&gt;
You need each SDK for each game you want to compile against (if your plugin requires knowledge about the game).&lt;br /&gt;
&lt;br /&gt;
To get Metamod:Source files, visit [http://www.metamodsource.net/?go=downloads Metamod:Source downloads].  Make sure to get the source code and not the binaries.&lt;br /&gt;
&lt;br /&gt;
==Linux==&lt;br /&gt;
As of this writing, SourceMod's Makefiles are hardcoded to use a binary called &amp;quot;gcc-4.1&amp;quot;  You can override this, for example:&lt;br /&gt;
&amp;lt;pre&amp;gt;make CPP=gcc&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otherwise, you can also just create a symlink:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo ln -s /usr/bin/gcc /usr/bin/gcc-4.1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that you must use &amp;lt;tt&amp;gt;gcc&amp;lt;/tt&amp;gt; and not &amp;lt;tt&amp;gt;g++&amp;lt;/tt&amp;gt;.  Using &amp;lt;tt&amp;gt;g++&amp;lt;/tt&amp;gt; creates a &amp;lt;tt&amp;gt;libstdc++&amp;lt;/tt&amp;gt; dependency, which may interfere with Valve's &amp;lt;tt&amp;gt;libstdc++&amp;lt;/tt&amp;gt; usage and will cause platform portability problems in general.  As a corollary you should avoid using STL, RTTI (Run-Time Type Information), or exceptions.&lt;br /&gt;
&lt;br /&gt;
Metamod:Source's Makefiles have a strict directory organization.  You must have a top-level folder.  For this document, we'll assume it is called &amp;lt;tt&amp;gt;project&amp;lt;/tt&amp;gt;, though it can be named anything.  The layout of &amp;lt;tt&amp;gt;project&amp;lt;/tt&amp;gt; should be:&lt;br /&gt;
*&amp;lt;tt&amp;gt;project&amp;lt;/tt&amp;gt;/&lt;br /&gt;
**&amp;lt;tt&amp;gt;mmsource-1.7&amp;lt;/tt&amp;gt; - symlink or folder containing Metamod:Source 1.7 source code&lt;br /&gt;
**&amp;lt;tt&amp;gt;hl2sdk&amp;lt;/tt&amp;gt; - symlink or folder containing the HL2SDK for Episode 1&lt;br /&gt;
**&amp;lt;tt&amp;gt;hl2sdk-ob&amp;lt;/tt&amp;gt; - symlink or folder containing the HL2SDK for Orange Box/TF&lt;br /&gt;
**&amp;lt;tt&amp;gt;hl2sdk-l4d&amp;lt;/tt&amp;gt; - symlink or folder containing the HL2SDK for Left 4 Dead&lt;br /&gt;
&lt;br /&gt;
If you are using a 64-bit version of Linux, you may need to install extra packages to be able to compile SourceMod.  On Debian-based distros, these are typically:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#prerequisites&lt;br /&gt;
#apt-get install g++-4.1 gcc-4.1 make mercurial&lt;br /&gt;
#apt-get instal libz libz-dev&lt;br /&gt;
#only needed if you want to use the build tool&lt;br /&gt;
#apt-get install mono mono-devel&lt;br /&gt;
#32-bit support&lt;br /&gt;
apt-get install ia32-libs&lt;br /&gt;
apt-get install lib32z1 lib32z1-dev&lt;br /&gt;
apt-get install libc6-dev-i386 libc6-i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In your projects, you should use &amp;lt;tt&amp;gt;mmsource-1.7/core&amp;lt;/tt&amp;gt; for the new (1.6+) API and &amp;lt;tt&amp;gt;mmsource-1.7/core-legacy&amp;lt;/tt&amp;gt; for the legacy (1.4-) API, needed for compatibility with the original MM:S engine.&lt;br /&gt;
&lt;br /&gt;
==Windows==&lt;br /&gt;
On Windows, there is no particular directory layout required -- environment variables are used instead.  The directions below apply to Windows XP, and are assumed to be similar for other versions of Windows.&lt;br /&gt;
*Open the Control Panel (for example, via Start -&amp;gt; Settings).&lt;br /&gt;
*Open the System control.  If you don't see it, you may need to switch to &amp;quot;Classic view&amp;quot; (either via the left-hand pane or by going to Tools -&amp;gt; Folder Options).&lt;br /&gt;
*Click the Advanced tab.&lt;br /&gt;
*Click the Environment Variables button.&lt;br /&gt;
&lt;br /&gt;
You can add your environment variables to either your User settings or your System settings.  Create a new variable for each item in the list below.  The item names are in &amp;lt;tt&amp;gt;fixed-width font&amp;lt;/tt&amp;gt; and their value descriptions follow.&lt;br /&gt;
*&amp;lt;tt&amp;gt;MMSOURCE17&amp;lt;/tt&amp;gt; - Path to Metamod:Source 1.7 source code.&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDK&amp;lt;/tt&amp;gt; - Path to HL2SDK for Ep1/Original&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDKOB&amp;lt;/tt&amp;gt; - Path to HL2SDK for Ep2/OrangeBox&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDKL4D&amp;lt;/tt&amp;gt; - Path to HL2SDK for Left 4 Dead&lt;br /&gt;
&lt;br /&gt;
In your projects, you should use &amp;lt;tt&amp;gt;$(MMSOURCE17)/core&amp;lt;/tt&amp;gt; for the new (1.6+) API and &amp;lt;tt&amp;gt;$(MMSOURCE17)/core-legacy&amp;lt;/tt&amp;gt; for the legacy (1.4-) API, needed for compatibility with the original MM:S engine.&lt;br /&gt;
&lt;br /&gt;
[[Category:Metamod:Source Development]]&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Porting_to_Left_4_Dead&amp;diff=6476</id>
		<title>Porting to Left 4 Dead</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Porting_to_Left_4_Dead&amp;diff=6476"/>
		<updated>2008-11-26T08:23:56Z</updated>

		<summary type="html">&lt;p&gt;DS: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__&lt;br /&gt;
Porting Valve Server Plugins or Metamod:Source plugins to Left 4 Dead is not very difficult.  This article explores some of the changes and how to simplify them.&lt;br /&gt;
&lt;br /&gt;
Users of Metamod:Source must upgrade to Metamod:Source 1.7 and use the 1.6+ API (see [[MM:S API Differences]]).&lt;br /&gt;
&lt;br /&gt;
As there is no official SDK yet, we've simply reverse engineered the new header files.  These changes aren't guaranteed to be 100% correct and the SDK isn't complete for building mods -- just most plugins.&lt;br /&gt;
&lt;br /&gt;
=Changes=&lt;br /&gt;
*&amp;lt;tt&amp;gt;IVEngineServer::UserMessageBegin&amp;lt;/tt&amp;gt; now takes an additional string parameter containing the message name.&lt;br /&gt;
*The low-level datagram type for setting replicated convars on clients has changed from 5 to 6.&lt;br /&gt;
*&amp;lt;tt&amp;gt;CreateEntityByName&amp;lt;/tt&amp;gt; appears to have a third parameter (SourceMod sets it to true).&lt;br /&gt;
&lt;br /&gt;
=Removals=&lt;br /&gt;
==IVEngineServer Functions==&lt;br /&gt;
The &amp;lt;tt&amp;gt;IVEngineServer&amp;lt;/tt&amp;gt; functions &amp;lt;tt&amp;gt;PEntityOfEntIndex&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;IndexOfEdict&amp;lt;/tt&amp;gt; have been removed for faster code that can be inlined.  An example of how to re-implement this (as Valve has not released a new SDK yet):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
inline int IndexOfEdict(const edict_t *pEdict)&lt;br /&gt;
{&lt;br /&gt;
	return (int)(pEdict - gpGlobals-&amp;gt;baseEdict);&lt;br /&gt;
}&lt;br /&gt;
inline edict_t *PEntityOfEntIndex(int iEntIndex)&lt;br /&gt;
{&lt;br /&gt;
	if (iEntIndex &amp;gt;= 0 &amp;amp;&amp;amp; iEntIndex &amp;lt; gpGlobals-&amp;gt;maxEntities)&lt;br /&gt;
	{&lt;br /&gt;
		return (edict_t *)(gpGlobals-&amp;gt;baseEdict + iEntIndex);&lt;br /&gt;
	}&lt;br /&gt;
	return NULL;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ICVar functions==&lt;br /&gt;
The function &amp;lt;tt&amp;gt;GetCommands&amp;lt;/tt&amp;gt; has been removed.  In general, &amp;lt;tt&amp;gt;FindCommand&amp;lt;/tt&amp;gt; can be used as a replacement.&lt;br /&gt;
&lt;br /&gt;
However, if iterating across all ConCommandBases is a must, then use &amp;lt;tt&amp;gt;FactoryInternalIterator&amp;lt;/tt&amp;gt;.  This returns a pointer to &amp;lt;tt&amp;gt;ICvarIteratorInternal&amp;lt;/tt&amp;gt;.  An example of how to use these:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
ICvarIteratorInternal *iter = icvar-&amp;gt;FactoryInternalIterator();&lt;br /&gt;
iter-&amp;gt;SetFirst();&lt;br /&gt;
while (iter-&amp;gt;IsValid())&lt;br /&gt;
{&lt;br /&gt;
	ConCommandBase *pCmd = iter-&amp;gt;Get();&lt;br /&gt;
	Msg(&amp;quot;ConCommandBase: %s\n&amp;quot;, pCmd-&amp;gt;GetName());&lt;br /&gt;
	iter-&amp;gt;Next();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Annoyances=&lt;br /&gt;
The console will spew &amp;quot;VPK&amp;quot; warnings unless your file-backed KeyValues operations use relative paths instead of absolute paths.&lt;br /&gt;
&lt;br /&gt;
[[Category:Metamod:Source Development]]&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Porting_to_Left_4_Dead&amp;diff=6475</id>
		<title>Porting to Left 4 Dead</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Porting_to_Left_4_Dead&amp;diff=6475"/>
		<updated>2008-11-26T08:21:12Z</updated>

		<summary type="html">&lt;p&gt;DS: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__&lt;br /&gt;
Porting Valve Server Plugins or Metamod:Source plugins to Left 4 Dead is not very difficult.  This article explores some of the changes and how to simplify them.&lt;br /&gt;
&lt;br /&gt;
Users of Metamod:Source must upgrade to Metamod:Source 1.7 and use the 1.6+ API (see [[MM:S API Differences]]).&lt;br /&gt;
&lt;br /&gt;
As there is no official SDK yet, we've simply reverse engineered the new header files.  These changes aren't guaranteed to be 100% correct and the SDK isn't complete for building mods -- just most plugins.&lt;br /&gt;
&lt;br /&gt;
=Changes=&lt;br /&gt;
*&amp;lt;tt&amp;gt;IVEngineServer::UserMessageBegin&amp;lt;/tt&amp;gt; now takes an additional string parameter containing the message name.&lt;br /&gt;
*The low-level datagram type for setting convars has changed from 5 to 6.&lt;br /&gt;
*&amp;lt;tt&amp;gt;CreateEntityByName&amp;lt;/tt&amp;gt; appears to have a third parameter (SourceMod sets it to true).&lt;br /&gt;
&lt;br /&gt;
=Removals=&lt;br /&gt;
==IVEngineServer Functions==&lt;br /&gt;
The &amp;lt;tt&amp;gt;IVEngineServer&amp;lt;/tt&amp;gt; functions &amp;lt;tt&amp;gt;PEntityOfEntIndex&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;IndexOfEdict&amp;lt;/tt&amp;gt; have been removed for faster code that can be inlined.  An example of how to re-implement this (as Valve has not released a new SDK yet):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
inline int IndexOfEdict(const edict_t *pEdict)&lt;br /&gt;
{&lt;br /&gt;
	return (int)(pEdict - gpGlobals-&amp;gt;baseEdict);&lt;br /&gt;
}&lt;br /&gt;
inline edict_t *PEntityOfEntIndex(int iEntIndex)&lt;br /&gt;
{&lt;br /&gt;
	if (iEntIndex &amp;gt;= 0 &amp;amp;&amp;amp; iEntIndex &amp;lt; gpGlobals-&amp;gt;maxEntities)&lt;br /&gt;
	{&lt;br /&gt;
		return (edict_t *)(gpGlobals-&amp;gt;baseEdict + iEntIndex);&lt;br /&gt;
	}&lt;br /&gt;
	return NULL;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ICVar functions==&lt;br /&gt;
The function &amp;lt;tt&amp;gt;GetCommands&amp;lt;/tt&amp;gt; has been removed.  In general, &amp;lt;tt&amp;gt;FindCommand&amp;lt;/tt&amp;gt; can be used as a replacement.&lt;br /&gt;
&lt;br /&gt;
However, if iterating across all ConCommandBases is a must, then use &amp;lt;tt&amp;gt;FactoryInternalIterator&amp;lt;/tt&amp;gt;.  This returns a pointer to &amp;lt;tt&amp;gt;ICvarIteratorInternal&amp;lt;/tt&amp;gt;.  An example of how to use these:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
ICvarIteratorInternal *iter = icvar-&amp;gt;FactoryInternalIterator();&lt;br /&gt;
iter-&amp;gt;SetFirst();&lt;br /&gt;
while (iter-&amp;gt;IsValid())&lt;br /&gt;
{&lt;br /&gt;
	ConCommandBase *pCmd = iter-&amp;gt;Get();&lt;br /&gt;
	Msg(&amp;quot;ConCommandBase: %s\n&amp;quot;, pCmd-&amp;gt;GetName());&lt;br /&gt;
	iter-&amp;gt;Next();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Annoyances=&lt;br /&gt;
The console will spew &amp;quot;VPK&amp;quot; warnings unless your file-backed KeyValues operations use relative paths instead of absolute paths.&lt;br /&gt;
&lt;br /&gt;
[[Category:Metamod:Source Development]]&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Virtual_Offsets_(Source_Mods)&amp;diff=6400</id>
		<title>Virtual Offsets (Source Mods)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Virtual_Offsets_(Source_Mods)&amp;diff=6400"/>
		<updated>2008-11-09T10:28:53Z</updated>

		<summary type="html">&lt;p&gt;DS: Added link to L4D player offsets&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Metamod:Source Development]]&lt;br /&gt;
== Calling virtual functions ==&lt;br /&gt;
I got this method from [[User:Mani|Mani]], who I believe got it from [[User:PM|Pavol Marko]]. Thank you!&lt;br /&gt;
&lt;br /&gt;
I hope to expand on an actual explanation when I have the time (and understand it better). Hopefully, someone can expand on this, but for now I'll just post the examples and a list of the CCSPlayer virtual function table offsets.&lt;br /&gt;
&lt;br /&gt;
== Offset Lists ==&lt;br /&gt;
==== Counter-Strike: Source ====&lt;br /&gt;
* [[CCSPlayer Offset List (Counter-Strike: Source)|CCSPlayer]]&lt;br /&gt;
* [[CBaseCombatWeapon Offset List (Counter-Strike: Source)|CBaseCombatWeapon]]&lt;br /&gt;
* [[CCSGameRules Offset List (Counter-Strike: Source) | CCSGameRules]]&lt;br /&gt;
* [[CBaseGrenade Offset List (Counter-Strike: Source) | CBaseGrenade]]&lt;br /&gt;
* [[CDEagle Offset List (Counter-Strike: Source) | CDEagle]]&lt;br /&gt;
* [[CBasePlayer Offset List (Counter-Strike: Source) | CBasePlayer]]&lt;br /&gt;
&lt;br /&gt;
==== Day of Defeat: Source ====&lt;br /&gt;
* [[CDODPlayer Offset List (Day of Defeat: Source)|CDODPlayer]]&lt;br /&gt;
&lt;br /&gt;
==== Dystopia ====&lt;br /&gt;
* [[CDYSPlayer Offset List (Dystopia)|CDYSPlayer]]&lt;br /&gt;
&lt;br /&gt;
==== Empires ====&lt;br /&gt;
* [[CSDKPlayer Offset List (Empires)|CSDKPlayer]]&lt;br /&gt;
&lt;br /&gt;
==== Fortress Forever ====&lt;br /&gt;
* [[CFFPlayer Offset List (Fortress Forever)|CFFPlayer]]&lt;br /&gt;
&lt;br /&gt;
==== Half-Life 2: Capture the Flag ====&lt;br /&gt;
* [[CHL2_Player Offset List (Half-Life 2: Capture the Flag)|CHL2_Player]]&lt;br /&gt;
&lt;br /&gt;
==== Half-Life 2: Deathmatch ====&lt;br /&gt;
* [[CHL2MP_Player Offset List (Half-Life 2: Deathmatch)|CHL2MP_Player]]&lt;br /&gt;
&lt;br /&gt;
==== Hidden: Source ====&lt;br /&gt;
* [[CSDKPlayer Offset List (Hidden: Source)|CSDKPlayer]]&lt;br /&gt;
&lt;br /&gt;
==== Insurgency ====&lt;br /&gt;
* [[CINSPlayer Offset List (Insurgency)|CINSPlayer]]&lt;br /&gt;
&lt;br /&gt;
==== Left 4 Dead ====&lt;br /&gt;
* [[CTerrorPlayer Offset List (Left 4 Dead)|CTerrorPlayer]]&lt;br /&gt;
&lt;br /&gt;
==== Obsidian Conflict ====&lt;br /&gt;
* [[CHL2MP_Player Offset List (Obsidian Conflict)|CHL2MP_Player]]&lt;br /&gt;
&lt;br /&gt;
==== Pirates, Vikings, and Knights II ====&lt;br /&gt;
* [[CPVK2Player Offset List (Pirates, Vikings, and Knights II)|CPVK2Player]]&lt;br /&gt;
&lt;br /&gt;
==== The Ship ====&lt;br /&gt;
* [[CShipPlayer Offset List (The Ship)|CShipPlayer]]&lt;br /&gt;
&lt;br /&gt;
==== SourceForts ====&lt;br /&gt;
* [[CHL2MP_Player Offset List (SourceForts)|CHL2MP_Player]]&lt;br /&gt;
&lt;br /&gt;
==== Synergy ====&lt;br /&gt;
* [[CHL2MP_Player Offset List (Synergy)|CHL2MP_Player]]&lt;br /&gt;
&lt;br /&gt;
==== Team Fortress 2 ====&lt;br /&gt;
* [[CTFPlayer Offset List (Team Fortress 2)|CTFPlayer]]&lt;br /&gt;
&lt;br /&gt;
==== Zombie Master ====&lt;br /&gt;
* [[CHL2MP_Player Offset List (Zombie Master)|CHL2MP_Player]]&lt;br /&gt;
&lt;br /&gt;
==== Zombie Panic: Source ====&lt;br /&gt;
* [[CHL2MP_Player Offset List (Zombie Panic: Source)|CHL2MP_Player]]&lt;br /&gt;
&lt;br /&gt;
== How to use the examples ==&lt;br /&gt;
&lt;br /&gt;
Basically, this lets you call any [[virtual function]] by knowing it's offset. A table is created for each class that lists the address of the function for each virtual function. This method takes advantage of that to call those addresses.&lt;br /&gt;
&lt;br /&gt;
Look at the examples below and edit to match the function you want to call:&lt;br /&gt;
Use the offset for the function you want to call in this line. ([[CCSPlayer_offset_list_(SourceMM)]])&lt;br /&gt;
&amp;lt;cpp&amp;gt;void *func = vtable[m_Off_GiveNamedItem];&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Change this line to match your return type and parameters:&lt;br /&gt;
&amp;lt;cpp&amp;gt;union {CBaseEntity *(VfuncEmptyClass::*mfpnew)(const char *, int );&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Call the original function with your parameters (change the return type to match the function you're calling):&lt;br /&gt;
&amp;lt;cpp&amp;gt;return (CBaseEntity *) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)(ItemName, iSubType);&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You'll need to add an empty class for the union. Something like this:&lt;br /&gt;
&amp;lt;cpp&amp;gt;class VfuncEmptyClass {};&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
These examples are for CSS. Mani has created a set of macros to make this easier. If you ask nicely, maybe he'll give them to you or let you post them here.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;datamap_t *VFuncs::GetDataDescMap(CBaseEntity *pThisPtr)&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_GetDataDescMap]; &lt;br /&gt;
&lt;br /&gt;
	union {datamap_t *(VfuncEmptyClass::*mfpnew)();&lt;br /&gt;
#ifndef __linux__&lt;br /&gt;
        void *addr;	} u; 	u.addr = func;&lt;br /&gt;
#else /* GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 */&lt;br /&gt;
			struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
	return (datamap_t *) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void VFuncs::SetModel(CBaseEntity *pThisPtr, const char *ModelName)&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_SetModel]; &lt;br /&gt;
&lt;br /&gt;
	union {void (VfuncEmptyClass::*mfpnew)(const char *);&lt;br /&gt;
	#ifndef __linux__&lt;br /&gt;
			void *addr;	} u; 	u.addr = func;&lt;br /&gt;
	#else // GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 &lt;br /&gt;
				struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	(void) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)(ModelName);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void VFuncs::Teleport(CBaseEntity *pThisPtr, const Vector *newPosition, const QAngle *newAngles, const Vector *newVelocity)&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_Teleport]; &lt;br /&gt;
&lt;br /&gt;
	union {void (VfuncEmptyClass::*mfpnew)(const Vector *, const QAngle *, const Vector *);&lt;br /&gt;
	#ifndef __linux__&lt;br /&gt;
			void *addr;	} u; 	u.addr = func;&lt;br /&gt;
	#else // GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 &lt;br /&gt;
				struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	(void) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)(newPosition, newAngles, newVelocity);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Vector VFuncs::EyePosition( CBaseEntity *pThisPtr )&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_EyePosition]; &lt;br /&gt;
&lt;br /&gt;
	union {Vector (VfuncEmptyClass::*mfpnew)( void );&lt;br /&gt;
	#ifndef __linux__&lt;br /&gt;
			void *addr;	} u; 	u.addr = func;&lt;br /&gt;
	#else // GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 &lt;br /&gt;
				struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	return (Vector) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)( );&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
QAngle &amp;amp;VFuncs::EyeAngles( CBaseEntity *pThisPtr )&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_EyeAngles]; &lt;br /&gt;
&lt;br /&gt;
	union {QAngle&amp;amp; (VfuncEmptyClass::*mfpnew)( void );&lt;br /&gt;
	#ifndef __linux__&lt;br /&gt;
			void *addr;	} u; 	u.addr = func;&lt;br /&gt;
	#else // GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 &lt;br /&gt;
				struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	return (QAngle&amp;amp;) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)( );&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void VFuncs::Ignite(CBaseEntity *pThisPtr, float flFlameLifetime, bool bNPCOnly, float flSize, bool bCalledByLevelDesigner)&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_Ignite]; &lt;br /&gt;
&lt;br /&gt;
	union {void (VfuncEmptyClass::*mfpnew)(float , bool , float , bool );&lt;br /&gt;
	#ifndef __linux__&lt;br /&gt;
			void *addr;	} u; 	u.addr = func;&lt;br /&gt;
	#else // GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 &lt;br /&gt;
				struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	(void) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)(flFlameLifetime, bNPCOnly, flSize, bCalledByLevelDesigner);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
CBaseEntity *VFuncs::GiveNamedItem(CBaseEntity *pThisPtr, const char *ItemName, int iSubType)&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_GiveNamedItem]; &lt;br /&gt;
&lt;br /&gt;
	union {CBaseEntity *(VfuncEmptyClass::*mfpnew)(const char *, int );&lt;br /&gt;
	#ifndef __linux__&lt;br /&gt;
			void *addr;	} u; 	u.addr = func;&lt;br /&gt;
	#else // GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 &lt;br /&gt;
				struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	return (CBaseEntity *) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)(ItemName, iSubType);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void VFuncs::CommitSuicide(CBaseEntity *pThisPtr)&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_CommitSuicide]; &lt;br /&gt;
&lt;br /&gt;
	union {CBaseEntity *(VfuncEmptyClass::*mfpnew)( void );&lt;br /&gt;
	#ifndef __linux__&lt;br /&gt;
			void *addr;	} u; 	u.addr = func;&lt;br /&gt;
	#else // GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 &lt;br /&gt;
				struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	(reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=CTerrorPlayer_Offset_List_(Left_4_Dead)&amp;diff=6399</id>
		<title>CTerrorPlayer Offset List (Left 4 Dead)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=CTerrorPlayer_Offset_List_(Left_4_Dead)&amp;diff=6399"/>
		<updated>2008-11-09T10:27:37Z</updated>

		<summary type="html">&lt;p&gt;DS: Probably going to change by release day&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Also for use when using [[Virtual Offsets (Source Mods)|virtual offsets]].&lt;br /&gt;
&lt;br /&gt;
These are the &amp;lt;b&amp;gt;Windows&amp;lt;/b&amp;gt; offsets. &amp;lt;b&amp;gt;Linux offsets are 1 greater.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The List ==&lt;br /&gt;
This comes from the symbol tables, so you'll have to look in the SDK for return types.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Last Updated 09 November 2008&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Auto reconstructed from vtable block @ 0x00F14020&lt;br /&gt;
// from &amp;quot;server_i486.so&amp;quot;, by ida_vtables.idc&lt;br /&gt;
0	CTerrorPlayer::~CTerrorPlayer()&lt;br /&gt;
1	CBaseEntity::SetRefEHandle(CBaseHandle  const&amp;amp;)&lt;br /&gt;
2	CBaseEntity::GetRefEHandle(void)const&lt;br /&gt;
3	CBaseEntity::GetCollideable(void)&lt;br /&gt;
4	CBaseEntity::GetNetworkable(void)&lt;br /&gt;
5	CBaseEntity::GetBaseEntity(void)&lt;br /&gt;
6	CBaseEntity::GetModelIndex(void)const&lt;br /&gt;
7	CBaseEntity::GetModelName(void)const&lt;br /&gt;
8	CCSPlayer::SetModelIndex(int)&lt;br /&gt;
9	CTerrorPlayer::GetServerClass(void)&lt;br /&gt;
10	CTerrorPlayer::YouForgotToImplementOrDeclareServerClass(void)&lt;br /&gt;
11	CTerrorPlayer::GetDataDescMap(void)&lt;br /&gt;
12	CBaseAnimating::TestCollision(Ray_t  const&amp;amp;,unsigned int,CGameTrace &amp;amp;)&lt;br /&gt;
13	CTerrorPlayer::TestHitboxes(Ray_t  const&amp;amp;,unsigned int,CGameTrace &amp;amp;)&lt;br /&gt;
14	CBaseEntity::ComputeWorldSpaceSurroundingBox(Vector *,Vector *)&lt;br /&gt;
15	CTerrorPlayer::ShouldCollide(int,int)const&lt;br /&gt;
16	CBaseEntity::SetOwnerEntity(CBaseEntity*)&lt;br /&gt;
17	CTerrorPlayer::ShouldTransmit(CCheckTransmitInfo  const*)&lt;br /&gt;
18	CBasePlayer::UpdateTransmitState(void)&lt;br /&gt;
19	CBaseCombatCharacter::SetTransmit(CCheckTransmitInfo *,bool)&lt;br /&gt;
20	CBasePlayer::GetTracerType(void)&lt;br /&gt;
21	CTerrorPlayer::Spawn(void)&lt;br /&gt;
22	CTerrorPlayer::Precache(void)&lt;br /&gt;
23	CBasePlayer::SetModel(char  const*)&lt;br /&gt;
24	CBaseMultiplayerPlayer::PostConstructor(char  const*)&lt;br /&gt;
25	CBaseEntity::PostClientActive(void)&lt;br /&gt;
26	CBaseEntity::ParseMapData(CEntityMapData *)&lt;br /&gt;
27	CBaseEntity::KeyValue(char  const*,char  const*)&lt;br /&gt;
28	CBaseEntity::KeyValue(char  const*,float)&lt;br /&gt;
29	CBaseEntity::KeyValue(char  const*,Vector  const&amp;amp;)&lt;br /&gt;
30	CBaseEntity::GetKeyValue(char  const*,char *,int)&lt;br /&gt;
31	CBasePlayer::Activate(void)&lt;br /&gt;
32	CBaseEntity::SetParent(CBaseEntity*,int)&lt;br /&gt;
33	CTerrorPlayer::ObjectCaps(void)&lt;br /&gt;
34	CTerrorPlayer::GetUsePriority(CBaseEntity *)&lt;br /&gt;
35	CBaseEntity::GetGlowEntity(void)&lt;br /&gt;
36	CBaseEntity::GetUseType(CBaseEntity*)&lt;br /&gt;
37	CBaseEntity::AcceptInput(char  const*,CBaseEntity*,CBaseEntity*,variant_t,int)&lt;br /&gt;
38	CBasePlayer::DrawDebugGeometryOverlays(void)&lt;br /&gt;
39	CBaseAnimating::DrawDebugTextOverlays(void)&lt;br /&gt;
40	CBasePlayer::Save(ISave &amp;amp;)&lt;br /&gt;
41	CBasePlayer::Restore(IRestore &amp;amp;)&lt;br /&gt;
42	CBasePlayer::ShouldSavePhysics(void)&lt;br /&gt;
43	CBaseEntity::OnSave(IEntitySaveUtils *)&lt;br /&gt;
44	CBasePlayer::OnRestore(void)&lt;br /&gt;
45	CBasePlayer::RequiredEdictIndex(void)&lt;br /&gt;
46	CBaseEntity::MoveDone(void)&lt;br /&gt;
47	CBaseEntity::Think(void)&lt;br /&gt;
48	CBasePlayer::NetworkStateChanged_m_nNextThinkTick(void)&lt;br /&gt;
49	CBasePlayer::NetworkStateChanged_m_nNextThinkTick(void *)&lt;br /&gt;
50	CBaseAnimating::GetBaseAnimating(void)&lt;br /&gt;
51	CTerrorPlayer::GetResponseSystem(void)&lt;br /&gt;
52	CAI_ExpresserHost&amp;lt;CBasePlayer&amp;gt;::DispatchResponse(char  const*)&lt;br /&gt;
53	CBasePlayer::Classify(void)&lt;br /&gt;
54	CBaseEntity::DeathNotice(CBaseEntity*)&lt;br /&gt;
55	CTerrorPlayer::ShouldAttractAutoAim(CBaseEntity *)&lt;br /&gt;
56	CBaseEntity::GetAutoAimRadius(void)&lt;br /&gt;
57	CBaseEntity::GetAutoAimCenter(void)&lt;br /&gt;
58	CBaseEntity::GetBeamTraceFilter(void)&lt;br /&gt;
59	CBaseEntity::PassesDamageFilter(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
60	CCSPlayer::TraceAttack(CTakeDamageInfo  const&amp;amp;,Vector  const&amp;amp;,CGameTrace *)&lt;br /&gt;
61	CBaseEntity::CanBeHitByMeleeAttack(CBaseEntity*)&lt;br /&gt;
62	CTerrorPlayer::OnTakeDamage(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
63	CTerrorPlayer::TakeHealth(float,int)&lt;br /&gt;
64	CBaseEntity::IsAlive(void)const&lt;br /&gt;
65	CTerrorPlayer::Event_Killed(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
66	CBasePlayer::Event_KilledOther(CBaseEntity *,CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
67	CBaseCombatCharacter::BloodColor(void)&lt;br /&gt;
68	CBaseEntity::IsTriggered(CBaseEntity*)&lt;br /&gt;
69	CBaseEntity::IsNPC(void)const&lt;br /&gt;
70	CBaseCombatCharacter::MyCombatCharacterPointer(void)&lt;br /&gt;
71	CBaseEntity::MyNextBotPointer(void)&lt;br /&gt;
72	CBaseEntity::MyInfectedPointer(void)&lt;br /&gt;
73	CBaseEntity::GetDelay(void)&lt;br /&gt;
74	CBaseEntity::IsMoving(void)&lt;br /&gt;
75	CBaseEntity::DamageDecal(int,int)&lt;br /&gt;
76	CBaseEntity::DecalTrace(CGameTrace *,char  const*)&lt;br /&gt;
77	CBaseEntity::ImpactTrace(CGameTrace *,int,char *)&lt;br /&gt;
78	CBaseEntity::OnControls(CBaseEntity*)&lt;br /&gt;
79	CBaseEntity::HasTarget(string_t)&lt;br /&gt;
80	CBasePlayer::IsPlayer(void)const&lt;br /&gt;
81	CBasePlayer::IsNetClient(void)const&lt;br /&gt;
82	CBaseEntity::IsTemplate(void)&lt;br /&gt;
83	CBaseEntity::IsBaseObject(void)const&lt;br /&gt;
84	CBaseEntity::IsBaseCombatWeapon(void)const&lt;br /&gt;
85	CBaseEntity::MyCombatWeaponPointer(void)&lt;br /&gt;
86	CBaseEntity::GetServerVehicle(void)&lt;br /&gt;
87	CBaseEntity::IsViewable(void)&lt;br /&gt;
88	CTerrorPlayer::ChangeTeam(int)&lt;br /&gt;
89	CBaseEntity::OnEntityEvent(EntityEvent_t,void *)&lt;br /&gt;
90	CBaseEntity::CanStandOn(CBaseEntity*)const&lt;br /&gt;
91	CBaseEntity::CanStandOn(edict_t *)const&lt;br /&gt;
92	CBaseEntity::GetEnemy(void)&lt;br /&gt;
93	CBaseEntity::GetEnemy(void)const&lt;br /&gt;
94	CBaseEntity::Use(CBaseEntity*,CBaseEntity*,USE_TYPE,float)&lt;br /&gt;
95	CBaseEntity::StartTouch(CBaseEntity*)&lt;br /&gt;
96	CTerrorPlayer::Touch(CBaseEntity *)&lt;br /&gt;
97	CBaseEntity::EndTouch(CBaseEntity*)&lt;br /&gt;
98	CBaseEntity::StartBlocked(CBaseEntity*)&lt;br /&gt;
99	CBaseEntity::Blocked(CBaseEntity*)&lt;br /&gt;
100	CBaseEntity::EndBlocked(void)&lt;br /&gt;
101	CBasePlayer::PhysicsSimulate(void)&lt;br /&gt;
102	CBasePlayer::UpdateOnRemove(void)&lt;br /&gt;
103	CBaseEntity::StopLoopingSounds(void)&lt;br /&gt;
104	CBaseEntity::SUB_AllowedToFade(void)&lt;br /&gt;
105	CTerrorPlayer::Teleport(Vector  const*,QAngle  const*,Vector  const*)&lt;br /&gt;
106	CBaseEntity::NotifySystemEvent(CBaseEntity*,notify_system_event_t,notify_system_event_params_t  const&amp;amp;)&lt;br /&gt;
107	CBasePlayer::MakeTracer(Vector  const&amp;amp;,CGameTrace  const&amp;amp;,int)&lt;br /&gt;
108	CBaseEntity::GetTracerAttachment(void)&lt;br /&gt;
109	CBaseEntity::FireBullets(FireBulletsInfo_t  const&amp;amp;)&lt;br /&gt;
110	CBasePlayer::DoImpactEffect(CGameTrace &amp;amp;,int)&lt;br /&gt;
111	CBaseEntity::Respawn(void)&lt;br /&gt;
112	CBaseEntity::IsLockedByMaster(void)&lt;br /&gt;
113	CTerrorPlayer::ModifyOrAppendCriteria(AI_CriteriaSet &amp;amp;)&lt;br /&gt;
114	CTerrorPlayer::ModifyOrAppendDerivedCriteria(AI_CriteriaSet &amp;amp;)&lt;br /&gt;
115	CTerrorPlayer::NetworkStateChanged_m_iMaxHealth(void)&lt;br /&gt;
116	CTerrorPlayer::NetworkStateChanged_m_iMaxHealth(void *)&lt;br /&gt;
117	CBasePlayer::NetworkStateChanged_m_iHealth(void)&lt;br /&gt;
118	CBasePlayer::NetworkStateChanged_m_iHealth(void *)&lt;br /&gt;
119	CBasePlayer::NetworkStateChanged_m_lifeState(void)&lt;br /&gt;
120	CBasePlayer::NetworkStateChanged_m_lifeState(void *)&lt;br /&gt;
121	CBaseEntity::NetworkStateChanged_m_takedamage(void)&lt;br /&gt;
122	CBaseEntity::NetworkStateChanged_m_takedamage(void *)&lt;br /&gt;
123	CBaseEntity::GetDamageType(void)const&lt;br /&gt;
124	CBaseEntity::GetDamage(void)&lt;br /&gt;
125	CBaseEntity::SetDamage(float)&lt;br /&gt;
126	CBasePlayer::EyePosition(void)&lt;br /&gt;
127	CBasePlayer::EyeAngles(void)&lt;br /&gt;
128	CBasePlayer::LocalEyeAngles(void)&lt;br /&gt;
129	CBaseEntity::EarPosition(void)&lt;br /&gt;
130	CBasePlayer::BodyTarget(Vector  const&amp;amp;,bool)&lt;br /&gt;
131	CBaseEntity::HeadTarget(Vector  const&amp;amp;)&lt;br /&gt;
132	CBaseEntity::GetVectors(Vector *,Vector *,Vector *)const&lt;br /&gt;
133	CBaseEntity::GetViewOffset(void)const&lt;br /&gt;
134	CBaseEntity::SetViewOffset(Vector  const&amp;amp;)&lt;br /&gt;
135	CBasePlayer::GetSmoothedVelocity(void)&lt;br /&gt;
136	CBaseAnimating::GetVelocity(Vector *,Vector *)&lt;br /&gt;
137	CTerrorPlayer::GetFriction(void)const&lt;br /&gt;
138	CBaseCombatCharacter::FVisible(CBaseEntity *,int,CBaseEntity **)&lt;br /&gt;
139	CBaseCombatCharacter::FVisible(Vector  const&amp;amp;,int,CBaseEntity **)&lt;br /&gt;
140	CBaseEntity::CanBeSeenBy(CAI_BaseNPC *)&lt;br /&gt;
141	CBaseEntity::GetAttackDamageScale(CBaseEntity*)&lt;br /&gt;
142	CBaseEntity::GetReceivedDamageScale(CBaseEntity*)&lt;br /&gt;
143	CTerrorPlayer::OnGroundChanged(CBaseEntity *,CBaseEntity *)&lt;br /&gt;
144	CBaseEntity::GetGroundVelocityToApply(Vector &amp;amp;)&lt;br /&gt;
145	CBaseEntity::PhysicsSplash(Vector  const&amp;amp;,Vector  const&amp;amp;,float,float)&lt;br /&gt;
146	CBaseEntity::Splash(void)&lt;br /&gt;
147	CBaseEntity::WorldSpaceCenter(void)const&lt;br /&gt;
148	CCSPlayer::GetSoundEmissionOrigin(void)const&lt;br /&gt;
149	CBaseEntity::CreateVPhysics(void)&lt;br /&gt;
150	CBaseEntity::ForceVPhysicsCollide(CBaseEntity*)&lt;br /&gt;
151	CBasePlayer::VPhysicsDestroyObject(void)&lt;br /&gt;
152	CBasePlayer::VPhysicsUpdate(IPhysicsObject *)&lt;br /&gt;
153	CBaseEntity::VPhysicsTakeDamage(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
154	CBaseCombatCharacter::VPhysicsShadowCollision(int,gamevcollisionevent_t *)&lt;br /&gt;
155	CTerrorPlayer::VPhysicsShadowUpdate(IPhysicsObject *)&lt;br /&gt;
156	CBasePlayer::VPhysicsCollision(int,gamevcollisionevent_t *)&lt;br /&gt;
157	CBaseEntity::VPhysicsFriction(IPhysicsObject *,float,int,int)&lt;br /&gt;
158	CBaseEntity::UpdatePhysicsShadowToCurrentPosition(float)&lt;br /&gt;
159	CBaseEntity::VPhysicsGetObjectList(IPhysicsObject **,int)&lt;br /&gt;
160	CBaseEntity::VPhysicsIsFlesh(void)&lt;br /&gt;
161	CBaseEntity::CanPushEntity(CBaseEntity*)const&lt;br /&gt;
162	CBaseEntity::HasPhysicsAttacker(float)&lt;br /&gt;
163	CBasePlayer::PhysicsSolidMaskForEntity(void)const&lt;br /&gt;
164	CBaseEntity::ResolveFlyCollisionCustom(CGameTrace &amp;amp;,Vector &amp;amp;)&lt;br /&gt;
165	CBaseEntity::PerformCustomPhysics(Vector *,Vector *,QAngle *,QAngle *)&lt;br /&gt;
166	CBaseAnimating::GetStepOrigin(void)const&lt;br /&gt;
167	CBaseAnimating::GetStepAngles(void)const&lt;br /&gt;
168	CBaseEntity::ShouldDrawWaterImpacts(void)&lt;br /&gt;
169	CBasePlayer::NetworkStateChanged_m_fFlags(void)&lt;br /&gt;
170	CBasePlayer::NetworkStateChanged_m_fFlags(void *)&lt;br /&gt;
171	CBasePlayer::NetworkStateChanged_m_nWaterLevel(void)&lt;br /&gt;
172	CBasePlayer::NetworkStateChanged_m_nWaterLevel(void *)&lt;br /&gt;
173	CBasePlayer::NetworkStateChanged_m_hGroundEntity(void)&lt;br /&gt;
174	CBasePlayer::NetworkStateChanged_m_hGroundEntity(void *)&lt;br /&gt;
175	CBasePlayer::NetworkStateChanged_m_vecBaseVelocity(void)&lt;br /&gt;
176	CBasePlayer::NetworkStateChanged_m_vecBaseVelocity(void *)&lt;br /&gt;
177	CBasePlayer::NetworkStateChanged_m_flFriction(void)&lt;br /&gt;
178	CBasePlayer::NetworkStateChanged_m_flFriction(void *)&lt;br /&gt;
179	CBasePlayer::NetworkStateChanged_m_vecVelocity(void)&lt;br /&gt;
180	CBasePlayer::NetworkStateChanged_m_vecVelocity(void *)&lt;br /&gt;
181	CBaseEntity::NetworkStateChanged_m_bClientSideRagdoll(void)&lt;br /&gt;
182	CBaseEntity::NetworkStateChanged_m_bClientSideRagdoll(void *)&lt;br /&gt;
183	CBasePlayer::NetworkStateChanged_m_vecViewOffset(void)&lt;br /&gt;
184	CBasePlayer::NetworkStateChanged_m_vecViewOffset(void *)&lt;br /&gt;
185	CBaseAnimating::GetIdealSpeed(void)const&lt;br /&gt;
186	CBaseAnimating::GetIdealAccel(void)const&lt;br /&gt;
187	CBaseAnimatingOverlay::StudioFrameAdvance(void)&lt;br /&gt;
188	CBaseAnimating::OnSequenceSet(int)&lt;br /&gt;
189	CBaseAnimating::IsActivityFinished(void)&lt;br /&gt;
190	CBaseAnimating::GetSequenceGroundSpeed(CStudioHdr *,int)&lt;br /&gt;
191	CBaseAnimating::ClampRagdollForce(Vector  const&amp;amp;,Vector*)&lt;br /&gt;
192	CBaseAnimating::BecomeRagdollOnClient(Vector  const&amp;amp;)&lt;br /&gt;
193	CBaseAnimating::IsRagdoll(void)&lt;br /&gt;
194	CBaseAnimating::CanBecomeRagdoll(void)&lt;br /&gt;
195	CBaseAnimatingOverlay::GetSkeleton(CStudioHdr *,Vector *,QuaternionAligned *,int)&lt;br /&gt;
196	CBaseAnimating::GetBoneTransform(int,matrix3x4_t &amp;amp;)&lt;br /&gt;
197	CBaseAnimating::SetupBones(matrix3x4_t *,int)&lt;br /&gt;
198	CBaseAnimating::CalculateIKLocks(float)&lt;br /&gt;
199	CBaseAnimatingOverlay::DispatchAnimEvents(CBaseAnimating *)&lt;br /&gt;
200	CTerrorPlayer::HandleAnimEvent(animevent_t *)&lt;br /&gt;
201	CBaseAnimating::PopulatePoseParameters(void)&lt;br /&gt;
202	CBaseAnimating::GetAttachment(int,matrix3x4_t &amp;amp;)&lt;br /&gt;
203	CBaseAnimating::InitBoneControllers(void)&lt;br /&gt;
204	CBaseAnimating::GetGroundSpeedVelocity(void)&lt;br /&gt;
205	CBaseAnimating::IsViewModel(void)const&lt;br /&gt;
206	CTerrorPlayer::Ignite(float,bool,float,bool)&lt;br /&gt;
207	CBaseAnimating::IgniteLifetime(float)&lt;br /&gt;
208	CBaseAnimating::IgniteNumHitboxFires(int)&lt;br /&gt;
209	CBaseAnimating::IgniteHitboxFireScale(float)&lt;br /&gt;
210	CTerrorPlayer::Extinguish(void)&lt;br /&gt;
211	CBaseAnimating::SetLightingOrigin(CBaseEntity *)&lt;br /&gt;
212	CBaseFlex::SetViewtarget(Vector  const&amp;amp;)&lt;br /&gt;
213	CBaseFlex::StartSceneEvent(CSceneEventInfo *,CChoreoScene *,CChoreoEvent *,CChoreoActor *,CBaseEntity *)&lt;br /&gt;
214	CBaseFlex::ProcessSceneEvents(void)&lt;br /&gt;
215	CBaseFlex::ProcessSceneEvent(CSceneEventInfo *,CChoreoScene *,CChoreoEvent *)&lt;br /&gt;
216	CBaseFlex::ClearSceneEvent(CSceneEventInfo *,bool,bool)&lt;br /&gt;
217	CBaseFlex::CheckSceneEventCompletion(CSceneEventInfo *,float,CChoreoScene *,CChoreoEvent *)&lt;br /&gt;
218	CTerrorPlayer::PlayScene(char  const*,float,AI_Response *,IRecipientFilter *)&lt;br /&gt;
219	CBaseFlex::PlayAutoGeneratedSoundScene(char  const*)&lt;br /&gt;
220	CBasePlayer::GetPhysicsImpactDamageTable(void)&lt;br /&gt;
221	CBaseCombatCharacter::FInViewCone(CBaseEntity *)&lt;br /&gt;
222	CBaseCombatCharacter::FInViewCone(Vector  const&amp;amp;)&lt;br /&gt;
223	CBaseCombatCharacter::FInAimCone(CBaseEntity *)&lt;br /&gt;
224	CBaseCombatCharacter::FInAimCone(Vector  const&amp;amp;)&lt;br /&gt;
225	CBaseCombatCharacter::ShouldShootMissTarget(CBaseCombatCharacter*)&lt;br /&gt;
226	CBaseCombatCharacter::FindMissTarget(void)&lt;br /&gt;
227	CBaseCombatCharacter::HandleInteraction(int,void *,CBaseCombatCharacter*)&lt;br /&gt;
228	CBasePlayer::BodyAngles(void)&lt;br /&gt;
229	CBaseCombatCharacter::BodyDirection2D(void)&lt;br /&gt;
230	CBaseCombatCharacter::BodyDirection3D(void)&lt;br /&gt;
231	CBaseCombatCharacter::HeadDirection2D(void)&lt;br /&gt;
232	CBaseCombatCharacter::HeadDirection3D(void)&lt;br /&gt;
233	CBaseCombatCharacter::EyeDirection2D(void)&lt;br /&gt;
234	CBaseCombatCharacter::EyeDirection3D(void)&lt;br /&gt;
235	CBaseCombatCharacter::IsHiddenByFog(Vector  const&amp;amp;)const&lt;br /&gt;
236	CBaseCombatCharacter::IsHiddenByFog(CBaseEntity *)const&lt;br /&gt;
237	CBaseCombatCharacter::IsHiddenByFog(float)const&lt;br /&gt;
238	CBaseCombatCharacter::GetFogObscuredRatio(Vector  const&amp;amp;)const&lt;br /&gt;
239	CBaseCombatCharacter::GetFogObscuredRatio(CBaseEntity *)const&lt;br /&gt;
240	CBaseCombatCharacter::GetFogObscuredRatio(float)const&lt;br /&gt;
241	CBaseCombatCharacter::GetFogParams(fogparams_t *)const&lt;br /&gt;
242	CBaseCombatCharacter::IsLookingTowards(CBaseEntity  const*,float)const&lt;br /&gt;
243	CBaseCombatCharacter::IsLookingTowards(Vector  const&amp;amp;,float)const&lt;br /&gt;
244	CBaseCombatCharacter::IsInFieldOfView(CBaseEntity *)const&lt;br /&gt;
245	CBaseCombatCharacter::IsInFieldOfView(Vector  const&amp;amp;)const&lt;br /&gt;
246	CBaseCombatCharacter::IsLineOfSightClear(CBaseEntity *,CBaseCombatCharacter::LineOfSightCheckType)const&lt;br /&gt;
247	CBaseCombatCharacter::IsLineOfSightClear(Vector  const&amp;amp;,CBaseCombatCharacter::LineOfSightCheckType,CBaseEntity *)const&lt;br /&gt;
248	CTerrorPlayer::OnFootstep(Vector  const&amp;amp;,bool,bool,bool,bool)&lt;br /&gt;
249	CCSPlayer::GetGroundSurface(void)const&lt;br /&gt;
250	CTerrorPlayer::GetFootstepSound(char  const*,bool,float,bool)const&lt;br /&gt;
251	CTerrorPlayer::AreFootstepsAudible(void)const&lt;br /&gt;
252	CTerrorPlayer::IsFootstepAudible(float,bool)const&lt;br /&gt;
253	CBaseCombatCharacter::GetFootstepRunThreshold(void)const&lt;br /&gt;
254	CBaseCombatCharacter::GiveAmmo(int,int,bool)&lt;br /&gt;
255	CBaseCombatCharacter::NPC_TranslateActivity(Activity)&lt;br /&gt;
256	CBaseCombatCharacter::Weapon_TranslateActivity(Activity,bool *)&lt;br /&gt;
257	CBaseCombatCharacter::Weapon_FrameUpdate(void)&lt;br /&gt;
258	CBaseCombatCharacter::Weapon_HandleAnimEvent(animevent_t *)&lt;br /&gt;
259	CTerrorPlayer::Weapon_CanUse(CBaseCombatWeapon *)&lt;br /&gt;
260	CTerrorPlayer::Weapon_Equip(CBaseCombatWeapon *)&lt;br /&gt;
261	CBaseCombatCharacter::Weapon_EquipAmmoOnly(CBaseCombatWeapon *)&lt;br /&gt;
262	CBasePlayer::Weapon_Drop(CBaseCombatWeapon *,Vector  const*,Vector  const*)&lt;br /&gt;
263	CCSPlayer::Weapon_Switch(CBaseCombatWeapon *,int)&lt;br /&gt;
264	CTerrorPlayer::Weapon_ShootPosition(void)&lt;br /&gt;
265	CCSPlayer::Weapon_CanSwitchTo(CBaseCombatWeapon *)&lt;br /&gt;
266	CBaseCombatCharacter::Weapon_SlotOccupied(CBaseCombatWeapon *)&lt;br /&gt;
267	CBaseCombatCharacter::Weapon_GetSlot(int)const&lt;br /&gt;
268	CBaseCombatCharacter::AddPlayerItem(CBaseCombatWeapon *)&lt;br /&gt;
269	CBasePlayer::RemovePlayerItem(CBaseCombatWeapon *)&lt;br /&gt;
270	CBaseCombatCharacter::CanBecomeServerRagdoll(void)&lt;br /&gt;
271	CTerrorPlayer::OnTakeDamage_Alive(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
272	CBaseCombatCharacter::OnTakeDamage_Dying(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
273	CBaseCombatCharacter::OnTakeDamage_Dead(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
274	CBaseCombatCharacter::GetAliveDuration(void)const&lt;br /&gt;
275	CBaseCombatCharacter::OnFriendDamaged(CBaseCombatCharacter*,CBaseEntity *)&lt;br /&gt;
276	CBaseCombatCharacter::NotifyFriendsOfDamage(CBaseEntity *)&lt;br /&gt;
277	CBaseCombatCharacter::HasEverBeenInjured(int)const&lt;br /&gt;
278	CBaseCombatCharacter::GetTimeSinceLastInjury(int)const&lt;br /&gt;
279	CBaseCombatCharacter::OnPlayerKilledOther(CBaseEntity *,CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
280	CBaseCombatCharacter::GetDeathActivity(void)&lt;br /&gt;
281	CBaseCombatCharacter::CorpseGib(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
282	CBaseCombatCharacter::CorpseFade(void)&lt;br /&gt;
283	CBaseCombatCharacter::HasHumanGibs(void)&lt;br /&gt;
284	CBaseCombatCharacter::HasAlienGibs(void)&lt;br /&gt;
285	CBaseCombatCharacter::ShouldGib(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
286	CBaseCombatCharacter::OnKilledNPC(CBaseCombatCharacter*)&lt;br /&gt;
287	CBaseCombatCharacter::Event_Gibbed(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
288	CBasePlayer::Event_Dying(void)&lt;br /&gt;
289	CBaseCombatCharacter::BecomeRagdoll(CTakeDamageInfo  const&amp;amp;,Vector  const&amp;amp;)&lt;br /&gt;
290	CBaseCombatCharacter::FixupBurningServerRagdoll(CBaseEntity *)&lt;br /&gt;
291	CBaseCombatCharacter::BecomeRagdollBoogie(CBaseEntity *,Vector  const&amp;amp;,float,int)&lt;br /&gt;
292	CBaseCombatCharacter::CheckTraceHullAttack(float,Vector  const&amp;amp;,Vector  const&amp;amp;,int,int,float,bool)&lt;br /&gt;
293	CBaseCombatCharacter::CheckTraceHullAttack(Vector  const&amp;amp;,Vector  const&amp;amp;,Vector  const&amp;amp;,Vector  const&amp;amp;,int,int,float,bool)&lt;br /&gt;
294	CBaseCombatCharacter::PushawayTouch(CBaseEntity *)&lt;br /&gt;
295	CBaseCombatCharacter::IRelationType(CBaseEntity *)&lt;br /&gt;
296	CBaseCombatCharacter::IRelationPriority(CBaseEntity *)&lt;br /&gt;
297	CBasePlayer::IsInAVehicle(void)const&lt;br /&gt;
298	CBasePlayer::GetVehicle(void)&lt;br /&gt;
299	CBasePlayer::GetVehicleEntity(void)&lt;br /&gt;
300	CBaseCombatCharacter::ExitVehicle(void)&lt;br /&gt;
301	CBaseCombatCharacter::CalcWeaponProficiency(CBaseCombatWeapon *)&lt;br /&gt;
302	CBaseCombatCharacter::GetAttackSpread(CBaseCombatWeapon *,CBaseEntity *)&lt;br /&gt;
303	CBaseCombatCharacter::GetSpreadBias(CBaseCombatWeapon *,CBaseEntity *)&lt;br /&gt;
304	CBasePlayer::DoMuzzleFlash(void)&lt;br /&gt;
305	CBaseCombatCharacter::AddEntityRelationship(CBaseEntity *,Disposition_t,int)&lt;br /&gt;
306	CBaseCombatCharacter::RemoveEntityRelationship(CBaseEntity *)&lt;br /&gt;
307	CBaseCombatCharacter::AddClassRelationship(Class_T,Disposition_t,int)&lt;br /&gt;
308	CBaseCombatCharacter::OnChangeActiveWeapon(CBaseCombatWeapon *,CBaseCombatWeapon *)&lt;br /&gt;
309	CTerrorPlayer::GetLastKnownArea(void)const&lt;br /&gt;
310	CTerrorPlayer::IsAreaTraversable(CNavArea  const*)const&lt;br /&gt;
311	CBaseCombatCharacter::ClearLastKnownArea(void)&lt;br /&gt;
312	CBaseCombatCharacter::UpdateLastKnownArea(void)&lt;br /&gt;
313	CTerrorPlayer::OnNavAreaChanged(CNavArea *,CNavArea *)&lt;br /&gt;
314	CTerrorPlayer::OnNavAreaRemoved(CNavArea *)&lt;br /&gt;
315	CTerrorPlayer::GetClass(void)const&lt;br /&gt;
316	CTerrorPlayer::CanBeA(ZombieClassType)const&lt;br /&gt;
317	CTerrorPlayer::OnPursuedBy(INextBot *)&lt;br /&gt;
318	CTerrorPlayer::IsGhost(void)const&lt;br /&gt;
319	CBasePlayer::NetworkStateChanged_m_iAmmo(void)&lt;br /&gt;
320	CBasePlayer::NetworkStateChanged_m_iAmmo(void *)&lt;br /&gt;
321	CCSPlayer::CreateViewModel(int)&lt;br /&gt;
322	CCSPlayer::SetupVisibility(CBaseEntity *,unsigned char *,int)&lt;br /&gt;
323	CTerrorPlayer::WantsLagCompensationOnEntity(CBaseAnimatingOverlay  const*,CUserCmd  const*,CBitVec&amp;lt;2048&amp;gt;  const*)const&lt;br /&gt;
324	CBasePlayer::SharedSpawn(void)&lt;br /&gt;
325	CBasePlayer::ForceRespawn(void)&lt;br /&gt;
326	CTerrorPlayer::InitialSpawn(void)&lt;br /&gt;
327	CBasePlayer::InitHUD(void)&lt;br /&gt;
328	CCSPlayer::ShowViewPortPanel(char  const*,bool,KeyValues *)&lt;br /&gt;
329	CCSPlayer::PlayerDeathThink(void)&lt;br /&gt;
330	CBasePlayer::Jump(void)&lt;br /&gt;
331	CBasePlayer::Duck(void)&lt;br /&gt;
332	CTerrorPlayer::Cough(CBasePlayer *)&lt;br /&gt;
333	CTerrorPlayer::PreThink(void)&lt;br /&gt;
334	CTerrorPlayer::PostThink(void)&lt;br /&gt;
335	CBasePlayer::DamageEffect(float,int)&lt;br /&gt;
336	CCSPlayer::OnDamagedByExplosion(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
337	CBasePlayer::ShouldFadeOnDeath(void)&lt;br /&gt;
338	CBasePlayer::IsFakeClient(void)const&lt;br /&gt;
339	CTerrorPlayer::GetCharacterDisplayName(void)&lt;br /&gt;
340	CBasePlayer::GetPlayerMins(void)const&lt;br /&gt;
341	CBasePlayer::GetPlayerMaxs(void)const&lt;br /&gt;
342	CTerrorPlayer::UpdateCollisionBounds(void)&lt;br /&gt;
343	CBasePlayer::CalcRoll(QAngle  const&amp;amp;,Vector  const&amp;amp;,float,float)&lt;br /&gt;
344	CBasePlayer::PackDeadPlayerItems(void)&lt;br /&gt;
345	CCSPlayer::RemoveAllItems(bool)&lt;br /&gt;
346	CTerrorPlayer::IsRunning(void)const&lt;br /&gt;
347	CBasePlayer::Weapon_SetLast(CBaseCombatWeapon *)&lt;br /&gt;
348	CBasePlayer::Weapon_ShouldSetLast(CBaseCombatWeapon *,CBaseCombatWeapon *)&lt;br /&gt;
349	CBasePlayer::Weapon_ShouldSelectItem(CBaseCombatWeapon *)&lt;br /&gt;
350	CBasePlayer::UpdateClientData(void)&lt;br /&gt;
351	CBasePlayer::ExitLadder(void)&lt;br /&gt;
352	CBasePlayer::GetLadderSurface(Vector  const&amp;amp;)&lt;br /&gt;
353	CTerrorPlayer::IsAbleToAutoCenterOnLadders(void)const&lt;br /&gt;
354	CBasePlayer::SetFlashlightEnabled(bool)&lt;br /&gt;
355	CCSPlayer::FlashlightIsOn(void)&lt;br /&gt;
356	CTerrorPlayer::FlashlightTurnOn(bool)&lt;br /&gt;
357	CTerrorPlayer::FlashlightTurnOff(bool)&lt;br /&gt;
358	CBasePlayer::IsIlluminatedByFlashlight(CBaseEntity *,float *)&lt;br /&gt;
359	CCSPlayer::UpdateStepSound(surfacedata_t *,Vector  const&amp;amp;,Vector  const&amp;amp;)&lt;br /&gt;
360	CCSPlayer::PlayStepSound(Vector &amp;amp;,surfacedata_t *,float,bool)&lt;br /&gt;
361	CBasePlayer::GetStepSoundVelocities(float *,float *)&lt;br /&gt;
362	CBasePlayer::SetStepSoundTime(stepsoundtimes_t,bool)&lt;br /&gt;
363	CTerrorPlayer::DeathSound(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
364	CCSPlayer::SetAnimation(PLAYER_ANIM)&lt;br /&gt;
365	CTerrorPlayer::OnMainActivityComplete(Activity,Activity)&lt;br /&gt;
366	CTerrorPlayer::OnMainActivityInterrupted(Activity,Activity)&lt;br /&gt;
367	CTerrorPlayer::ImpulseCommands(void)&lt;br /&gt;
368	CTerrorPlayer::CheatImpulseCommands(int)&lt;br /&gt;
369	CTerrorPlayer::ClientCommand(CCommand  const&amp;amp;)&lt;br /&gt;
370	CBasePlayer::StartObserverMode(int)&lt;br /&gt;
371	CBasePlayer::StopObserverMode(void)&lt;br /&gt;
372	CBasePlayer::ModeWantsSpectatorGUI(int)&lt;br /&gt;
373	CTerrorPlayer::SetObserverMode(int)&lt;br /&gt;
374	CBasePlayer::GetObserverMode(void)&lt;br /&gt;
375	CTerrorPlayer::SetObserverTarget(CBaseEntity *)&lt;br /&gt;
376	CBasePlayer::ObserverUse(bool)&lt;br /&gt;
377	CBasePlayer::GetObserverTarget(void)&lt;br /&gt;
378	CTerrorPlayer::FindNextObserverTarget(bool)&lt;br /&gt;
379	CCSPlayer::GetNextObserverSearchStartPoint(bool)&lt;br /&gt;
380	CTerrorPlayer::PassesObserverFilter(CBaseEntity  const*)&lt;br /&gt;
381	CTerrorPlayer::IsValidObserverTarget(CBaseEntity *)&lt;br /&gt;
382	CBasePlayer::CheckObserverSettings(void)&lt;br /&gt;
383	CBasePlayer::JumptoPosition(Vector  const&amp;amp;,QAngle  const&amp;amp;)&lt;br /&gt;
384	CBasePlayer::ForceObserverMode(int)&lt;br /&gt;
385	CCSPlayer::ResetObserverMode(void)&lt;br /&gt;
386	CBasePlayer::ValidateCurrentObserverTarget(void)&lt;br /&gt;
387	CBasePlayer::AttemptToExitFreezeCam(void)&lt;br /&gt;
388	CTerrorPlayer::WantsRoamingObserverMode(void)const&lt;br /&gt;
389	CCSPlayer::StartReplayMode(float,float,int)&lt;br /&gt;
390	CCSPlayer::StopReplayMode(void)&lt;br /&gt;
391	CBasePlayer::GetDelayTicks(void)&lt;br /&gt;
392	CBasePlayer::GetReplayEntity(void)&lt;br /&gt;
393	CBasePlayer::CreateCorpse(void)&lt;br /&gt;
394	CTerrorPlayer::EntSelectSpawnPoint(void)&lt;br /&gt;
395	CBasePlayer::GetInVehicle(IServerVehicle *,int)&lt;br /&gt;
396	CBasePlayer::LeaveVehicle(Vector  const&amp;amp;,QAngle  const&amp;amp;)&lt;br /&gt;
397	CBasePlayer::OnVehicleStart(void)&lt;br /&gt;
398	CBasePlayer::OnVehicleEnd(Vector &amp;amp;)&lt;br /&gt;
399	CTerrorPlayer::BumpWeapon(CBaseCombatWeapon *)&lt;br /&gt;
400	CBasePlayer::SelectLastItem(void)&lt;br /&gt;
401	CBasePlayer::SelectItem(char  const*,int)&lt;br /&gt;
402	CBasePlayer::SelectItem(CBaseCombatWeapon *)&lt;br /&gt;
403	CTerrorPlayer::ItemPostFrame(void)&lt;br /&gt;
404	CTerrorPlayer::GiveNamedItem(char  const*,int,bool)&lt;br /&gt;
405	CBasePlayer::CheckTrainUpdate(void)&lt;br /&gt;
406	CBasePlayer::SetPlayerUnderwater(bool)&lt;br /&gt;
407	CTerrorPlayer::PlayWadeSound(void)&lt;br /&gt;
408	CTerrorPlayer::CanBreatheUnderwater(void)const&lt;br /&gt;
409	CTerrorPlayer::CanRecoverCurrentDrowningDamage(void)const&lt;br /&gt;
410	CTerrorPlayer::PlayerUse(CBaseEntity *)&lt;br /&gt;
411	CCSPlayer::PlayUseDenySound(void)&lt;br /&gt;
412	CTerrorPlayer::FindUseEntity(float,float,bool *)&lt;br /&gt;
413	CTerrorPlayer::IsUseableEntity(CBaseEntity *,unsigned int)&lt;br /&gt;
414	CTerrorPlayer::OnUseEntity(CBaseEntity *,USE_TYPE)&lt;br /&gt;
415	CTerrorPlayer::PickupObject(CBaseEntity *,bool)&lt;br /&gt;
416	CTerrorPlayer::ForceDropOfCarriedPhysObjects(CBaseEntity *)&lt;br /&gt;
417	CTerrorPlayer::GetHeldObjectMass(IPhysicsObject *)&lt;br /&gt;
418	CTerrorPlayer::IsHoldingEntity(CBaseEntity *)&lt;br /&gt;
419	CBasePlayer::UpdateGeigerCounter(void)&lt;br /&gt;
420	CBasePlayer::GetAutoaimVector(float)&lt;br /&gt;
421	CBasePlayer::GetAutoaimVector(float,float)&lt;br /&gt;
422	CBasePlayer::GetAutoaimVector(float,float,float,AimResults *)&lt;br /&gt;
423	CBasePlayer::GetAutoaimVector(autoaim_params_t &amp;amp;)&lt;br /&gt;
424	CBasePlayer::ShouldAutoaim(void)&lt;br /&gt;
425	CBasePlayer::ForceClientDllUpdate(void)&lt;br /&gt;
426	CBasePlayer::ProcessUsercmds(CUserCmd *,int,int,int,bool)&lt;br /&gt;
427	CTerrorPlayer::PlayerRunCommand(CUserCmd *,IMoveHelper *)&lt;br /&gt;
428	CBaseMultiplayerPlayer::CanHearAndReadChatFrom(CBasePlayer *)&lt;br /&gt;
429	CBaseMultiplayerPlayer::CanSpeak(void)&lt;br /&gt;
430	CCSPlayer::ModifyOrAppendPlayerCriteria(AI_CriteriaSet &amp;amp;)&lt;br /&gt;
431	CTerrorPlayer::CheckChatText(char *,int)&lt;br /&gt;
432	CBasePlayer::CreateRagdollEntity(void)&lt;br /&gt;
433	CBasePlayer::ShouldAnnounceAchievement(void)&lt;br /&gt;
434	CBasePlayer::EnsureSplitScreenTeam(void)&lt;br /&gt;
435	CBasePlayer::ForceChangeTeam(int)&lt;br /&gt;
436	CBasePlayer::IsFollowingPhysics(void)&lt;br /&gt;
437	CTerrorPlayer::InitVCollision(Vector  const&amp;amp;,Vector  const&amp;amp;)&lt;br /&gt;
438	CBasePlayer::UpdatePhysicsShadowToCurrentPosition(void)&lt;br /&gt;
439	CBasePlayer::Hints(void)&lt;br /&gt;
440	CBasePlayer::IsReadyToPlay(void)&lt;br /&gt;
441	CBasePlayer::IsReadyToSpawn(void)&lt;br /&gt;
442	CBasePlayer::ShouldGainInstantSpawn(void)&lt;br /&gt;
443	CBasePlayer::ResetPerRoundStats(void)&lt;br /&gt;
444	CBasePlayer::ResetScores(void)&lt;br /&gt;
445	CBasePlayer::EquipSuit(bool)&lt;br /&gt;
446	CBasePlayer::RemoveSuit(void)&lt;br /&gt;
447	CTerrorPlayer::OnUseEntityChanged(void)&lt;br /&gt;
448	CBasePlayer::CommitSuicide(bool,bool)&lt;br /&gt;
449	CBasePlayer::CommitSuicide(Vector  const&amp;amp;,bool,bool)&lt;br /&gt;
450	CBasePlayer::IsBot(void)const&lt;br /&gt;
451	CBaseMultiplayerPlayer::GetExpresser(void)&lt;br /&gt;
452	CCSPlayer::SpawnArmorValue(void)const&lt;br /&gt;
453	CTerrorPlayer::UpdateTonemapController(void)&lt;br /&gt;
454	CCSPlayer::NetworkStateChanged_m_ArmorValue(void)&lt;br /&gt;
455	CCSPlayer::NetworkStateChanged_m_ArmorValue(void *)&lt;br /&gt;
456	CTerrorPlayer::IsAutoCrouched(void)const&lt;br /&gt;
457	CTerrorPlayer::GetAvailableSteadyStateSlots(void)&lt;br /&gt;
458	CTerrorPlayer::OnSpeak(CBasePlayer *,char  const*,float)&lt;br /&gt;
459	CTerrorPlayer::OnVoiceTransmit(void)&lt;br /&gt;
460	CTerrorPlayer::PlayerSolidMask(bool)const&lt;br /&gt;
461	CAI_ExpresserHost&amp;lt;CBasePlayer&amp;gt;::NoteSpeaking(float,float)&lt;br /&gt;
462	CAI_ExpresserHost&amp;lt;CBasePlayer&amp;gt;::Speak(CAI_Concept,char  const*,char *,unsigned int,IRecipientFilter *)&lt;br /&gt;
463	CAI_ExpresserHost&amp;lt;CBasePlayer&amp;gt;::Speak(CAI_Concept,AI_CriteriaSet *,char *,unsigned int,IRecipientFilter *)&lt;br /&gt;
464	CAI_ExpresserHost&amp;lt;CBasePlayer&amp;gt;::PostSpeakDispatchResponse(CAI_Concept,AI_Response *)&lt;br /&gt;
465	CTerrorPlayer::SpeakIfAllowed(CAI_Concept,SpeechPriorityType,char  const*,char *,unsigned int,IRecipientFilter *)&lt;br /&gt;
466	CBaseMultiplayerPlayer::SpeakConceptIfAllowed(int,char  const*,char *,unsigned int,IRecipientFilter *)&lt;br /&gt;
467	CBaseMultiplayerPlayer::CanSpeakVoiceCommand(void)&lt;br /&gt;
468	CBaseMultiplayerPlayer::ShouldShowVoiceSubtitleToEnemy(void)&lt;br /&gt;
469	CBaseMultiplayerPlayer::NoteSpokeVoiceCommand(char  const*)&lt;br /&gt;
470	CBaseMultiplayerPlayer::GetMultiplayerExpresser(void)&lt;br /&gt;
471	CBaseMultiplayerPlayer::CalculateTeamBalanceScore(void)&lt;br /&gt;
472	CBaseMultiplayerPlayer::CreateExpresser(void)&lt;br /&gt;
473	CCSPlayer::FirePlayerHurtEvent(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
474	CTerrorPlayer::OnTakeDamageInternal(CTakeDamageInfo &amp;amp;)&lt;br /&gt;
475	CTerrorPlayer::AllowDamage(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
476	CTerrorPlayer::GetHealthBuffer(void)const&lt;br /&gt;
477	CTerrorPlayer::IsIncapacitated(void)const&lt;br /&gt;
478	CTerrorPlayer::GetAdjustedDamage(CTakeDamageInfo  const&amp;amp;,float,float,bool)&lt;br /&gt;
479	CTerrorPlayer::DoBloodEffect(float,CTakeDamageInfo  const&amp;amp;,Vector  const&amp;amp;,CGameTrace *)&lt;br /&gt;
480	CCSPlayer::GiveNamedItem(char  const*,int)&lt;br /&gt;
481	CCSPlayer::IsBeingGivenItem(void)const&lt;br /&gt;
482	CTerrorPlayer::DoAnimationEvent(PlayerAnimEvent_t,int)&lt;br /&gt;
483	CCSPlayer::CSAnim_GetActiveWeapon(void)&lt;br /&gt;
484	CCSPlayer::CSAnim_CanMove(void)&lt;br /&gt;
485	CTerrorPlayer::KickBack(float,float,float,float,float,float,int)&lt;br /&gt;
486	CTerrorPlayer::IsImmobilized(void)const&lt;br /&gt;
487	CTerrorPlayer::GiveDefaultItems(void)&lt;br /&gt;
488	CTerrorPlayer::RoundRespawn(void)&lt;br /&gt;
489	CTerrorPlayer::ObserverRoundRespawn(void)&lt;br /&gt;
490	CCSPlayer::Blind(float,float,float)&lt;br /&gt;
491	CTerrorPlayer::Deafen(float,float,float)&lt;br /&gt;
492	CTerrorPlayer::ResetMaxSpeed(void)&lt;br /&gt;
493	CCSPlayer::HandleCommand_JoinClass(int)&lt;br /&gt;
494	CTerrorPlayer::HandleCommand_JoinTeam(int,char  const*,bool)&lt;br /&gt;
495	CTerrorPlayer::GetIntoGame(void)&lt;br /&gt;
496	CTerrorPlayer::WantsMOTD(void)const&lt;br /&gt;
497	CTerrorPlayer::AutoSelectTeam(void)&lt;br /&gt;
498	CTerrorPlayer::OnLeaveActiveState(void)&lt;br /&gt;
499	CTerrorPlayer::Pain(bool)&lt;br /&gt;
500	CTerrorPlayer::OnTeamChanged(int)&lt;br /&gt;
501	CTerrorPlayer::CanAttack(void)const&lt;br /&gt;
502	CTerrorPlayer::OnWeaponFired(void)&lt;br /&gt;
503	CTerrorPlayer::OnHitPlayer(int,float,float,int)&lt;br /&gt;
504	CTerrorPlayer::OnReloadStart(bool,int,bool)&lt;br /&gt;
505	CTerrorPlayer::CreateNoise(float)&lt;br /&gt;
506	CTerrorPlayer::OnPreThinkObserverMode(void)&lt;br /&gt;
507	CTerrorPlayer::OnEnterRescueState(void)&lt;br /&gt;
508	CTerrorPlayer::OnPreThinkRescueState(void)&lt;br /&gt;
509	CTerrorPlayer::OnLeaveRescueState(void)&lt;br /&gt;
510	CTerrorPlayer::OnEnterGhostState(void)&lt;br /&gt;
511	CTerrorPlayer::OnPreThinkGhostState(void)&lt;br /&gt;
512	CTerrorPlayer::OnLeaveGhostState(void)&lt;br /&gt;
513	CTerrorPlayer::OnEnterIntroCameraState(void)&lt;br /&gt;
514	CTerrorPlayer::OnPreThinkIntroCameraState(void)&lt;br /&gt;
515	CTerrorPlayer::OnLeaveIntroCameraState(void)&lt;br /&gt;
516	CTerrorPlayer::OnLeaveDeathAnimState(void)&lt;br /&gt;
517	CTerrorPlayer::OnLeaveDeathWaitForKeyState(void)&lt;br /&gt;
518	CTerrorPlayer::CanUseFlashlight(void)const&lt;br /&gt;
519	CTerrorPlayer::UpdateAddonBits(void)&lt;br /&gt;
520	CTerrorPlayer::UpdateRadar(void)&lt;br /&gt;
521	CTerrorPlayer::SelectDeathPose(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
522	CTerrorPlayer::CanChangeName(void)const&lt;br /&gt;
523	CTerrorPlayer::ChangeName(char  const*)&lt;br /&gt;
524	CTerrorPlayer::IsProgressBarActive(void)const&lt;br /&gt;
525	CTerrorPlayer::CreateRagdollEntity(CTakeDamageInfo  const&amp;amp;)&lt;br /&gt;
526	CTerrorPlayer::GetRagdollType(void)const&lt;br /&gt;
527	CTerrorPlayer::SetModelFromClass(void)&lt;br /&gt;
528	CTerrorPlayer::SetModelFromClassAtSpawn(void)&lt;br /&gt;
529	CTerrorPlayer::DropWeapons(bool)&lt;br /&gt;
530	CTerrorPlayer::RecordDamageTaken(char  const*,int)&lt;br /&gt;
531	CTerrorPlayer::OnPlayerDisconnected(CTerrorPlayer*)&lt;br /&gt;
532	CTerrorPlayer::OnSpawn(void)&lt;br /&gt;
533	CTerrorPlayer::RestoreSpawn(void)&lt;br /&gt;
534	CTerrorPlayer::OnBeginChangeLevel(char  const*,KeyValues *)&lt;br /&gt;
535	CTerrorPlayer::OnEndChangeLevel(void)&lt;br /&gt;
536	CTerrorPlayer::SetDoingRestore(bool)&lt;br /&gt;
537	CTerrorPlayer::CommitSuicide(bool)&lt;br /&gt;
538	CTerrorPlayer::OnSpokeConcept(CAI_Concept,AI_Response *)&lt;br /&gt;
539	CTerrorPlayer::RestoreWeapons(void)&lt;br /&gt;
540	CTerrorPlayer::OnReloadEnd(void)&lt;br /&gt;
541	CTerrorPlayer::OnReloadAbort(void)&lt;br /&gt;
542	CTerrorPlayer::OnAttackSuccess(CBaseCombatCharacter *,bool)&lt;br /&gt;
543	CTerrorPlayer::IsWielding(CSWeaponID)const&lt;br /&gt;
544	CTerrorPlayer::IsZoomed(void)&lt;br /&gt;
545	CTerrorPlayer::CanPlayerJump(void)const&lt;br /&gt;
546	CTerrorPlayer::CanHearChatFrom(CBasePlayer *)&lt;br /&gt;
547	CTerrorPlayer::PlayerZombieAbortControl(void)&lt;br /&gt;
548	CTerrorPlayer::CanBeShoved(void)&lt;br /&gt;
549	CTerrorPlayer::SetClass(ZombieClassType)&lt;br /&gt;
550	CTerrorPlayer::SetCharacter(void)&lt;br /&gt;
551	CTerrorPlayer::OnRevived(void)&lt;br /&gt;
552	CTerrorPlayer::OnAwardEarned(AwardType,CBaseEntity *)&lt;br /&gt;
553	CTerrorPlayer::OnAwardLost(AwardType)&lt;br /&gt;
554	CTerrorPlayer::ScoreKilledZombie(ZombieClassType)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Template:Bug&amp;diff=6222</id>
		<title>Template:Bug</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Template:Bug&amp;diff=6222"/>
		<updated>2008-09-18T08:05:10Z</updated>

		<summary type="html">&lt;p&gt;DS: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;amb[http://fs.alliedmods.net/?do=details&amp;amp;task_id={{{1}}} {{{1}}}]&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Metamod:Source_Environment&amp;diff=6218</id>
		<title>Metamod:Source Environment</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Metamod:Source_Environment&amp;diff=6218"/>
		<updated>2008-09-16T10:00:18Z</updated>

		<summary type="html">&lt;p&gt;DS: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article explains how to set up your Windows or Linux environment to compile Metamod:Source's 1.6's sample plugins.  &lt;br /&gt;
&lt;br /&gt;
This article does not guarantee that you will be able to build third-party plugins, which may have their own build environment requirements.  However, it creates a baseline for making sure you can successfully build plugins against both the 1.6 and 1.4 API.  &lt;br /&gt;
&lt;br /&gt;
'''Note:''' You can use Valve's HL2SDK source tree, but we have our own available.  It fixes all of Valve's mistakes such that you can build on both GCC and Visual Studio with no warnings or errors.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' This article will not work against Metamod:Source 1.4 or its sample plugins.  Metamod:Source 1.6's sample plugins will build against the 1.4 API, however.  See the [[Sample Plugins (Metamod:Source)]] article.&lt;br /&gt;
&lt;br /&gt;
=Requirements=&lt;br /&gt;
&lt;br /&gt;
==Windows==&lt;br /&gt;
*Microsoft Visual C++ 2005 (Express or higher) is supported and used for official builds.&lt;br /&gt;
*Microsoft Visual C++ 2008 (Express or higher) is ''officially'' unsupported, but works fine.&lt;br /&gt;
*Microsoft Visual C++ 2003 7.1 is unsupported.  It is capable of building compatible binaries against the original (non-Orange Box SDK) only.&lt;br /&gt;
*Microsoft Visual C++ 2003 7.0 or lower '''cannot''' be used.&lt;br /&gt;
&lt;br /&gt;
If you are installing Visual C++ 2005 Express, it may not come with Microsoft's Platform SDK installed.  If this is the case, you must manually install the Platform SDK.  You can find directions on how to do this and test your setup [http://www.microsoft.com/express/2005/platformsdk/default.aspx here].  According to Microsoft, Visual C++ 2008 &amp;quot;streamlines&amp;quot; the Platform SDK installation for you.&lt;br /&gt;
&lt;br /&gt;
==Linux==&lt;br /&gt;
For Linux, Metamod:Source requires the GNU C/C++ Compiler (from GCC):&lt;br /&gt;
*Version 4.1 is used for official binaries and is guaranteed to build.&lt;br /&gt;
*Versions 3.4 through 4.2 are guaranteed to be binary (ABI) compatible.  Metamod:Source and its sample plugins will probably build fine on them.&lt;br /&gt;
*Any GCC version below 3.4 '''cannot''' be used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Setup=&lt;br /&gt;
==Getting the Files==&lt;br /&gt;
This section describes which files you must have and how to get them.  Do not worry about where to place them yet -- that will be discussed on a per-platform basis.  You can download the files anywhere you'd like.&lt;br /&gt;
&lt;br /&gt;
You can use the HL2SDK from Valve, but it's recommended you use the one linked to here.  We have a patched version that fixes many compilation bugs and it will make your life easier on both operating systems.&lt;br /&gt;
&lt;br /&gt;
To get Metamod:Source files, visit [http://www.metamodsource.net/?go=downloads Metamod:Source downloads].  Make sure to get the source code and not the binaries.&lt;br /&gt;
&lt;br /&gt;
*'''To build Orange Box or Metamod:Source 1.6 plugins:'''&lt;br /&gt;
**Metamod:Source 1.6+.  As of this writing (Sep 2008), 1.6.2 is the latest stable version.&lt;br /&gt;
**HL2SDK, Orange Box Edition (repository: [http://hg.alliedmods.net/hl2sdk-ob/ hl2sdk-ob]).&lt;br /&gt;
*'''To build Episode 1/Original Metamod:Source 1.4 plugins:'''&lt;br /&gt;
**Metamod:Source 1.4+.  As of this writing (Sep 2008), 1.4.4 is the latest stable version.&lt;br /&gt;
**HL2SDK, Episode 1 Edition (repository: [http://hg.alliedmods.net/hl2sdk/ hl2sdk]).&lt;br /&gt;
&lt;br /&gt;
==Linux==&lt;br /&gt;
As of this writing, SourceMod's Makefiles are hardcoded to use a binary called &amp;quot;gcc-4.1&amp;quot;  You can override this, for example:&lt;br /&gt;
&amp;lt;pre&amp;gt;make CPP=gcc&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otherwise, you can also just create a symlink:&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo ln -s /usr/bin/gcc /usr/bin/gcc-4.1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that you must use &amp;lt;tt&amp;gt;gcc&amp;lt;/tt&amp;gt; and not &amp;lt;tt&amp;gt;g++&amp;lt;/tt&amp;gt;.  Using &amp;lt;tt&amp;gt;g++&amp;lt;/tt&amp;gt; creates a &amp;lt;tt&amp;gt;libstdc++&amp;lt;/tt&amp;gt; dependency, which may interfere with Valve's &amp;lt;tt&amp;gt;libstdc++&amp;lt;/tt&amp;gt; usage and will cause platform portability problems in general.  As a corollary you should avoid using STL, RTTI (Run-Time Type Information), or exceptions.&lt;br /&gt;
&lt;br /&gt;
Metamod:Source's Makefiles have a strict directory organization.  You must have a top-level folder.  For this document, we'll assume it is called &amp;lt;tt&amp;gt;sourcemm&amp;lt;/tt&amp;gt;, though it can be named anything.  The layout of &amp;lt;tt&amp;gt;sourcemm&amp;lt;/tt&amp;gt; should be:&lt;br /&gt;
*&amp;lt;tt&amp;gt;sourcemm&amp;lt;/tt&amp;gt;/&lt;br /&gt;
**&amp;lt;tt&amp;gt;hl2sdk&amp;lt;/tt&amp;gt; - symlink or folder containing the HL2SDK for Episode 1&lt;br /&gt;
**&amp;lt;tt&amp;gt;hl2sdk-ob&amp;lt;/tt&amp;gt; - symlink or folder containing the HL2SDK for Orange Box/TF&lt;br /&gt;
**&amp;lt;tt&amp;gt;sourcemm-1.4&amp;lt;/tt&amp;gt; - symlink or folder containing any Metamod:Source version 1.4.2 or higher.&lt;br /&gt;
**&amp;lt;tt&amp;gt;sourcemm-1.6&amp;lt;/tt&amp;gt; - symlink or folder containing any Metamod:Source version 1.6.0 or higher.&lt;br /&gt;
&lt;br /&gt;
If you are using a 64-bit version of Linux, you may need to install extra packages to be able to compile SourceMod.  On Debian-based distros, these are typically:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#prerequisites&lt;br /&gt;
#apt-get install g++-4.1 gcc-4.1 make mercurial&lt;br /&gt;
#apt-get instal libz libz-dev&lt;br /&gt;
#only needed if you want to use the build tool&lt;br /&gt;
#apt-get install mono mono-devel&lt;br /&gt;
#32-bit support&lt;br /&gt;
apt-get install ia32-libs&lt;br /&gt;
apt-get install lib32z1 lib32z1-dev&lt;br /&gt;
apt-get install libc6-dev-i386 libc6-i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Windows==&lt;br /&gt;
On Windows, there is no particular directory layout required -- environment variables are used instead.  The directions below apply to Windows XP, and are assumed to be similar for other versions of Windows.&lt;br /&gt;
*Open the Control Panel (for example, via Start -&amp;gt; Settings).&lt;br /&gt;
*Open the System control.  If you don't see it, you may need to switch to &amp;quot;Classic view&amp;quot; (either via the left-hand pane or by going to Tools -&amp;gt; Folder Options).&lt;br /&gt;
*Click the Advanced tab.&lt;br /&gt;
*Click the Environment Variables button.&lt;br /&gt;
&lt;br /&gt;
You can add your environment variables to either your User settings or your System settings.  Create a new variable for each item in the list below.  The item names are in &amp;lt;tt&amp;gt;fixed-width font&amp;lt;/tt&amp;gt; and their value descriptions follow.&lt;br /&gt;
*&amp;lt;tt&amp;gt;SOURCEMM16&amp;lt;/tt&amp;gt; - Path to Metamod:Source 1.6.0+&lt;br /&gt;
*&amp;lt;tt&amp;gt;SOURCEMM14&amp;lt;/tt&amp;gt; - Path to Metamod:Source 1.4.2+ &lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDK&amp;lt;/tt&amp;gt; - Path to HL2SDK Ep1/Original&lt;br /&gt;
*&amp;lt;tt&amp;gt;HL2SDKOB&amp;lt;/tt&amp;gt; - Path to HL2SDK Ep2/OrangeBox&lt;br /&gt;
&lt;br /&gt;
[[Category:Metamod:Source Development]]&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=AlliedModders_Planning&amp;diff=6214</id>
		<title>AlliedModders Planning</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=AlliedModders_Planning&amp;diff=6214"/>
		<updated>2008-09-16T09:56:17Z</updated>

		<summary type="html">&lt;p&gt;DS: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__&lt;br /&gt;
&lt;br /&gt;
This is sort of a major push for AlliedModders to be a bit more streamlined.  We're encountering growth problems, especially as our personnel has dwindled quite low recently.  This document discusses some changes I'm proposing.  Anyone is free to discuss this on the forums or add comments into this document.&lt;br /&gt;
&lt;br /&gt;
Everything related to source code management in this document refers to Metamod:Source and SourceMod.  AMX Mod X is considered &amp;quot;mature&amp;quot; and is no longer maintained except for critical or high priority bugs.  If and when we do a move past Subversion, it is unlikely AMX Mod X will follow.  &lt;br /&gt;
&lt;br /&gt;
=The Problems=&lt;br /&gt;
==Short Term==&lt;br /&gt;
*We're finding it hard to manage multiple projects in a unified way.&lt;br /&gt;
*There are site disparities, Metamod:Source and SourceMod and AMX Mod X each have entirely different backends.&lt;br /&gt;
*Similarly, each site has a different version of the mirror system script.  &lt;br /&gt;
*Subversion doesn't cut it -- Mercurial might handle things better.  Subversion basically has no branching or tagging support, and it has no real branch merging capabilities.  This is a real problem for SourceMod which has pretty active development.&lt;br /&gt;
*The packaging system is disorganized and fundamentally broken.  It's inconsistent, inaccurate, and takes up 1.7GB of wasted space and growing.&lt;br /&gt;
&lt;br /&gt;
==Long Term==&lt;br /&gt;
*AlliedModders has plans past SourceMod.  We need to be able to grow our project base without adding exponential amounts of work.&lt;br /&gt;
*We still don't have a main site&lt;br /&gt;
*MediaWiki still has authentication problems since its handling of usernames is broken&lt;br /&gt;
*Flyspray is buggy, definitely non-production, and doesn't get maintained frequently&lt;br /&gt;
*It's impossible to maintain the AMXX/SM/MM:S sites right now&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Mercurial=&lt;br /&gt;
Subversion doesn't let us branch nicely or create user-specific branches without forever mucking up the central repository.  It's difficult to do merges.&lt;br /&gt;
&lt;br /&gt;
An excellent tutorial for how Mercurial works is [http://www.selenic.com/mercurial/wiki/index.cgi/UnderstandingMercurial here].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Phases=&lt;br /&gt;
&lt;br /&gt;
==Phase 0 - Done ==&lt;br /&gt;
'''DONE:''' We've eliminated build numbers and are back on the x.y.z system.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;strike&amp;gt;Apply new versioning scheme, whatever it may be.&amp;lt;/strike&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==Phase 1 - Done==&lt;br /&gt;
'''DONE!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strike&amp;gt;Move from Sente to Iroh so we can get away from ThePlanet and clean up/optimize some infrastructure.  This is documented at [[Iroh_Migration|Iroh Migration]].&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Phase 2==&lt;br /&gt;
Expected date: Mid-July&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;strike&amp;gt;Redo automation so the &amp;quot;packaging&amp;quot; versus &amp;quot;sending upstream&amp;quot; processes are fundamentally separate.&amp;lt;/strike&amp;gt;&lt;br /&gt;
*&amp;lt;strike&amp;gt;Redo &amp;quot;sending upstream&amp;quot; process so it simply sends over FTP.&amp;lt;/strike&amp;gt;&lt;br /&gt;
*&amp;lt;strike&amp;gt;Use an SSH tunnel to notify of new packages, so we don't have to do something idiotic like mirrors.pl for the mirror system, or using post-commit scripts on the Packages repository.&amp;lt;/strike&amp;gt;&lt;br /&gt;
*Redo the package system so only 30 days worth of builds are available.&lt;br /&gt;
*&amp;lt;strike&amp;gt;Write a script to help users diff between packages? (Update: No one asked for it.)&amp;lt;/strike&amp;gt;&lt;br /&gt;
*Remove the Packages repository entirely (transitioning AMX Mod X to this will be trivial).&lt;br /&gt;
*&amp;lt;strike&amp;gt;Update symbol server to include binaries and maybe even sourcecode? Removes the need for fetchdll's.&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Phase 3==&lt;br /&gt;
Expected date: End of 2009&lt;br /&gt;
&lt;br /&gt;
*{{bz|3257}}: Transition SourceMod to vs2k8.&lt;br /&gt;
*{{bz|3258}}: Transition Metamod:Source to vs2k8.&lt;br /&gt;
&lt;br /&gt;
==Phase 4 - Done==&lt;br /&gt;
'''DONE!'''&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;strike&amp;gt;Move the pdbstore to be centralized client-side.  This can be accomplished by making a more advanced symstore wrapper that will remove anything older than 30 days, and then (in a similar SSH tunnel method as above), rsync all changes upstream to the webserver.  The exact mechanism is still up in the air, but rsync would probably suffice (as long as we can stomach cygwin).&amp;lt;/strike&amp;gt;&lt;br /&gt;
*&amp;lt;strike&amp;gt;Remove the Symbols repository.&amp;lt;/strike&amp;gt;&lt;br /&gt;
*&amp;lt;strike&amp;gt;Rewrite fetchdlls to support the new layout.&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Phase 5 - Done==&lt;br /&gt;
'''DONE!'''&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;strike&amp;gt;Add hg.alliedmods.net pointing to our &amp;quot;repository roots,&amp;quot; which will be per-project.  For example, hg.alliedmods.net/sourcemod.&amp;lt;/strike&amp;gt;&lt;br /&gt;
*&amp;lt;strike&amp;gt;From there, import trunk as &amp;quot;sourcemod.&amp;quot;&amp;lt;/strike&amp;gt;&lt;br /&gt;
*&amp;lt;strike&amp;gt;Branch every major release off as separate repositories, from the appropriate revisions.&amp;lt;/strike&amp;gt;&lt;br /&gt;
*&amp;lt;strike&amp;gt;Tag minor releases.&amp;lt;/strike&amp;gt;&lt;br /&gt;
*&amp;lt;strike&amp;gt;Update all links we can find on the site and in the docs.&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Phase 6==&lt;br /&gt;
Expected date: Q4 2008&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;strike&amp;gt;Import mmsource into Mercurial.&amp;lt;/strike&amp;gt;&lt;br /&gt;
*&amp;lt;strike&amp;gt;Import hl2sdk/hl2sdk-ob into Mercurial.&amp;lt;/strike&amp;gt;&lt;br /&gt;
*Update all links we can find on the site and in the docs.&lt;br /&gt;
&lt;br /&gt;
==Phase 7==&lt;br /&gt;
Expected date: Q1 2009&lt;br /&gt;
&lt;br /&gt;
*{{bz|3259}}: We need to update vBulletin to the 3.7 branch.  This is potentially a huge task.&lt;br /&gt;
&lt;br /&gt;
==Phase 8==&lt;br /&gt;
Expected date: Q1 2009&lt;br /&gt;
&lt;br /&gt;
We really, really still need a CMS to make this packaging, mirroring, etc business much more streamlined.  But this phase is so far in the future I expect other phases to creep in before it.  This is more a mind dump than anything, but here goes --&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;strike&amp;gt;Moving from flyspray to bugzilla.  After using bugzilla, I'm convinced that its massive feature set far outweights the few permissions issues we ran into.  flyspray is severely lacking, and even though bugzilla isn't the nicest looking tool, it's templated and professionally done.  It has little things that really count, like..&amp;lt;/strike&amp;gt;&lt;br /&gt;
**&amp;lt;strike&amp;gt;The input system isn't broken and convoluted like Flyspray's embedded dokuwiki (which seems to be less a product than a bunch of bugs someone coded)&amp;lt;/strike&amp;gt;&lt;br /&gt;
**&amp;lt;strike&amp;gt;A much, MUCH better attachment system that allows for attachment reviews&lt;br /&gt;
**More focused on triaging and patch management than flyspray, which is simply a list of tasks with some basic statistics&amp;lt;/strike&amp;gt;&lt;br /&gt;
*Moving from MediaWiki, which (I view) as a very, very outdated piece of software.  From version 1.5 to 1.10 I have noticed no real usability or feature set changes, and the installation/upgrade process is always very buggy for us.  Its administration and permissions model is laughably limited.  A possible target for this is DekiWiki which Mozilla is supposedly converting to.  It's open source and it's actually a CMS, which (perhaps) could kill two birds with one stone.&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Mercurial_Tutorial&amp;diff=6197</id>
		<title>Mercurial Tutorial</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Mercurial_Tutorial&amp;diff=6197"/>
		<updated>2008-09-15T07:34:47Z</updated>

		<summary type="html">&lt;p&gt;DS: Added sections that were inadvertantly removed - thanks mediawiki&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mercurial (Hg) is a distributed version control system.  While it has similarities with [[Subversion Tutorial|Subverison]], it is decentralized in nature.  &lt;br /&gt;
&lt;br /&gt;
=Getting Started=&lt;br /&gt;
==Introduction==&lt;br /&gt;
Mercurial keeps source code in '''repositories'''.  Changes to the source code are made inside the repository and are periodically '''committed'''.  When you commit changes, they are wrapped into a '''changeset'''.  A repository is the sum of all changesets committed over time.&lt;br /&gt;
&lt;br /&gt;
Unlike Subversion, Mercurial has no concept of a &amp;quot;master repository.&amp;quot;  Each user owns a complete local copy of the repository, and they can commit to it without needing any permissions.  Users can share changesets by '''pulling''' from other people's repositories, or '''pushing''' to other repositories (which may require special privileges).&lt;br /&gt;
&lt;br /&gt;
One very noticeable side effect is that when you commit changes in Mercurial, you do not need Internet access.  You only need Internet access if want to push changesets to a remote repository.  This means you can make as many commits as you want before pushing.&lt;br /&gt;
&lt;br /&gt;
'''Now for the contradiction''': You CAN have a master repository with Mercurial.  For some projects it is ideal to have a reference copy.  There is no difference between your copy and the master copy -- how it is managed is simply a matter of permissions and policy.  For example, AlliedModders has a &amp;quot;sourcemod-central&amp;quot; repository where developers push their changesets.  Only SourceMod developers can push to this copy, but anyone can copy it or pull its changes.&lt;br /&gt;
&lt;br /&gt;
==Basic Commands==&lt;br /&gt;
&lt;br /&gt;
These are a few essential Mercurial operations:&lt;br /&gt;
*&amp;lt;tt&amp;gt;clone&amp;lt;/tt&amp;gt; - Copies or downloads a repository.&lt;br /&gt;
*&amp;lt;tt&amp;gt;add&amp;lt;/tt&amp;gt; - Adds a file or directory to the local source tree.&lt;br /&gt;
*&amp;lt;tt&amp;gt;remove&amp;lt;/tt&amp;gt; - Removes a file or directory from the local source tree.&lt;br /&gt;
*&amp;lt;tt&amp;gt;commit&amp;lt;/tt&amp;gt; - Commits any local changes to your local source tree.&lt;br /&gt;
*&amp;lt;tt&amp;gt;pull&amp;lt;/tt&amp;gt; - Retrieves changesets from another repository.&lt;br /&gt;
*&amp;lt;tt&amp;gt;update&amp;lt;/tt&amp;gt; - Updates source code with all pending pulled changes.&lt;br /&gt;
*&amp;lt;tt&amp;gt;push&amp;lt;/tt&amp;gt; - Pushes your changesets to a remote repository.&lt;br /&gt;
*&amp;lt;tt&amp;gt;merge&amp;lt;/tt&amp;gt; - Merges two repositories together (explained later).&lt;br /&gt;
&lt;br /&gt;
==Installing==&lt;br /&gt;
&lt;br /&gt;
The author of this article uses command line Mercurial (on both Linux and Windows).  You can download both the command line tools at the [http://www.selenic.com/mercurial/wiki/ Mercurial Site], and there is a TortoiseHg graphical tool for those who would like to try it.&lt;br /&gt;
&lt;br /&gt;
==Getting a Repository==&lt;br /&gt;
To retrieve a repository, you must use the &amp;quot;clone&amp;quot; command.  You can clone a local or remote repository.  Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg clone http://hg.alliedmods.net/sourcemod-central sourcemod-central&lt;br /&gt;
hg clone sourcemod-central sourcemod-copy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also create a new repository:&lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir project&lt;br /&gt;
cd project&lt;br /&gt;
hg init&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create a blank repository and initialize it with Mercurial.&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
Mercurial lets you configure default settings for all repositories and settings specific to one repository.  &lt;br /&gt;
&lt;br /&gt;
On Linux, the main configuration file is &amp;lt;tt&amp;gt;~/.hgrc&amp;lt;/tt&amp;gt;.  On Windows 2003/XP and prior, it is &amp;lt;tt&amp;gt;C:\Documents and Settings\&amp;amp;lt;account&amp;amp;gt;\Mercurial.ini&amp;lt;/tt&amp;gt;.  On Windows Vista, it is &amp;lt;tt&amp;gt;C:\Users\&amp;amp;lt;account&amp;amp;gt;\Mercurial.ini&amp;lt;/tt&amp;gt;.  If the file does not exist, you can create it.&lt;br /&gt;
&lt;br /&gt;
Per-repository configuration is done in &amp;lt;tt&amp;gt;&amp;amp;lt;repository&amp;amp;gt;\.hg\hgrc&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Identity===&lt;br /&gt;
Mercurial lets you configure an identity to associate with your changesets.  By default it uses the name of the account your computer is logged in as.  Many projects (AlliedModders included) use &amp;quot;Firstname Lastname &amp;lt;email&amp;gt;&amp;quot; instead.&lt;br /&gt;
&lt;br /&gt;
To set up your identity, open either your &amp;lt;tt&amp;gt;hgrc&amp;lt;/tt&amp;gt; file (either the main or local one).  Look for a &amp;quot;[ui]&amp;quot; section (or add a new one), and configure something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[ui]&lt;br /&gt;
username = David Anderson &amp;lt;dvander@alliedmods.net&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Push and Pull Locations===&lt;br /&gt;
By default, all &amp;quot;pull&amp;quot; operations on a repository occur from the original location you cloned from.  You can change that location by opening up &amp;lt;tt&amp;gt;&amp;amp;lt;repository&amp;amp;gt;\.hg\hgrc&amp;lt;/tt&amp;gt; and looking at the &amp;quot;[paths]&amp;quot; section.  You will see a lines like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[paths]&lt;br /&gt;
default = http://hg.alliedmods.net/sourcemod-central&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are going to be pushing to one main repository fairly often, you may want to set up a default push.  For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[paths]&lt;br /&gt;
default = http://hg.alliedmods.net/sourcemod-central&lt;br /&gt;
default-push = ssh://dvander@hg.alliedmods.net//hg/sourcemod-central&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Note''': Mercurial uses double slashes to specify an absolute file-system path.  If you are using SSH with logical paths, you only need one slash.  For more information about this, visit the Mercurial documentation.  AlliedModders uses absolute paths.&lt;br /&gt;
&lt;br /&gt;
==Changesets==&lt;br /&gt;
Unlike Subversion, Mercurial can't use version numbers to uniquely identify a changeset.  This is because sequential IDs may be duplicated across repositories.  Instead, Mercurial uses 160-bit changeset identifiers.  These are represented in hexadecimal (for example, &amp;lt;tt&amp;gt;fae5f33a1bb3&amp;lt;/tt&amp;gt;).  &lt;br /&gt;
&lt;br /&gt;
Mercurial also uses local revision numbers which are sequential IDs.  These are local to a repository and have no meaning in other repositories.  They are mainly provided for convenience and usability.  A full changeset in a local repository can be represented by &amp;quot;revision:changeset&amp;quot;.  For example, &amp;lt;tt&amp;gt;19108:fae5f33a1bb3&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The latest changeset is called &amp;lt;tt&amp;gt;tip&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
When using commands like &amp;quot;&amp;lt;tt&amp;gt;update&amp;lt;/tt&amp;gt;,&amp;quot; it is useful to refer to changesets.  You can do this in one of a few ways:&lt;br /&gt;
*Using the &amp;lt;tt&amp;gt;tip&amp;lt;/tt&amp;gt; keyword.  This is the latest changeset.&lt;br /&gt;
*Using a revision number.&lt;br /&gt;
*Using any subset of the changeset string that uniquely identifies the changeset.  For example, &amp;lt;tt&amp;gt;fa&amp;lt;/tt&amp;gt; might not be unique and would not work.  But &amp;lt;tt&amp;gt;fa35&amp;lt;/tt&amp;gt; might work for &amp;lt;tt&amp;gt;fae5f33a1bb3&amp;lt;/tt&amp;gt;.  If it doesn't, you can pick a different substring.&lt;br /&gt;
*Using tags.  Mercurial lets you tag a changeset with a unique alias for convenience (&amp;lt;tt&amp;gt;hg tag&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
==Workflow==&lt;br /&gt;
Let's go through a typical session of developing with Mercurial.  If you are working against a project that has a centralized copy, you may want to make sure you're up to date first.  This means '''pulling''' its changes and then '''updating'''.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg pull&lt;br /&gt;
hg update&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will grab the remote changes from the location you first cloned from.  Then it will apply the changes.  You can do this in one go with:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg pull -u&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also pull from a different repository if you want:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg pull -u http://some.other.site/sourcemod-central&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now let's say you make some changes.  You edit file A.cpp and you want to commit your change.  You can do this with:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg commit&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An editor will pop-up asking you to write a message describing your change.  This is required.&lt;br /&gt;
&lt;br /&gt;
Now you edit B.cpp and commit again.  You're done for the day, and you have two changesets sitting in your repository.  You want to push these upstream.  For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg push ssh://dvander@alliedmods.net//hg/sourcemod-central&lt;br /&gt;
searching for changes&lt;br /&gt;
adding changesets&lt;br /&gt;
adding manifests&lt;br /&gt;
adding file changes&lt;br /&gt;
added 2 changesets with 2 changes to 2 files&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or, if you have a &amp;lt;tt&amp;gt;default-push&amp;lt;/tt&amp;gt; configured:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg push&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If there is more than one person sharing and working on the code base, eventually you will need to deal with merges.  This is an extremely powerful (but also deceptively complex) aspect to Mercurial, and it is extremely important to read the next session.&lt;br /&gt;
&lt;br /&gt;
'''Note''': Since only the first line of a commit message is shown by the &amp;lt;tt&amp;gt;hg log&amp;lt;/tt&amp;gt; command by default, it is highly recommended that the first line of your message be able to stand alone.  For example, you might have a short summary of the commit on the first line that says &amp;quot;Added functions for creating dynamic hooks on virtual functions.&amp;quot; Further lines could give more details on the changes involved such as a list of all the functions that were added.&lt;br /&gt;
&lt;br /&gt;
=Merging and You=&lt;br /&gt;
==Introduction==&lt;br /&gt;
Imagine this scenario:&lt;br /&gt;
*Alice and Bob both have a copy of the source code at revision 'A'.&lt;br /&gt;
*Alice commits and pushes a change.  The main repository is now at changeset 'B'.&lt;br /&gt;
*Bob commits a change and is at changeset 'C'.&lt;br /&gt;
&lt;br /&gt;
Now Bob wants to pull.  He runs &amp;lt;tt&amp;gt;hg pull&amp;lt;/tt&amp;gt; and gets:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
searching for changes&lt;br /&gt;
adding changesets&lt;br /&gt;
adding manifests&lt;br /&gt;
adding file changes&lt;br /&gt;
added 1 changesets with 1 changes to 1 files (+1 heads)&lt;br /&gt;
(run 'hg heads' to see heads, 'hg merge' to merge)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What happened here?  Let's visualize it.  When Alice commits, her repository has gone from A to B like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Hg_alice_1.png]]&lt;br /&gt;
&lt;br /&gt;
When Bob commits, his repository goes from A to C like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Hg_bob_1.png]]&lt;br /&gt;
&lt;br /&gt;
After Bob pulls from Alice, his repository has '''multiple heads''' of development.  He's got two forks of the same codebase in his repository.  You can visualize it like this.  The blue arrow is Bob's changes, and the red arrow is Alice's changes.  They diverge from A.&lt;br /&gt;
&lt;br /&gt;
[[Image:Hg_bob_2.png]]&lt;br /&gt;
&lt;br /&gt;
Bob doesn't want to be in this state, so he '''merges'''.  Merging joins multiple heads back together.  Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg merge&lt;br /&gt;
1 files updated, 1 files merged, 0 files removed, 0 files unresolved&lt;br /&gt;
(branch merge, don't forget to commit)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Merges are changesets, and they must be committed.  Bob commits the merge, and now his repository looks like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Hg_bob_3.png]]&lt;br /&gt;
&lt;br /&gt;
'D' is the changeset that joins the two heads back together.  Now Bob can safely push his changes back, and Alice can pull from Bob.&lt;br /&gt;
&lt;br /&gt;
The above example happened from Bob trying to pull.  But if Bob had tried to push, he would have gotten a nasty error message:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg push&lt;br /&gt;
searching for changes&lt;br /&gt;
abort: push creates new remote heads!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This means Bob's push would have introduced multiple heads on the target repository, rather than his own.  This is generally a bad idea and as a policy projects often don't allow it at all.  Bob has to pull, update, and resolve the merge.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' For most merges, it is a good policy to write simple commit messages.  For example, &amp;quot;Merge.&amp;quot; would suffice.&lt;br /&gt;
&lt;br /&gt;
==Conflicts==&lt;br /&gt;
Merges which don't require any work on your part (other than running &amp;lt;tt&amp;gt;merge&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;commit&amp;lt;/tt&amp;gt;) are called '''trivial merges'''.  &lt;br /&gt;
&lt;br /&gt;
It is possible that Alice and Bob edited the same file however.  In many cases, Mercurial will be smart enough to handle this.  If Mercurial can't figure it out though -- you have to do manually merge the difference between the two files.  This is best done with a three-way merge program.&lt;br /&gt;
&lt;br /&gt;
An example of a merge conflict:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg merge&lt;br /&gt;
merging crab.cpp&lt;br /&gt;
merge: warning: conflicts during merge&lt;br /&gt;
merging crab.cpp failed!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Conflicts must be resolved immediately.  You should never leave your source code in a conflicted state.  If you don't have a merge program installed, the conflicted file(s) will be marked up.  For example, &amp;lt;tt&amp;gt;crab.cpp&amp;lt;/tt&amp;gt; might contain lines like these for each conflict:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; /tmp/conflict/crab.cpp&lt;br /&gt;
void function() {&lt;br /&gt;
=======&lt;br /&gt;
int function() {&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; /tmp/crab.cpp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The two &amp;quot;sides&amp;quot; of the &amp;lt;tt&amp;gt;=======&amp;lt;/tt&amp;gt; bar represent the local and incoming changes.  You should delete the markup and decide how to resolve the two sides.&lt;br /&gt;
&lt;br /&gt;
If you want to use and configure a merge program, see [http://www.selenic.com/mercurial/wiki/index.cgi/MergeProgram MergeProgram] at the Mercurial docs.  Though it's not listed, you can also use [http://www.scootersoftware.com/ Beyond Compare] (the author's personal choice).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Other Commands=&lt;br /&gt;
&amp;lt;tt&amp;gt;hg diff&amp;lt;/tt&amp;gt; is very useful for reviewing changes before you commit them.  You can also use it for generating patches.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;hg log&amp;lt;/tt&amp;gt; lets you view the changeset history.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;hg glog&amp;lt;/tt&amp;gt; lets you view an ASCII graph of the changeset history.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;hg identity&amp;lt;/tt&amp;gt; tells you the state of your repository.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;hg status&amp;lt;/tt&amp;gt; shows you any changed or unknown files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;hg status -m&amp;lt;/tt&amp;gt; shows you any changed files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;hg revert&amp;lt;/tt&amp;gt; will remove any changes you've made to one or more files.  It will save the originals as the same file name with &amp;lt;tt&amp;gt;.orig&amp;lt;/tt&amp;gt; at the end.&lt;br /&gt;
&lt;br /&gt;
For many commands you can specify a folder within the repository to only affect that folder and its children.  This can speed up slow operations.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=SSH Authentication=&lt;br /&gt;
If you are accessing your repository via SSH using the &amp;lt;tt&amp;gt;ssh&amp;lt;/tt&amp;gt; protocol, entering your password is annoying and could be a security risk.  You should look into using [[SSH_Keys|SSH Keys]] (full instructions are provided).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=AlliedModders=&lt;br /&gt;
AlliedModders has a public Mercurial listing at [http://hg.alliedmods.net/ http://hg.alliedmods.net/].&lt;br /&gt;
&lt;br /&gt;
Anyone can clone or pull from these.  Only developers with SSH access can push.  Developers should use the following URL formula for pushing: &amp;lt;pre&amp;gt;ssh://USERNAME@hg.alliedmods.net//hg/PROJECT&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should use SSH keys for security.  You should also use the &amp;quot;Firstname Lastname &amp;amp;lt;email&amp;amp;gt;&amp;quot; authorship style.  It is a good idea to configure this ahead of time (read the configuration section above).&lt;br /&gt;
&lt;br /&gt;
It is also highly recommended that long commit messages be split with a short summary on the first line and details on further lines. (See the note at the bottom of the Workflow section above.)&lt;br /&gt;
&lt;br /&gt;
Note that unlike Subversion, you cannot checkout a folder within a repository.  This is by design.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=External Links=&lt;br /&gt;
*[http://www.selenic.com/mercurial/wiki/ Mercurial Home Page]&lt;br /&gt;
*[http://www.selenic.com/mercurial/wiki/index.cgi/UnderstandingMercurial Understanding Mercurial]&lt;br /&gt;
*[http://hgbook.red-bean.com/ Hg Book, free online book about Mercurial]&lt;br /&gt;
*[http://www.selenic.com/mercurial/wiki/index.cgi/Tutorial Mercurial Tutorials]&lt;br /&gt;
&lt;br /&gt;
[[Category:Version Control Systems]]&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Mercurial_Tutorial&amp;diff=6196</id>
		<title>Mercurial Tutorial</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Mercurial_Tutorial&amp;diff=6196"/>
		<updated>2008-09-15T07:23:52Z</updated>

		<summary type="html">&lt;p&gt;DS: Removed duplicate section again, wtf&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mercurial (Hg) is a distributed version control system.  While it has similarities with [[Subversion Tutorial|Subverison]], it is decentralized in nature.  &lt;br /&gt;
&lt;br /&gt;
=Getting Started=&lt;br /&gt;
==Introduction==&lt;br /&gt;
Mercurial keeps source code in '''repositories'''.  Changes to the source code are made inside the repository and are periodically '''committed'''.  When you commit changes, they are wrapped into a '''changeset'''.  A repository is the sum of all changesets committed over time.&lt;br /&gt;
&lt;br /&gt;
Unlike Subversion, Mercurial has no concept of a &amp;quot;master repository.&amp;quot;  Each user owns a complete local copy of the repository, and they can commit to it without needing any permissions.  Users can share changesets by '''pulling''' from other people's repositories, or '''pushing''' to other repositories (which may require special privileges).&lt;br /&gt;
&lt;br /&gt;
One very noticeable side effect is that when you commit changes in Mercurial, you do not need Internet access.  You only need Internet access if want to push changesets to a remote repository.  This means you can make as many commits as you want before pushing.&lt;br /&gt;
&lt;br /&gt;
'''Now for the contradiction''': You CAN have a master repository with Mercurial.  For some projects it is ideal to have a reference copy.  There is no difference between your copy and the master copy -- how it is managed is simply a matter of permissions and policy.  For example, AlliedModders has a &amp;quot;sourcemod-central&amp;quot; repository where developers push their changesets.  Only SourceMod developers can push to this copy, but anyone can copy it or pull its changes.&lt;br /&gt;
&lt;br /&gt;
==Basic Commands==&lt;br /&gt;
&lt;br /&gt;
These are a few essential Mercurial operations:&lt;br /&gt;
*&amp;lt;tt&amp;gt;clone&amp;lt;/tt&amp;gt; - Copies or downloads a repository.&lt;br /&gt;
*&amp;lt;tt&amp;gt;add&amp;lt;/tt&amp;gt; - Adds a file or directory to the local source tree.&lt;br /&gt;
*&amp;lt;tt&amp;gt;remove&amp;lt;/tt&amp;gt; - Removes a file or directory from the local source tree.&lt;br /&gt;
*&amp;lt;tt&amp;gt;commit&amp;lt;/tt&amp;gt; - Commits any local changes to your local source tree.&lt;br /&gt;
*&amp;lt;tt&amp;gt;pull&amp;lt;/tt&amp;gt; - Retrieves changesets from another repository.&lt;br /&gt;
*&amp;lt;tt&amp;gt;update&amp;lt;/tt&amp;gt; - Updates source code with all pending pulled changes.&lt;br /&gt;
*&amp;lt;tt&amp;gt;push&amp;lt;/tt&amp;gt; - Pushes your changesets to a remote repository.&lt;br /&gt;
*&amp;lt;tt&amp;gt;merge&amp;lt;/tt&amp;gt; - Merges two repositories together (explained later).&lt;br /&gt;
&lt;br /&gt;
==Installing==&lt;br /&gt;
&lt;br /&gt;
The author of this article uses command line Mercurial (on both Linux and Windows).  You can download both the command line tools at the [http://www.selenic.com/mercurial/wiki/ Mercurial Site], and there is a TortoiseHg graphical tool for those who would like to try it.&lt;br /&gt;
&lt;br /&gt;
==Getting a Repository==&lt;br /&gt;
To retrieve a repository, you must use the &amp;quot;clone&amp;quot; command.  You can clone a local or remote repository.  Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg clone http://hg.alliedmods.net/sourcemod-central sourcemod-central&lt;br /&gt;
hg clone sourcemod-central sourcemod-copy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also create a new repository:&lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir project&lt;br /&gt;
cd project&lt;br /&gt;
hg init&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create a blank repository and initialize it with Mercurial.&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
Mercurial lets you configure default settings for all repositories and settings specific to one repository.  &lt;br /&gt;
&lt;br /&gt;
On Linux, the main configuration file is &amp;lt;tt&amp;gt;~/.hgrc&amp;lt;/tt&amp;gt;.  On Windows 2003/XP and prior, it is &amp;lt;tt&amp;gt;C:\Documents and Settings\&amp;amp;lt;account&amp;amp;gt;\Mercurial.ini&amp;lt;/tt&amp;gt;.  On Windows Vista, it is &amp;lt;tt&amp;gt;C:\Users\&amp;amp;lt;account&amp;amp;gt;\Mercurial.ini&amp;lt;/tt&amp;gt;.  If the file does not exist, you can create it.&lt;br /&gt;
&lt;br /&gt;
Per-repository configuration is done in &amp;lt;tt&amp;gt;&amp;amp;lt;repository&amp;amp;gt;\.hg\hgrc&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Identity===&lt;br /&gt;
Mercurial lets you configure an identity to associate with your changesets.  By default it uses the name of the account your computer is logged in as.  Many projects (AlliedModders included) use &amp;quot;Firstname Lastname &amp;lt;email&amp;gt;&amp;quot; instead.&lt;br /&gt;
&lt;br /&gt;
To set up your identity, open either your &amp;lt;tt&amp;gt;hgrc&amp;lt;/tt&amp;gt; file (either the main or local one).  Look for a &amp;quot;[ui]&amp;quot; section (or add a new one), and configure something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[ui]&lt;br /&gt;
username = David Anderson &amp;lt;dvander@alliedmods.net&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Push and Pull Locations===&lt;br /&gt;
By default, all &amp;quot;pull&amp;quot; operations on a repository occur from the original location you cloned from.  You can change that location by opening up &amp;lt;tt&amp;gt;&amp;amp;lt;repository&amp;amp;gt;\.hg\hgrc&amp;lt;/tt&amp;gt; and looking at the &amp;quot;[paths]&amp;quot; section.  You will see a lines like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[paths]&lt;br /&gt;
default = http://hg.alliedmods.net/sourcemod-central&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are going to be pushing to one main repository fairly often, you may want to set up a default push.  For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[paths]&lt;br /&gt;
default = http://hg.alliedmods.net/sourcemod-central&lt;br /&gt;
default-push = ssh://dvander@hg.alliedmods.net//hg/sourcemod-central&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Note''': Mercurial uses double slashes to specify an absolute file-system path.  If you are using SSH with logical paths, you only need one slash.  For more information about this, visit the Mercurial documentation.  AlliedModders uses absolute paths.&lt;br /&gt;
&lt;br /&gt;
==Changesets==&lt;br /&gt;
Unlike Subversion, Mercurial can't use version numbers to uniquely identify a changeset.  This is because sequential IDs may be duplicated across repositories.  Instead, Mercurial uses 160-bit changeset identifiers.  These are represented in hexadecimal (for example, &amp;lt;tt&amp;gt;fae5f33a1bb3&amp;lt;/tt&amp;gt;).  &lt;br /&gt;
&lt;br /&gt;
Mercurial also uses local revision numbers which are sequential IDs.  These are local to a repository and have no meaning in other repositories.  They are mainly provided for convenience and usability.  A full changeset in a local repository can be represented by &amp;quot;revision:changeset&amp;quot;.  For example, &amp;lt;tt&amp;gt;19108:fae5f33a1bb3&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The latest changeset is called &amp;lt;tt&amp;gt;tip&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
When using commands like &amp;quot;&amp;lt;tt&amp;gt;update&amp;lt;/tt&amp;gt;,&amp;quot; it is useful to refer to changesets.  You can do this in one of a few ways:&lt;br /&gt;
*Using the &amp;lt;tt&amp;gt;tip&amp;lt;/tt&amp;gt; keyword.  This is the latest changeset.&lt;br /&gt;
*Using a revision number.&lt;br /&gt;
*Using any subset of the changeset string that uniquely identifies the changeset.  For example, &amp;lt;tt&amp;gt;fa&amp;lt;/tt&amp;gt; might not be unique and would not work.  But &amp;lt;tt&amp;gt;fa35&amp;lt;/tt&amp;gt; might work for &amp;lt;tt&amp;gt;fae5f33a1bb3&amp;lt;/tt&amp;gt;.  If it doesn't, you can pick a different substring.&lt;br /&gt;
*Using tags.  Mercurial lets you tag a changeset with a unique alias for convenience (&amp;lt;tt&amp;gt;hg tag&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
==Workflow==&lt;br /&gt;
Let's go through a typical session of developing with Mercurial.  If you are working against a project that has a centralized copy, you may want to make sure you're up to date first.  This means '''pulling''' its changes and then '''updating'''.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg pull&lt;br /&gt;
hg update&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will grab the remote changes from the location you first cloned from.  Then it will apply the changes.  You can do this in one go with:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg pull -u&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also pull from a different repository if you want:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg pull -u http://some.other.site/sourcemod-central&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now let's say you make some changes.  You edit file A.cpp and you want to commit your change.  You can do this with:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg commit&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An editor will pop-up asking you to write a message describing your change.  This is required.&lt;br /&gt;
&lt;br /&gt;
Now you edit B.cpp and commit again.  You're done for the day, and you have two changesets sitting in your repository.  You want to push these upstream.  For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg push ssh://dvander@alliedmods.net//hg/sourcemod-central&lt;br /&gt;
searching for changes&lt;br /&gt;
adding changesets&lt;br /&gt;
adding manifests&lt;br /&gt;
adding file changes&lt;br /&gt;
added 2 changesets with 2 changes to 2 files&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or, if you have a &amp;lt;tt&amp;gt;default-push&amp;lt;/tt&amp;gt; configured:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg push&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If there is more than one person sharing and working on the code base, eventually you will need to deal with merges.  This is an extremely powerful (but also deceptively complex) aspect to Mercurial, and it is extremely important to read the next session.&lt;br /&gt;
&lt;br /&gt;
'''Note''': Since only the first line of a commit message is shown by the &amp;lt;tt&amp;gt;hg log&amp;lt;/tt&amp;gt; command by default, it is highly recommended that the first line of your message be able to stand alone.  For example, you might have a short summary of the commit on the first line that says &amp;quot;Added functions for creating dynamic hooks on virtual functions.&amp;quot; Further lines could give more details on the changes involved such as a list of all the functions that were added.&lt;br /&gt;
&lt;br /&gt;
=Merging and You=&lt;br /&gt;
==Introduction==&lt;br /&gt;
Imagine this scenario:&lt;br /&gt;
*Alice and Bob both have a copy of the source code at revision 'A'.&lt;br /&gt;
*Alice commits and pushes a change.  The main repository is now at changeset 'B'.&lt;br /&gt;
*Bob commits a change and is at changeset 'C'.&lt;br /&gt;
&lt;br /&gt;
Now Bob wants to pull.  He runs &amp;lt;tt&amp;gt;hg pull&amp;lt;/tt&amp;gt; and gets:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
searching for changes&lt;br /&gt;
adding changesets&lt;br /&gt;
adding manifests&lt;br /&gt;
adding file changes&lt;br /&gt;
added 1 changesets with 1 changes to 1 files (+1 heads)&lt;br /&gt;
(run 'hg heads' to see heads, 'hg merge' to merge)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What happened here?  Let's visualize it.  When Alice commits, her repository has gone from A to B like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Hg_alice_1.png]]&lt;br /&gt;
&lt;br /&gt;
When Bob commits, his repository goes from A to C like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Hg_bob_1.png]]&lt;br /&gt;
&lt;br /&gt;
After Bob pulls from Alice, his repository has '''multiple heads''' of development.  He's got two forks of the same codebase in his repository.  You can visualize it like this.  The blue arrow is Bob's changes, and the red arrow is Alice's changes.  They diverge from A.&lt;br /&gt;
&lt;br /&gt;
[[Image:Hg_bob_2.png]]&lt;br /&gt;
&lt;br /&gt;
Bob doesn't want to be in this state, so he '''merges'''.  Merging joins multiple heads back together.  Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg merge&lt;br /&gt;
1 files updated, 1 files merged, 0 files removed, 0 files unresolved&lt;br /&gt;
(branch merge, don't forget to commit)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Merges are changesets, and they must be committed.  Bob commits the merge, and now his repository looks like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Hg_bob_3.png]]&lt;br /&gt;
&lt;br /&gt;
'D' is the changeset that joins the two heads back together.  Now Bob can safely push his changes back, and Alice can pull from Bob.&lt;br /&gt;
&lt;br /&gt;
The above example happened from Bob trying to pull.  But if Bob had tried to push, he would have gotten a nasty error message:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg push&lt;br /&gt;
searching for changes&lt;br /&gt;
abort: push creates new remote heads!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This means Bob's push would have introduced multiple heads on the target repository, rather than his own.  This is generally a bad idea and as a policy projects often don't allow it at all.  Bob has to pull, update, and resolve the merge.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' For most merges, it is a good policy to write simple commit messages.  For example, &amp;quot;Merge.&amp;quot; would suffice.&lt;br /&gt;
&lt;br /&gt;
==Conflicts==&lt;br /&gt;
Merges which don't require any work on your part (other than running &amp;lt;tt&amp;gt;merge&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;commit&amp;lt;/tt&amp;gt;) are called '''trivial merges'''.  &lt;br /&gt;
&lt;br /&gt;
It is possible that Alice and Bob edited the same file however.  In many cases, Mercurial will be smart enough to handle this.  If Mercurial can't figure it out though -- you have to do manually merge the difference between the two files.  This is best done with a three-way merge program.&lt;br /&gt;
&lt;br /&gt;
An example of a merge conflict:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg merge&lt;br /&gt;
merging crab.cpp&lt;br /&gt;
merge: warning: conflicts during merge&lt;br /&gt;
merging crab.cpp failed!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Conflicts must be resolved immediately.  You should never leave your source code in a conflicted state.  If you don't have a merge program installed, the conflicted file(s) will be marked up.  For example, &amp;lt;tt&amp;gt;crab.cpp&amp;lt;/tt&amp;gt; might contain lines like these for each conflict:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; /tmp/conflict/crab.cpp&lt;br /&gt;
void function() {&lt;br /&gt;
=======&lt;br /&gt;
int function() {&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; /tmp/crab.cpp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The two &amp;quot;sides&amp;quot; of the &amp;lt;tt&amp;gt;=======&amp;lt;/tt&amp;gt; bar represent the local and incoming changes.  You should delete the markup and decide how to resolve the two sides.&lt;br /&gt;
&lt;br /&gt;
If you want to use and configure a merge program, see [http://www.selenic.com/mercurial/wiki/index.cgi/MergeProgram MergeProgram] at the Mercurial docs.  Though it's not listed, you can also use [http://www.scootersoftware.com/ Beyond Compare] (the author's personal choice).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=AlliedModders=&lt;br /&gt;
AlliedModders has a public Mercurial listing at [http://hg.alliedmods.net/ http://hg.alliedmods.net/].&lt;br /&gt;
&lt;br /&gt;
Anyone can clone or pull from these.  Only developers with SSH access can push.  Developers should use the following URL formula for pushing: &amp;lt;pre&amp;gt;ssh://USERNAME@hg.alliedmods.net//hg/PROJECT&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should use SSH keys for security.  You should also use the &amp;quot;Firstname Lastname &amp;amp;lt;email&amp;amp;gt;&amp;quot; authorship style.  It is a good idea to configure this ahead of time (read the configuration section above).&lt;br /&gt;
&lt;br /&gt;
It is also highly recommended that long commit messages be split with a short summary on the first line and details on further lines. (See the note at the bottom of the Workflow section above.)&lt;br /&gt;
&lt;br /&gt;
Note that unlike Subversion, you cannot checkout a folder within a repository.  This is by design.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=External Links=&lt;br /&gt;
*[http://www.selenic.com/mercurial/wiki/ Mercurial Home Page]&lt;br /&gt;
*[http://www.selenic.com/mercurial/wiki/index.cgi/UnderstandingMercurial Understanding Mercurial]&lt;br /&gt;
*[http://hgbook.red-bean.com/ Hg Book, free online book about Mercurial]&lt;br /&gt;
*[http://www.selenic.com/mercurial/wiki/index.cgi/Tutorial Mercurial Tutorials]&lt;br /&gt;
&lt;br /&gt;
[[Category:Version Control Systems]]&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Mercurial_Tutorial&amp;diff=6195</id>
		<title>Mercurial Tutorial</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Mercurial_Tutorial&amp;diff=6195"/>
		<updated>2008-09-15T07:23:13Z</updated>

		<summary type="html">&lt;p&gt;DS: /* AlliedModders */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mercurial (Hg) is a distributed version control system.  While it has similarities with [[Subversion Tutorial|Subverison]], it is decentralized in nature.  &lt;br /&gt;
&lt;br /&gt;
=Getting Started=&lt;br /&gt;
==Introduction==&lt;br /&gt;
Mercurial keeps source code in '''repositories'''.  Changes to the source code are made inside the repository and are periodically '''committed'''.  When you commit changes, they are wrapped into a '''changeset'''.  A repository is the sum of all changesets committed over time.&lt;br /&gt;
&lt;br /&gt;
Unlike Subversion, Mercurial has no concept of a &amp;quot;master repository.&amp;quot;  Each user owns a complete local copy of the repository, and they can commit to it without needing any permissions.  Users can share changesets by '''pulling''' from other people's repositories, or '''pushing''' to other repositories (which may require special privileges).&lt;br /&gt;
&lt;br /&gt;
One very noticeable side effect is that when you commit changes in Mercurial, you do not need Internet access.  You only need Internet access if want to push changesets to a remote repository.  This means you can make as many commits as you want before pushing.&lt;br /&gt;
&lt;br /&gt;
'''Now for the contradiction''': You CAN have a master repository with Mercurial.  For some projects it is ideal to have a reference copy.  There is no difference between your copy and the master copy -- how it is managed is simply a matter of permissions and policy.  For example, AlliedModders has a &amp;quot;sourcemod-central&amp;quot; repository where developers push their changesets.  Only SourceMod developers can push to this copy, but anyone can copy it or pull its changes.&lt;br /&gt;
&lt;br /&gt;
==Basic Commands==&lt;br /&gt;
&lt;br /&gt;
These are a few essential Mercurial operations:&lt;br /&gt;
*&amp;lt;tt&amp;gt;clone&amp;lt;/tt&amp;gt; - Copies or downloads a repository.&lt;br /&gt;
*&amp;lt;tt&amp;gt;add&amp;lt;/tt&amp;gt; - Adds a file or directory to the local source tree.&lt;br /&gt;
*&amp;lt;tt&amp;gt;remove&amp;lt;/tt&amp;gt; - Removes a file or directory from the local source tree.&lt;br /&gt;
*&amp;lt;tt&amp;gt;commit&amp;lt;/tt&amp;gt; - Commits any local changes to your local source tree.&lt;br /&gt;
*&amp;lt;tt&amp;gt;pull&amp;lt;/tt&amp;gt; - Retrieves changesets from another repository.&lt;br /&gt;
*&amp;lt;tt&amp;gt;update&amp;lt;/tt&amp;gt; - Updates source code with all pending pulled changes.&lt;br /&gt;
*&amp;lt;tt&amp;gt;push&amp;lt;/tt&amp;gt; - Pushes your changesets to a remote repository.&lt;br /&gt;
*&amp;lt;tt&amp;gt;merge&amp;lt;/tt&amp;gt; - Merges two repositories together (explained later).&lt;br /&gt;
&lt;br /&gt;
==Installing==&lt;br /&gt;
&lt;br /&gt;
The author of this article uses command line Mercurial (on both Linux and Windows).  You can download both the command line tools at the [http://www.selenic.com/mercurial/wiki/ Mercurial Site], and there is a TortoiseHg graphical tool for those who would like to try it.&lt;br /&gt;
&lt;br /&gt;
==Getting a Repository==&lt;br /&gt;
To retrieve a repository, you must use the &amp;quot;clone&amp;quot; command.  You can clone a local or remote repository.  Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg clone http://hg.alliedmods.net/sourcemod-central sourcemod-central&lt;br /&gt;
hg clone sourcemod-central sourcemod-copy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also create a new repository:&lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir project&lt;br /&gt;
cd project&lt;br /&gt;
hg init&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create a blank repository and initialize it with Mercurial.&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
Mercurial lets you configure default settings for all repositories and settings specific to one repository.  &lt;br /&gt;
&lt;br /&gt;
On Linux, the main configuration file is &amp;lt;tt&amp;gt;~/.hgrc&amp;lt;/tt&amp;gt;.  On Windows 2003/XP and prior, it is &amp;lt;tt&amp;gt;C:\Documents and Settings\&amp;amp;lt;account&amp;amp;gt;\Mercurial.ini&amp;lt;/tt&amp;gt;.  On Windows Vista, it is &amp;lt;tt&amp;gt;C:\Users\&amp;amp;lt;account&amp;amp;gt;\Mercurial.ini&amp;lt;/tt&amp;gt;.  If the file does not exist, you can create it.&lt;br /&gt;
&lt;br /&gt;
Per-repository configuration is done in &amp;lt;tt&amp;gt;&amp;amp;lt;repository&amp;amp;gt;\.hg\hgrc&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Identity===&lt;br /&gt;
Mercurial lets you configure an identity to associate with your changesets.  By default it uses the name of the account your computer is logged in as.  Many projects (AlliedModders included) use &amp;quot;Firstname Lastname &amp;lt;email&amp;gt;&amp;quot; instead.&lt;br /&gt;
&lt;br /&gt;
To set up your identity, open either your &amp;lt;tt&amp;gt;hgrc&amp;lt;/tt&amp;gt; file (either the main or local one).  Look for a &amp;quot;[ui]&amp;quot; section (or add a new one), and configure something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[ui]&lt;br /&gt;
username = David Anderson &amp;lt;dvander@alliedmods.net&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Push and Pull Locations===&lt;br /&gt;
By default, all &amp;quot;pull&amp;quot; operations on a repository occur from the original location you cloned from.  You can change that location by opening up &amp;lt;tt&amp;gt;&amp;amp;lt;repository&amp;amp;gt;\.hg\hgrc&amp;lt;/tt&amp;gt; and looking at the &amp;quot;[paths]&amp;quot; section.  You will see a lines like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[paths]&lt;br /&gt;
default = http://hg.alliedmods.net/sourcemod-central&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are going to be pushing to one main repository fairly often, you may want to set up a default push.  For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[paths]&lt;br /&gt;
default = http://hg.alliedmods.net/sourcemod-central&lt;br /&gt;
default-push = ssh://dvander@hg.alliedmods.net//hg/sourcemod-central&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Note''': Mercurial uses double slashes to specify an absolute file-system path.  If you are using SSH with logical paths, you only need one slash.  For more information about this, visit the Mercurial documentation.  AlliedModders uses absolute paths.&lt;br /&gt;
&lt;br /&gt;
==Changesets==&lt;br /&gt;
Unlike Subversion, Mercurial can't use version numbers to uniquely identify a changeset.  This is because sequential IDs may be duplicated across repositories.  Instead, Mercurial uses 160-bit changeset identifiers.  These are represented in hexadecimal (for example, &amp;lt;tt&amp;gt;fae5f33a1bb3&amp;lt;/tt&amp;gt;).  &lt;br /&gt;
&lt;br /&gt;
Mercurial also uses local revision numbers which are sequential IDs.  These are local to a repository and have no meaning in other repositories.  They are mainly provided for convenience and usability.  A full changeset in a local repository can be represented by &amp;quot;revision:changeset&amp;quot;.  For example, &amp;lt;tt&amp;gt;19108:fae5f33a1bb3&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The latest changeset is called &amp;lt;tt&amp;gt;tip&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
When using commands like &amp;quot;&amp;lt;tt&amp;gt;update&amp;lt;/tt&amp;gt;,&amp;quot; it is useful to refer to changesets.  You can do this in one of a few ways:&lt;br /&gt;
*Using the &amp;lt;tt&amp;gt;tip&amp;lt;/tt&amp;gt; keyword.  This is the latest changeset.&lt;br /&gt;
*Using a revision number.&lt;br /&gt;
*Using any subset of the changeset string that uniquely identifies the changeset.  For example, &amp;lt;tt&amp;gt;fa&amp;lt;/tt&amp;gt; might not be unique and would not work.  But &amp;lt;tt&amp;gt;fa35&amp;lt;/tt&amp;gt; might work for &amp;lt;tt&amp;gt;fae5f33a1bb3&amp;lt;/tt&amp;gt;.  If it doesn't, you can pick a different substring.&lt;br /&gt;
*Using tags.  Mercurial lets you tag a changeset with a unique alias for convenience (&amp;lt;tt&amp;gt;hg tag&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
==Workflow==&lt;br /&gt;
Let's go through a typical session of developing with Mercurial.  If you are working against a project that has a centralized copy, you may want to make sure you're up to date first.  This means '''pulling''' its changes and then '''updating'''.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg pull&lt;br /&gt;
hg update&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will grab the remote changes from the location you first cloned from.  Then it will apply the changes.  You can do this in one go with:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg pull -u&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also pull from a different repository if you want:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg pull -u http://some.other.site/sourcemod-central&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now let's say you make some changes.  You edit file A.cpp and you want to commit your change.  You can do this with:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg commit&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An editor will pop-up asking you to write a message describing your change.  This is required.&lt;br /&gt;
&lt;br /&gt;
Now you edit B.cpp and commit again.  You're done for the day, and you have two changesets sitting in your repository.  You want to push these upstream.  For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg push ssh://dvander@alliedmods.net//hg/sourcemod-central&lt;br /&gt;
searching for changes&lt;br /&gt;
adding changesets&lt;br /&gt;
adding manifests&lt;br /&gt;
adding file changes&lt;br /&gt;
added 2 changesets with 2 changes to 2 files&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or, if you have a &amp;lt;tt&amp;gt;default-push&amp;lt;/tt&amp;gt; configured:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg push&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If there is more than one person sharing and working on the code base, eventually you will need to deal with merges.  This is an extremely powerful (but also deceptively complex) aspect to Mercurial, and it is extremely important to read the next session.&lt;br /&gt;
&lt;br /&gt;
'''Note''': Since only the first line of a commit message is shown by the &amp;lt;tt&amp;gt;hg log&amp;lt;/tt&amp;gt; command by default, it is highly recommended that the first line of your message be able to stand alone.  For example, you might have a short summary of the commit on the first line that says &amp;quot;Added functions for creating dynamic hooks on virtual functions.&amp;quot; Further lines could give more details on the changes involved such as a list of all the functions that were added.&lt;br /&gt;
&lt;br /&gt;
=Merging and You=&lt;br /&gt;
==Introduction==&lt;br /&gt;
Imagine this scenario:&lt;br /&gt;
*Alice and Bob both have a copy of the source code at revision 'A'.&lt;br /&gt;
*Alice commits and pushes a change.  The main repository is now at changeset 'B'.&lt;br /&gt;
*Bob commits a change and is at changeset 'C'.&lt;br /&gt;
&lt;br /&gt;
Now Bob wants to pull.  He runs &amp;lt;tt&amp;gt;hg pull&amp;lt;/tt&amp;gt; and gets:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
searching for changes&lt;br /&gt;
adding changesets&lt;br /&gt;
adding manifests&lt;br /&gt;
adding file changes&lt;br /&gt;
added 1 changesets with 1 changes to 1 files (+1 heads)&lt;br /&gt;
(run 'hg heads' to see heads, 'hg merge' to merge)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What happened here?  Let's visualize it.  When Alice commits, her repository has gone from A to B like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Hg_alice_1.png]]&lt;br /&gt;
&lt;br /&gt;
When Bob commits, his repository goes from A to C like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Hg_bob_1.png]]&lt;br /&gt;
&lt;br /&gt;
After Bob pulls from Alice, his repository has '''multiple heads''' of development.  He's got two forks of the same codebase in his repository.  You can visualize it like this.  The blue arrow is Bob's changes, and the red arrow is Alice's changes.  They diverge from A.&lt;br /&gt;
&lt;br /&gt;
[[Image:Hg_bob_2.png]]&lt;br /&gt;
&lt;br /&gt;
Bob doesn't want to be in this state, so he '''merges'''.  Merging joins multiple heads back together.  Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg merge&lt;br /&gt;
1 files updated, 1 files merged, 0 files removed, 0 files unresolved&lt;br /&gt;
(branch merge, don't forget to commit)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Merges are changesets, and they must be committed.  Bob commits the merge, and now his repository looks like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Hg_bob_3.png]]&lt;br /&gt;
&lt;br /&gt;
'D' is the changeset that joins the two heads back together.  Now Bob can safely push his changes back, and Alice can pull from Bob.&lt;br /&gt;
&lt;br /&gt;
The above example happened from Bob trying to pull.  But if Bob had tried to push, he would have gotten a nasty error message:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg push&lt;br /&gt;
searching for changes&lt;br /&gt;
abort: push creates new remote heads!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This means Bob's push would have introduced multiple heads on the target repository, rather than his own.  This is generally a bad idea and as a policy projects often don't allow it at all.  Bob has to pull, update, and resolve the merge.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' For most merges, it is a good policy to write simple commit messages.  For example, &amp;quot;Merge.&amp;quot; would suffice.&lt;br /&gt;
&lt;br /&gt;
==Conflicts==&lt;br /&gt;
Merges which don't require any work on your part (other than running &amp;lt;tt&amp;gt;merge&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;commit&amp;lt;/tt&amp;gt;) are called '''trivial merges'''.  &lt;br /&gt;
&lt;br /&gt;
It is possible that Alice and Bob edited the same file however.  In many cases, Mercurial will be smart enough to handle this.  If Mercurial can't figure it out though -- you have to do manually merge the difference between the two files.  This is best done with a three-way merge program.&lt;br /&gt;
&lt;br /&gt;
An example of a merge conflict:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg merge&lt;br /&gt;
merging crab.cpp&lt;br /&gt;
merge: warning: conflicts during merge&lt;br /&gt;
merging crab.cpp failed!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Conflicts must be resolved immediately.  You should never leave your source code in a conflicted state.  If you don't have a merge program installed, the conflicted file(s) will be marked up.  For example, &amp;lt;tt&amp;gt;crab.cpp&amp;lt;/tt&amp;gt; might contain lines like these for each conflict:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; /tmp/conflict/crab.cpp&lt;br /&gt;
void function() {&lt;br /&gt;
=======&lt;br /&gt;
int function() {&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; /tmp/crab.cpp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The two &amp;quot;sides&amp;quot; of the &amp;lt;tt&amp;gt;=======&amp;lt;/tt&amp;gt; bar represent the local and incoming changes.  You should delete the markup and decide how to resolve the two sides.&lt;br /&gt;
&lt;br /&gt;
If you want to use and configure a merge program, see [http://www.selenic.com/mercurial/wiki/index.cgi/MergeProgram MergeProgram] at the Mercurial docs.  Though it's not listed, you can also use [http://www.scootersoftware.com/ Beyond Compare] (the author's personal choice).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=AlliedModders=&lt;br /&gt;
AlliedModders has a public Mercurial listing at [http://hg.alliedmods.net/ http://hg.alliedmods.net/].&lt;br /&gt;
&lt;br /&gt;
Anyone can clone or pull from these.  Only developers with SSH access can push.  Developers should use the following URL formula for pushing: &amp;lt;pre&amp;gt;ssh://USERNAME@hg.alliedmods.net//hg/PROJECT&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should use SSH keys for security.  You should also use the &amp;quot;Firstname Lastname &amp;amp;lt;email&amp;amp;gt;&amp;quot; authorship style.  It is a good idea to configure this ahead of time (read the configuration section above).&lt;br /&gt;
&lt;br /&gt;
It is also highly recommended that long commit messages be split with a short summary on the first line and details on further lines. (See the note at the bottom of the Workflow section above.)&lt;br /&gt;
&lt;br /&gt;
Note that unlike Subversion, you cannot checkout a folder within a repository.  This is by design.&lt;br /&gt;
&lt;br /&gt;
=AlliedModders=&lt;br /&gt;
AlliedModders has a public Mercurial listing at [http://hg.alliedmods.net/ http://hg.alliedmods.net/].&lt;br /&gt;
&lt;br /&gt;
Anyone can clone or pull from these.  Only developers with SSH access can push.  Developers should use the following URL formula for pushing: &amp;lt;pre&amp;gt;ssh://USERNAME@hg.alliedmods.net//hg/PROJECT&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should use SSH keys for security.  You should also use the &amp;quot;Firstname Lastname &amp;amp;lt;email&amp;amp;gt;&amp;quot; authorship style.  It is a good idea to configure this ahead of time (read the configuration section above).&lt;br /&gt;
&lt;br /&gt;
It is highly recommended that long commit messages be split with a short summary on the first line and details on further lines. (See the note at the bottom of the Workflow section above.)&lt;br /&gt;
&lt;br /&gt;
Note that unlike Subversion, you cannot checkout a folder within a repository.  This is by design.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=External Links=&lt;br /&gt;
*[http://www.selenic.com/mercurial/wiki/ Mercurial Home Page]&lt;br /&gt;
*[http://www.selenic.com/mercurial/wiki/index.cgi/UnderstandingMercurial Understanding Mercurial]&lt;br /&gt;
*[http://hgbook.red-bean.com/ Hg Book, free online book about Mercurial]&lt;br /&gt;
*[http://www.selenic.com/mercurial/wiki/index.cgi/Tutorial Mercurial Tutorials]&lt;br /&gt;
&lt;br /&gt;
[[Category:Version Control Systems]]&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Mercurial_Tutorial&amp;diff=6194</id>
		<title>Mercurial Tutorial</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Mercurial_Tutorial&amp;diff=6194"/>
		<updated>2008-09-15T07:22:58Z</updated>

		<summary type="html">&lt;p&gt;DS: Removed duplicate section - Wonder how did that happened&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mercurial (Hg) is a distributed version control system.  While it has similarities with [[Subversion Tutorial|Subverison]], it is decentralized in nature.  &lt;br /&gt;
&lt;br /&gt;
=Getting Started=&lt;br /&gt;
==Introduction==&lt;br /&gt;
Mercurial keeps source code in '''repositories'''.  Changes to the source code are made inside the repository and are periodically '''committed'''.  When you commit changes, they are wrapped into a '''changeset'''.  A repository is the sum of all changesets committed over time.&lt;br /&gt;
&lt;br /&gt;
Unlike Subversion, Mercurial has no concept of a &amp;quot;master repository.&amp;quot;  Each user owns a complete local copy of the repository, and they can commit to it without needing any permissions.  Users can share changesets by '''pulling''' from other people's repositories, or '''pushing''' to other repositories (which may require special privileges).&lt;br /&gt;
&lt;br /&gt;
One very noticeable side effect is that when you commit changes in Mercurial, you do not need Internet access.  You only need Internet access if want to push changesets to a remote repository.  This means you can make as many commits as you want before pushing.&lt;br /&gt;
&lt;br /&gt;
'''Now for the contradiction''': You CAN have a master repository with Mercurial.  For some projects it is ideal to have a reference copy.  There is no difference between your copy and the master copy -- how it is managed is simply a matter of permissions and policy.  For example, AlliedModders has a &amp;quot;sourcemod-central&amp;quot; repository where developers push their changesets.  Only SourceMod developers can push to this copy, but anyone can copy it or pull its changes.&lt;br /&gt;
&lt;br /&gt;
==Basic Commands==&lt;br /&gt;
&lt;br /&gt;
These are a few essential Mercurial operations:&lt;br /&gt;
*&amp;lt;tt&amp;gt;clone&amp;lt;/tt&amp;gt; - Copies or downloads a repository.&lt;br /&gt;
*&amp;lt;tt&amp;gt;add&amp;lt;/tt&amp;gt; - Adds a file or directory to the local source tree.&lt;br /&gt;
*&amp;lt;tt&amp;gt;remove&amp;lt;/tt&amp;gt; - Removes a file or directory from the local source tree.&lt;br /&gt;
*&amp;lt;tt&amp;gt;commit&amp;lt;/tt&amp;gt; - Commits any local changes to your local source tree.&lt;br /&gt;
*&amp;lt;tt&amp;gt;pull&amp;lt;/tt&amp;gt; - Retrieves changesets from another repository.&lt;br /&gt;
*&amp;lt;tt&amp;gt;update&amp;lt;/tt&amp;gt; - Updates source code with all pending pulled changes.&lt;br /&gt;
*&amp;lt;tt&amp;gt;push&amp;lt;/tt&amp;gt; - Pushes your changesets to a remote repository.&lt;br /&gt;
*&amp;lt;tt&amp;gt;merge&amp;lt;/tt&amp;gt; - Merges two repositories together (explained later).&lt;br /&gt;
&lt;br /&gt;
==Installing==&lt;br /&gt;
&lt;br /&gt;
The author of this article uses command line Mercurial (on both Linux and Windows).  You can download both the command line tools at the [http://www.selenic.com/mercurial/wiki/ Mercurial Site], and there is a TortoiseHg graphical tool for those who would like to try it.&lt;br /&gt;
&lt;br /&gt;
==Getting a Repository==&lt;br /&gt;
To retrieve a repository, you must use the &amp;quot;clone&amp;quot; command.  You can clone a local or remote repository.  Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg clone http://hg.alliedmods.net/sourcemod-central sourcemod-central&lt;br /&gt;
hg clone sourcemod-central sourcemod-copy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also create a new repository:&lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir project&lt;br /&gt;
cd project&lt;br /&gt;
hg init&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create a blank repository and initialize it with Mercurial.&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
Mercurial lets you configure default settings for all repositories and settings specific to one repository.  &lt;br /&gt;
&lt;br /&gt;
On Linux, the main configuration file is &amp;lt;tt&amp;gt;~/.hgrc&amp;lt;/tt&amp;gt;.  On Windows 2003/XP and prior, it is &amp;lt;tt&amp;gt;C:\Documents and Settings\&amp;amp;lt;account&amp;amp;gt;\Mercurial.ini&amp;lt;/tt&amp;gt;.  On Windows Vista, it is &amp;lt;tt&amp;gt;C:\Users\&amp;amp;lt;account&amp;amp;gt;\Mercurial.ini&amp;lt;/tt&amp;gt;.  If the file does not exist, you can create it.&lt;br /&gt;
&lt;br /&gt;
Per-repository configuration is done in &amp;lt;tt&amp;gt;&amp;amp;lt;repository&amp;amp;gt;\.hg\hgrc&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Identity===&lt;br /&gt;
Mercurial lets you configure an identity to associate with your changesets.  By default it uses the name of the account your computer is logged in as.  Many projects (AlliedModders included) use &amp;quot;Firstname Lastname &amp;lt;email&amp;gt;&amp;quot; instead.&lt;br /&gt;
&lt;br /&gt;
To set up your identity, open either your &amp;lt;tt&amp;gt;hgrc&amp;lt;/tt&amp;gt; file (either the main or local one).  Look for a &amp;quot;[ui]&amp;quot; section (or add a new one), and configure something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[ui]&lt;br /&gt;
username = David Anderson &amp;lt;dvander@alliedmods.net&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Push and Pull Locations===&lt;br /&gt;
By default, all &amp;quot;pull&amp;quot; operations on a repository occur from the original location you cloned from.  You can change that location by opening up &amp;lt;tt&amp;gt;&amp;amp;lt;repository&amp;amp;gt;\.hg\hgrc&amp;lt;/tt&amp;gt; and looking at the &amp;quot;[paths]&amp;quot; section.  You will see a lines like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[paths]&lt;br /&gt;
default = http://hg.alliedmods.net/sourcemod-central&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are going to be pushing to one main repository fairly often, you may want to set up a default push.  For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[paths]&lt;br /&gt;
default = http://hg.alliedmods.net/sourcemod-central&lt;br /&gt;
default-push = ssh://dvander@hg.alliedmods.net//hg/sourcemod-central&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Note''': Mercurial uses double slashes to specify an absolute file-system path.  If you are using SSH with logical paths, you only need one slash.  For more information about this, visit the Mercurial documentation.  AlliedModders uses absolute paths.&lt;br /&gt;
&lt;br /&gt;
==Changesets==&lt;br /&gt;
Unlike Subversion, Mercurial can't use version numbers to uniquely identify a changeset.  This is because sequential IDs may be duplicated across repositories.  Instead, Mercurial uses 160-bit changeset identifiers.  These are represented in hexadecimal (for example, &amp;lt;tt&amp;gt;fae5f33a1bb3&amp;lt;/tt&amp;gt;).  &lt;br /&gt;
&lt;br /&gt;
Mercurial also uses local revision numbers which are sequential IDs.  These are local to a repository and have no meaning in other repositories.  They are mainly provided for convenience and usability.  A full changeset in a local repository can be represented by &amp;quot;revision:changeset&amp;quot;.  For example, &amp;lt;tt&amp;gt;19108:fae5f33a1bb3&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The latest changeset is called &amp;lt;tt&amp;gt;tip&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
When using commands like &amp;quot;&amp;lt;tt&amp;gt;update&amp;lt;/tt&amp;gt;,&amp;quot; it is useful to refer to changesets.  You can do this in one of a few ways:&lt;br /&gt;
*Using the &amp;lt;tt&amp;gt;tip&amp;lt;/tt&amp;gt; keyword.  This is the latest changeset.&lt;br /&gt;
*Using a revision number.&lt;br /&gt;
*Using any subset of the changeset string that uniquely identifies the changeset.  For example, &amp;lt;tt&amp;gt;fa&amp;lt;/tt&amp;gt; might not be unique and would not work.  But &amp;lt;tt&amp;gt;fa35&amp;lt;/tt&amp;gt; might work for &amp;lt;tt&amp;gt;fae5f33a1bb3&amp;lt;/tt&amp;gt;.  If it doesn't, you can pick a different substring.&lt;br /&gt;
*Using tags.  Mercurial lets you tag a changeset with a unique alias for convenience (&amp;lt;tt&amp;gt;hg tag&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
==Workflow==&lt;br /&gt;
Let's go through a typical session of developing with Mercurial.  If you are working against a project that has a centralized copy, you may want to make sure you're up to date first.  This means '''pulling''' its changes and then '''updating'''.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg pull&lt;br /&gt;
hg update&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will grab the remote changes from the location you first cloned from.  Then it will apply the changes.  You can do this in one go with:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg pull -u&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also pull from a different repository if you want:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg pull -u http://some.other.site/sourcemod-central&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now let's say you make some changes.  You edit file A.cpp and you want to commit your change.  You can do this with:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg commit&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An editor will pop-up asking you to write a message describing your change.  This is required.&lt;br /&gt;
&lt;br /&gt;
Now you edit B.cpp and commit again.  You're done for the day, and you have two changesets sitting in your repository.  You want to push these upstream.  For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg push ssh://dvander@alliedmods.net//hg/sourcemod-central&lt;br /&gt;
searching for changes&lt;br /&gt;
adding changesets&lt;br /&gt;
adding manifests&lt;br /&gt;
adding file changes&lt;br /&gt;
added 2 changesets with 2 changes to 2 files&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or, if you have a &amp;lt;tt&amp;gt;default-push&amp;lt;/tt&amp;gt; configured:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg push&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If there is more than one person sharing and working on the code base, eventually you will need to deal with merges.  This is an extremely powerful (but also deceptively complex) aspect to Mercurial, and it is extremely important to read the next session.&lt;br /&gt;
&lt;br /&gt;
'''Note''': Since only the first line of a commit message is shown by the &amp;lt;tt&amp;gt;hg log&amp;lt;/tt&amp;gt; command by default, it is highly recommended that the first line of your message be able to stand alone.  For example, you might have a short summary of the commit on the first line that says &amp;quot;Added functions for creating dynamic hooks on virtual functions.&amp;quot; Further lines could give more details on the changes involved such as a list of all the functions that were added.&lt;br /&gt;
&lt;br /&gt;
=Merging and You=&lt;br /&gt;
==Introduction==&lt;br /&gt;
Imagine this scenario:&lt;br /&gt;
*Alice and Bob both have a copy of the source code at revision 'A'.&lt;br /&gt;
*Alice commits and pushes a change.  The main repository is now at changeset 'B'.&lt;br /&gt;
*Bob commits a change and is at changeset 'C'.&lt;br /&gt;
&lt;br /&gt;
Now Bob wants to pull.  He runs &amp;lt;tt&amp;gt;hg pull&amp;lt;/tt&amp;gt; and gets:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
searching for changes&lt;br /&gt;
adding changesets&lt;br /&gt;
adding manifests&lt;br /&gt;
adding file changes&lt;br /&gt;
added 1 changesets with 1 changes to 1 files (+1 heads)&lt;br /&gt;
(run 'hg heads' to see heads, 'hg merge' to merge)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What happened here?  Let's visualize it.  When Alice commits, her repository has gone from A to B like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Hg_alice_1.png]]&lt;br /&gt;
&lt;br /&gt;
When Bob commits, his repository goes from A to C like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Hg_bob_1.png]]&lt;br /&gt;
&lt;br /&gt;
After Bob pulls from Alice, his repository has '''multiple heads''' of development.  He's got two forks of the same codebase in his repository.  You can visualize it like this.  The blue arrow is Bob's changes, and the red arrow is Alice's changes.  They diverge from A.&lt;br /&gt;
&lt;br /&gt;
[[Image:Hg_bob_2.png]]&lt;br /&gt;
&lt;br /&gt;
Bob doesn't want to be in this state, so he '''merges'''.  Merging joins multiple heads back together.  Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg merge&lt;br /&gt;
1 files updated, 1 files merged, 0 files removed, 0 files unresolved&lt;br /&gt;
(branch merge, don't forget to commit)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Merges are changesets, and they must be committed.  Bob commits the merge, and now his repository looks like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Hg_bob_3.png]]&lt;br /&gt;
&lt;br /&gt;
'D' is the changeset that joins the two heads back together.  Now Bob can safely push his changes back, and Alice can pull from Bob.&lt;br /&gt;
&lt;br /&gt;
The above example happened from Bob trying to pull.  But if Bob had tried to push, he would have gotten a nasty error message:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg push&lt;br /&gt;
searching for changes&lt;br /&gt;
abort: push creates new remote heads!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This means Bob's push would have introduced multiple heads on the target repository, rather than his own.  This is generally a bad idea and as a policy projects often don't allow it at all.  Bob has to pull, update, and resolve the merge.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' For most merges, it is a good policy to write simple commit messages.  For example, &amp;quot;Merge.&amp;quot; would suffice.&lt;br /&gt;
&lt;br /&gt;
==Conflicts==&lt;br /&gt;
Merges which don't require any work on your part (other than running &amp;lt;tt&amp;gt;merge&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;commit&amp;lt;/tt&amp;gt;) are called '''trivial merges'''.  &lt;br /&gt;
&lt;br /&gt;
It is possible that Alice and Bob edited the same file however.  In many cases, Mercurial will be smart enough to handle this.  If Mercurial can't figure it out though -- you have to do manually merge the difference between the two files.  This is best done with a three-way merge program.&lt;br /&gt;
&lt;br /&gt;
An example of a merge conflict:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg merge&lt;br /&gt;
merging crab.cpp&lt;br /&gt;
merge: warning: conflicts during merge&lt;br /&gt;
merging crab.cpp failed!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Conflicts must be resolved immediately.  You should never leave your source code in a conflicted state.  If you don't have a merge program installed, the conflicted file(s) will be marked up.  For example, &amp;lt;tt&amp;gt;crab.cpp&amp;lt;/tt&amp;gt; might contain lines like these for each conflict:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; /tmp/conflict/crab.cpp&lt;br /&gt;
void function() {&lt;br /&gt;
=======&lt;br /&gt;
int function() {&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; /tmp/crab.cpp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The two &amp;quot;sides&amp;quot; of the &amp;lt;tt&amp;gt;=======&amp;lt;/tt&amp;gt; bar represent the local and incoming changes.  You should delete the markup and decide how to resolve the two sides.&lt;br /&gt;
&lt;br /&gt;
If you want to use and configure a merge program, see [http://www.selenic.com/mercurial/wiki/index.cgi/MergeProgram MergeProgram] at the Mercurial docs.  Though it's not listed, you can also use [http://www.scootersoftware.com/ Beyond Compare] (the author's personal choice).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Other Commands=&lt;br /&gt;
&amp;lt;tt&amp;gt;hg diff&amp;lt;/tt&amp;gt; is very useful for reviewing changes before you commit them.  You can also use it for generating patches.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;hg log&amp;lt;/tt&amp;gt; lets you view the changeset history.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;hg glog&amp;lt;/tt&amp;gt; lets you view an ASCII graph of the changeset history.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;hg identity&amp;lt;/tt&amp;gt; tells you the state of your repository.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;hg status&amp;lt;/tt&amp;gt; shows you any changed or unknown files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;hg status -m&amp;lt;/tt&amp;gt; shows you any changed files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;hg revert&amp;lt;/tt&amp;gt; will remove any changes you've made to one or more files.  It will save the originals as the same file name with &amp;lt;tt&amp;gt;.orig&amp;lt;/tt&amp;gt; at the end.&lt;br /&gt;
&lt;br /&gt;
For many commands you can specify a folder within the repository to only affect that folder and its children.  This can speed up slow operations.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=AlliedModders=&lt;br /&gt;
AlliedModders has a public Mercurial listing at [http://hg.alliedmods.net/ http://hg.alliedmods.net/].&lt;br /&gt;
&lt;br /&gt;
Anyone can clone or pull from these.  Only developers with SSH access can push.  Developers should use the following URL formula for pushing: &amp;lt;pre&amp;gt;ssh://USERNAME@hg.alliedmods.net//hg/PROJECT&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should use SSH keys for security.  You should also use the &amp;quot;Firstname Lastname &amp;amp;lt;email&amp;amp;gt;&amp;quot; authorship style.  It is a good idea to configure this ahead of time (read the configuration section above).&lt;br /&gt;
&lt;br /&gt;
It is highly recommended that long commit messages be split with a short summary on the first line and details on further lines. (See the note at the bottom of the Workflow section above.)&lt;br /&gt;
&lt;br /&gt;
Note that unlike Subversion, you cannot checkout a folder within a repository.  This is by design.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=External Links=&lt;br /&gt;
*[http://www.selenic.com/mercurial/wiki/ Mercurial Home Page]&lt;br /&gt;
*[http://www.selenic.com/mercurial/wiki/index.cgi/UnderstandingMercurial Understanding Mercurial]&lt;br /&gt;
*[http://hgbook.red-bean.com/ Hg Book, free online book about Mercurial]&lt;br /&gt;
*[http://www.selenic.com/mercurial/wiki/index.cgi/Tutorial Mercurial Tutorials]&lt;br /&gt;
&lt;br /&gt;
[[Category:Version Control Systems]]&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Mercurial_Tutorial&amp;diff=6193</id>
		<title>Mercurial Tutorial</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Mercurial_Tutorial&amp;diff=6193"/>
		<updated>2008-09-15T07:21:26Z</updated>

		<summary type="html">&lt;p&gt;DS: /* AlliedModders */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mercurial (Hg) is a distributed version control system.  While it has similarities with [[Subversion Tutorial|Subverison]], it is decentralized in nature.  &lt;br /&gt;
&lt;br /&gt;
=Getting Started=&lt;br /&gt;
==Introduction==&lt;br /&gt;
Mercurial keeps source code in '''repositories'''.  Changes to the source code are made inside the repository and are periodically '''committed'''.  When you commit changes, they are wrapped into a '''changeset'''.  A repository is the sum of all changesets committed over time.&lt;br /&gt;
&lt;br /&gt;
Unlike Subversion, Mercurial has no concept of a &amp;quot;master repository.&amp;quot;  Each user owns a complete local copy of the repository, and they can commit to it without needing any permissions.  Users can share changesets by '''pulling''' from other people's repositories, or '''pushing''' to other repositories (which may require special privileges).&lt;br /&gt;
&lt;br /&gt;
One very noticeable side effect is that when you commit changes in Mercurial, you do not need Internet access.  You only need Internet access if want to push changesets to a remote repository.  This means you can make as many commits as you want before pushing.&lt;br /&gt;
&lt;br /&gt;
'''Now for the contradiction''': You CAN have a master repository with Mercurial.  For some projects it is ideal to have a reference copy.  There is no difference between your copy and the master copy -- how it is managed is simply a matter of permissions and policy.  For example, AlliedModders has a &amp;quot;sourcemod-central&amp;quot; repository where developers push their changesets.  Only SourceMod developers can push to this copy, but anyone can copy it or pull its changes.&lt;br /&gt;
&lt;br /&gt;
==Basic Commands==&lt;br /&gt;
&lt;br /&gt;
These are a few essential Mercurial operations:&lt;br /&gt;
*&amp;lt;tt&amp;gt;clone&amp;lt;/tt&amp;gt; - Copies or downloads a repository.&lt;br /&gt;
*&amp;lt;tt&amp;gt;add&amp;lt;/tt&amp;gt; - Adds a file or directory to the local source tree.&lt;br /&gt;
*&amp;lt;tt&amp;gt;remove&amp;lt;/tt&amp;gt; - Removes a file or directory from the local source tree.&lt;br /&gt;
*&amp;lt;tt&amp;gt;commit&amp;lt;/tt&amp;gt; - Commits any local changes to your local source tree.&lt;br /&gt;
*&amp;lt;tt&amp;gt;pull&amp;lt;/tt&amp;gt; - Retrieves changesets from another repository.&lt;br /&gt;
*&amp;lt;tt&amp;gt;update&amp;lt;/tt&amp;gt; - Updates source code with all pending pulled changes.&lt;br /&gt;
*&amp;lt;tt&amp;gt;push&amp;lt;/tt&amp;gt; - Pushes your changesets to a remote repository.&lt;br /&gt;
*&amp;lt;tt&amp;gt;merge&amp;lt;/tt&amp;gt; - Merges two repositories together (explained later).&lt;br /&gt;
&lt;br /&gt;
==Installing==&lt;br /&gt;
&lt;br /&gt;
The author of this article uses command line Mercurial (on both Linux and Windows).  You can download both the command line tools at the [http://www.selenic.com/mercurial/wiki/ Mercurial Site], and there is a TortoiseHg graphical tool for those who would like to try it.&lt;br /&gt;
&lt;br /&gt;
==Getting a Repository==&lt;br /&gt;
To retrieve a repository, you must use the &amp;quot;clone&amp;quot; command.  You can clone a local or remote repository.  Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg clone http://hg.alliedmods.net/sourcemod-central sourcemod-central&lt;br /&gt;
hg clone sourcemod-central sourcemod-copy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also create a new repository:&lt;br /&gt;
&amp;lt;pre&amp;gt;mkdir project&lt;br /&gt;
cd project&lt;br /&gt;
hg init&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create a blank repository and initialize it with Mercurial.&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
Mercurial lets you configure default settings for all repositories and settings specific to one repository.  &lt;br /&gt;
&lt;br /&gt;
On Linux, the main configuration file is &amp;lt;tt&amp;gt;~/.hgrc&amp;lt;/tt&amp;gt;.  On Windows 2003/XP and prior, it is &amp;lt;tt&amp;gt;C:\Documents and Settings\&amp;amp;lt;account&amp;amp;gt;\Mercurial.ini&amp;lt;/tt&amp;gt;.  On Windows Vista, it is &amp;lt;tt&amp;gt;C:\Users\&amp;amp;lt;account&amp;amp;gt;\Mercurial.ini&amp;lt;/tt&amp;gt;.  If the file does not exist, you can create it.&lt;br /&gt;
&lt;br /&gt;
Per-repository configuration is done in &amp;lt;tt&amp;gt;&amp;amp;lt;repository&amp;amp;gt;\.hg\hgrc&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Identity===&lt;br /&gt;
Mercurial lets you configure an identity to associate with your changesets.  By default it uses the name of the account your computer is logged in as.  Many projects (AlliedModders included) use &amp;quot;Firstname Lastname &amp;lt;email&amp;gt;&amp;quot; instead.&lt;br /&gt;
&lt;br /&gt;
To set up your identity, open either your &amp;lt;tt&amp;gt;hgrc&amp;lt;/tt&amp;gt; file (either the main or local one).  Look for a &amp;quot;[ui]&amp;quot; section (or add a new one), and configure something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[ui]&lt;br /&gt;
username = David Anderson &amp;lt;dvander@alliedmods.net&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Push and Pull Locations===&lt;br /&gt;
By default, all &amp;quot;pull&amp;quot; operations on a repository occur from the original location you cloned from.  You can change that location by opening up &amp;lt;tt&amp;gt;&amp;amp;lt;repository&amp;amp;gt;\.hg\hgrc&amp;lt;/tt&amp;gt; and looking at the &amp;quot;[paths]&amp;quot; section.  You will see a lines like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[paths]&lt;br /&gt;
default = http://hg.alliedmods.net/sourcemod-central&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are going to be pushing to one main repository fairly often, you may want to set up a default push.  For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[paths]&lt;br /&gt;
default = http://hg.alliedmods.net/sourcemod-central&lt;br /&gt;
default-push = ssh://dvander@hg.alliedmods.net//hg/sourcemod-central&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Note''': Mercurial uses double slashes to specify an absolute file-system path.  If you are using SSH with logical paths, you only need one slash.  For more information about this, visit the Mercurial documentation.  AlliedModders uses absolute paths.&lt;br /&gt;
&lt;br /&gt;
==Changesets==&lt;br /&gt;
Unlike Subversion, Mercurial can't use version numbers to uniquely identify a changeset.  This is because sequential IDs may be duplicated across repositories.  Instead, Mercurial uses 160-bit changeset identifiers.  These are represented in hexadecimal (for example, &amp;lt;tt&amp;gt;fae5f33a1bb3&amp;lt;/tt&amp;gt;).  &lt;br /&gt;
&lt;br /&gt;
Mercurial also uses local revision numbers which are sequential IDs.  These are local to a repository and have no meaning in other repositories.  They are mainly provided for convenience and usability.  A full changeset in a local repository can be represented by &amp;quot;revision:changeset&amp;quot;.  For example, &amp;lt;tt&amp;gt;19108:fae5f33a1bb3&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The latest changeset is called &amp;lt;tt&amp;gt;tip&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
When using commands like &amp;quot;&amp;lt;tt&amp;gt;update&amp;lt;/tt&amp;gt;,&amp;quot; it is useful to refer to changesets.  You can do this in one of a few ways:&lt;br /&gt;
*Using the &amp;lt;tt&amp;gt;tip&amp;lt;/tt&amp;gt; keyword.  This is the latest changeset.&lt;br /&gt;
*Using a revision number.&lt;br /&gt;
*Using any subset of the changeset string that uniquely identifies the changeset.  For example, &amp;lt;tt&amp;gt;fa&amp;lt;/tt&amp;gt; might not be unique and would not work.  But &amp;lt;tt&amp;gt;fa35&amp;lt;/tt&amp;gt; might work for &amp;lt;tt&amp;gt;fae5f33a1bb3&amp;lt;/tt&amp;gt;.  If it doesn't, you can pick a different substring.&lt;br /&gt;
*Using tags.  Mercurial lets you tag a changeset with a unique alias for convenience (&amp;lt;tt&amp;gt;hg tag&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
==Workflow==&lt;br /&gt;
Let's go through a typical session of developing with Mercurial.  If you are working against a project that has a centralized copy, you may want to make sure you're up to date first.  This means '''pulling''' its changes and then '''updating'''.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg pull&lt;br /&gt;
hg update&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will grab the remote changes from the location you first cloned from.  Then it will apply the changes.  You can do this in one go with:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg pull -u&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also pull from a different repository if you want:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg pull -u http://some.other.site/sourcemod-central&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now let's say you make some changes.  You edit file A.cpp and you want to commit your change.  You can do this with:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg commit&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An editor will pop-up asking you to write a message describing your change.  This is required.&lt;br /&gt;
&lt;br /&gt;
Now you edit B.cpp and commit again.  You're done for the day, and you have two changesets sitting in your repository.  You want to push these upstream.  For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg push ssh://dvander@alliedmods.net//hg/sourcemod-central&lt;br /&gt;
searching for changes&lt;br /&gt;
adding changesets&lt;br /&gt;
adding manifests&lt;br /&gt;
adding file changes&lt;br /&gt;
added 2 changesets with 2 changes to 2 files&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or, if you have a &amp;lt;tt&amp;gt;default-push&amp;lt;/tt&amp;gt; configured:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg push&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If there is more than one person sharing and working on the code base, eventually you will need to deal with merges.  This is an extremely powerful (but also deceptively complex) aspect to Mercurial, and it is extremely important to read the next session.&lt;br /&gt;
&lt;br /&gt;
'''Note''': Since only the first line of a commit message is shown by the &amp;lt;tt&amp;gt;hg log&amp;lt;/tt&amp;gt; command by default, it is highly recommended that the first line of your message be able to stand alone.  For example, you might have a short summary of the commit on the first line that says &amp;quot;Added functions for creating dynamic hooks on virtual functions.&amp;quot; Further lines could give more details on the changes involved such as a list of all the functions that were added.&lt;br /&gt;
&lt;br /&gt;
=Merging and You=&lt;br /&gt;
==Introduction==&lt;br /&gt;
Imagine this scenario:&lt;br /&gt;
*Alice and Bob both have a copy of the source code at revision 'A'.&lt;br /&gt;
*Alice commits and pushes a change.  The main repository is now at changeset 'B'.&lt;br /&gt;
*Bob commits a change and is at changeset 'C'.&lt;br /&gt;
&lt;br /&gt;
Now Bob wants to pull.  He runs &amp;lt;tt&amp;gt;hg pull&amp;lt;/tt&amp;gt; and gets:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
searching for changes&lt;br /&gt;
adding changesets&lt;br /&gt;
adding manifests&lt;br /&gt;
adding file changes&lt;br /&gt;
added 1 changesets with 1 changes to 1 files (+1 heads)&lt;br /&gt;
(run 'hg heads' to see heads, 'hg merge' to merge)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What happened here?  Let's visualize it.  When Alice commits, her repository has gone from A to B like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Hg_alice_1.png]]&lt;br /&gt;
&lt;br /&gt;
When Bob commits, his repository goes from A to C like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Hg_bob_1.png]]&lt;br /&gt;
&lt;br /&gt;
After Bob pulls from Alice, his repository has '''multiple heads''' of development.  He's got two forks of the same codebase in his repository.  You can visualize it like this.  The blue arrow is Bob's changes, and the red arrow is Alice's changes.  They diverge from A.&lt;br /&gt;
&lt;br /&gt;
[[Image:Hg_bob_2.png]]&lt;br /&gt;
&lt;br /&gt;
Bob doesn't want to be in this state, so he '''merges'''.  Merging joins multiple heads back together.  Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg merge&lt;br /&gt;
1 files updated, 1 files merged, 0 files removed, 0 files unresolved&lt;br /&gt;
(branch merge, don't forget to commit)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Merges are changesets, and they must be committed.  Bob commits the merge, and now his repository looks like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:Hg_bob_3.png]]&lt;br /&gt;
&lt;br /&gt;
'D' is the changeset that joins the two heads back together.  Now Bob can safely push his changes back, and Alice can pull from Bob.&lt;br /&gt;
&lt;br /&gt;
The above example happened from Bob trying to pull.  But if Bob had tried to push, he would have gotten a nasty error message:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg push&lt;br /&gt;
searching for changes&lt;br /&gt;
abort: push creates new remote heads!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This means Bob's push would have introduced multiple heads on the target repository, rather than his own.  This is generally a bad idea and as a policy projects often don't allow it at all.  Bob has to pull, update, and resolve the merge.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' For most merges, it is a good policy to write simple commit messages.  For example, &amp;quot;Merge.&amp;quot; would suffice.&lt;br /&gt;
&lt;br /&gt;
==Conflicts==&lt;br /&gt;
Merges which don't require any work on your part (other than running &amp;lt;tt&amp;gt;merge&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;commit&amp;lt;/tt&amp;gt;) are called '''trivial merges'''.  &lt;br /&gt;
&lt;br /&gt;
It is possible that Alice and Bob edited the same file however.  In many cases, Mercurial will be smart enough to handle this.  If Mercurial can't figure it out though -- you have to do manually merge the difference between the two files.  This is best done with a three-way merge program.&lt;br /&gt;
&lt;br /&gt;
An example of a merge conflict:&lt;br /&gt;
&amp;lt;pre&amp;gt;hg merge&lt;br /&gt;
merging crab.cpp&lt;br /&gt;
merge: warning: conflicts during merge&lt;br /&gt;
merging crab.cpp failed!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Conflicts must be resolved immediately.  You should never leave your source code in a conflicted state.  If you don't have a merge program installed, the conflicted file(s) will be marked up.  For example, &amp;lt;tt&amp;gt;crab.cpp&amp;lt;/tt&amp;gt; might contain lines like these for each conflict:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; /tmp/conflict/crab.cpp&lt;br /&gt;
void function() {&lt;br /&gt;
=======&lt;br /&gt;
int function() {&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; /tmp/crab.cpp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The two &amp;quot;sides&amp;quot; of the &amp;lt;tt&amp;gt;=======&amp;lt;/tt&amp;gt; bar represent the local and incoming changes.  You should delete the markup and decide how to resolve the two sides.&lt;br /&gt;
&lt;br /&gt;
If you want to use and configure a merge program, see [http://www.selenic.com/mercurial/wiki/index.cgi/MergeProgram MergeProgram] at the Mercurial docs.  Though it's not listed, you can also use [http://www.scootersoftware.com/ Beyond Compare] (the author's personal choice).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Other Commands=&lt;br /&gt;
&amp;lt;tt&amp;gt;hg diff&amp;lt;/tt&amp;gt; is very useful for reviewing changes before you commit them.  You can also use it for generating patches.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;hg log&amp;lt;/tt&amp;gt; lets you view the changeset history.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;hg glog&amp;lt;/tt&amp;gt; lets you view an ASCII graph of the changeset history.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;hg identity&amp;lt;/tt&amp;gt; tells you the state of your repository.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;hg status&amp;lt;/tt&amp;gt; shows you any changed or unknown files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;hg status -m&amp;lt;/tt&amp;gt; shows you any changed files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;hg revert&amp;lt;/tt&amp;gt; will remove any changes you've made to one or more files.  It will save the originals as the same file name with &amp;lt;tt&amp;gt;.orig&amp;lt;/tt&amp;gt; at the end.&lt;br /&gt;
&lt;br /&gt;
For many commands you can specify a folder within the repository to only affect that folder and its children.  This can speed up slow operations.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=AlliedModders=&lt;br /&gt;
AlliedModders has a public Mercurial listing at [http://hg.alliedmods.net/ http://hg.alliedmods.net/].&lt;br /&gt;
&lt;br /&gt;
Anyone can clone or pull from these.  Only developers with SSH access can push.  Developers should use the following URL formula for pushing: &amp;lt;pre&amp;gt;ssh://USERNAME@hg.alliedmods.net//hg/PROJECT&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should use SSH keys for security.  You should also use the &amp;quot;Firstname Lastname &amp;amp;lt;email&amp;amp;gt;&amp;quot; authorship style.  It is a good idea to configure this ahead of time (read the configuration section above).&lt;br /&gt;
&lt;br /&gt;
It is highly recommended that long commit messages be split with a short summary on the first line and details on further lines. (See the note at the bottom of the Workflow section above.)&lt;br /&gt;
&lt;br /&gt;
Note that unlike Subversion, you cannot checkout a folder within a repository.  This is by design.&lt;br /&gt;
&lt;br /&gt;
=AlliedModders=&lt;br /&gt;
AlliedModders has a public Mercurial listing at [http://hg.alliedmods.net/ http://hg.alliedmods.net/].&lt;br /&gt;
&lt;br /&gt;
Anyone can clone or pull from these.  Only developers with SSH access can push.  Developers should use the following URL formula for pushing: &amp;lt;pre&amp;gt;ssh://USERNAME@hg.alliedmods.net//hg/PROJECT&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should use SSH keys for security.  You should also use the &amp;quot;Firstname Lastname &amp;amp;lt;email&amp;amp;gt;&amp;quot; authorship style.  It is a good idea to configure this ahead of time (read the configuration section above).&lt;br /&gt;
&lt;br /&gt;
Note that unlike Subversion, you cannot checkout a folder within a repository.  This is by design.&lt;br /&gt;
&lt;br /&gt;
=External Links=&lt;br /&gt;
*[http://www.selenic.com/mercurial/wiki/ Mercurial Home Page]&lt;br /&gt;
*[http://www.selenic.com/mercurial/wiki/index.cgi/UnderstandingMercurial Understanding Mercurial]&lt;br /&gt;
*[http://hgbook.red-bean.com/ Hg Book, free online book about Mercurial]&lt;br /&gt;
*[http://www.selenic.com/mercurial/wiki/index.cgi/Tutorial Mercurial Tutorials]&lt;br /&gt;
&lt;br /&gt;
[[Category:Version Control Systems]]&lt;/div&gt;</summary>
		<author><name>DS</name></author>
		
	</entry>
</feed>