<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.thedarkmod.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Stgatilov</id>
	<title>The DarkMod Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.thedarkmod.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Stgatilov"/>
	<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=Special:Contributions/Stgatilov"/>
	<updated>2026-04-30T20:13:42Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=VMWare:_Virtual_machine_with_Linux&amp;diff=34461</id>
		<title>VMWare: Virtual machine with Linux</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=VMWare:_Virtual_machine_with_Linux&amp;diff=34461"/>
		<updated>2026-03-24T12:04:23Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: Update about shared directories&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This guide is originally written for TDM 2.07.&lt;br /&gt;
&lt;br /&gt;
== Intro ==&lt;br /&gt;
&lt;br /&gt;
It is very convenient for a Windows-centric developer to have a Linux virtual machine in his arcenal.&lt;br /&gt;
&lt;br /&gt;
You can read how to set up VirtualBox VM in the article [[VirtualBox: Virtual machine with Linux for TDM]].&lt;br /&gt;
This article is about setting up a VMware VM, which has some benefits over VirtualBox: better performance and OpenGL support.&lt;br /&gt;
&lt;br /&gt;
== Install VMware ==&lt;br /&gt;
&lt;br /&gt;
While Oracle&#039;s VirtualBox is open-source, the VMware product is proprietary in its full sense. As of year 2019, there is [https://www.vmware.com/products/workstation-player.html VMware Workstation Player], which is &#039;&#039;&#039;free for non-commercial use&#039;&#039;&#039;. You can download it on [https://my.vmware.com/en/web/vmware/free#desktop_end_user_computing/vmware_workstation_player this page] (choose Windows version).&lt;br /&gt;
&lt;br /&gt;
Installation is trivial. Most likely, you do &#039;&#039;&#039;not&#039;&#039;&#039; need the &amp;quot;Enhanced Keyboard Driver&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Create VM ==&lt;br /&gt;
&lt;br /&gt;
Start VMware Workstation, click on &amp;quot;Create a New Virtual Machine&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Point &amp;quot;Installer disc image file&amp;quot; to the ISO image of the Linux distro which you want to install (by default it would be [https://www.ubuntu.com/download/desktop Ubuntu LTS]). Click Next.&lt;br /&gt;
&lt;br /&gt;
Choose a name like &amp;quot;Ubuntu XX.YY x64&amp;quot;, set user and password, click Next. Don&#039;t forget to set Location: a typical VM takes 5-10 GB. Leave Disk Capacity settings in defaults: do &#039;&#039;&#039;not&#039;&#039;&#039; use monolithic disk, because it would make some configuring much harder!&lt;br /&gt;
&lt;br /&gt;
As long as you choose reasonable settings and ISO, you should be eligible for &amp;quot;Easy Install&amp;quot;, which means that you&#039;ll get Ubuntu installed for you automatically, along with open-vm-tools. Make sure you have &#039;&#039;&#039;internet access&#039;&#039;&#039; through the whole process, otherwise your installation will be incomplete.&lt;br /&gt;
&lt;br /&gt;
== Client Tools ==&lt;br /&gt;
&lt;br /&gt;
In order to use shared directories and shared clipboard, you need to install some sort of client tools. Unfortunately, this topic is quite messy in VMware world. First of all, there are two such tools available: &#039;&#039;VMware Tools&#039;&#039; is distributed with VMware Player, and &#039;&#039;open-vm-tools&#039;&#039; is intended to be distributed by Linux package manager. Second, default installations of the tools are often buggy and don&#039;t work.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;s&amp;gt;In my case, open-vm-tools 2:10.2.0-3~ubuntu0.16.04.1 was installed automatically by VMware Player 15.0.2 during Easy Install procedure and it did not work well. It mounted the shared folder properly when I added it, but after a full reboot the shared folder was absent. Installing the patches from [https://askubuntu.com/a/726906/918615 this answer] helped. Of course, you need to do &amp;quot;&amp;lt;tt&amp;gt;sudo apt-get install git&amp;lt;/tt&amp;gt;&amp;quot; first.&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UPDATE:&#039;&#039;&#039; Still have the same issue with shared directories on Ubuntu 20.04, but the patches installer referenced above does not work anymore. It seems that the only real problem is that shared directories are not added to auto-mount settings of the guest OS. [https://superuser.com/a/1762262/734756 This answer] worked perfectly for me (i.e. adding vmhgfs-fuse to /etc/fstab).&lt;br /&gt;
&lt;br /&gt;
In order to create shared folder, open &amp;quot;Virtual Machine Settings&amp;quot; (in &amp;quot;Player&amp;quot; -&amp;gt; &amp;quot;Manage&amp;quot;).&lt;br /&gt;
Go to &amp;quot;Options&amp;quot; -&amp;gt; &amp;quot;Shared Folders&amp;quot;, and set it to &amp;quot;Always enabled&amp;quot;. Now &amp;quot;Add&amp;quot; your TDM root directory to make it accessible from within VM. Check that it is available at &amp;lt;tt&amp;gt;/mnt/hgfs/[name_of_share]&amp;lt;/tt&amp;gt;. If it is not there, then I wish you good luck!&lt;br /&gt;
&lt;br /&gt;
== Configure VM ==&lt;br /&gt;
&lt;br /&gt;
When your VM is &#039;&#039;&#039;not&#039;&#039;&#039; running, right-click on VM and go to &amp;quot;Settings&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Choose &amp;quot;Memory&amp;quot;, and increase the amount of Memory available to 4096 MB.&lt;br /&gt;
&lt;br /&gt;
Choose &amp;quot;Processors&amp;quot;, and increase &amp;quot;Number of processor cores&amp;quot; to make TDM build faster. I advise setting it to the number of physical cores you have (6 for me).&lt;br /&gt;
&lt;br /&gt;
Choose &amp;quot;Display&amp;quot;, increase &amp;quot;Graphics memory&amp;quot; to 2 GB.&lt;br /&gt;
&lt;br /&gt;
Click OK to apply changes.&lt;br /&gt;
&lt;br /&gt;
== Clean backup ==&lt;br /&gt;
&lt;br /&gt;
I prefer having the clean VM backed up so that I could restart with a fresh and configured VM at any moment. VMware Player does not support cloning and snapshots, but you can find the directory with your VM data and simply copy the whole directory.&lt;br /&gt;
&lt;br /&gt;
== Build and run TDM ==&lt;br /&gt;
&lt;br /&gt;
Open terminal, change dir to the root source code directory in the shared folder, e.g.:&lt;br /&gt;
&lt;br /&gt;
 cd /mnt/hgfs/thedarkmod/darkmod_src&lt;br /&gt;
&lt;br /&gt;
From here you can build TDM in the usual way, as described in the [[The Dark Mod - Compilation Guide#Linux]]. Of course, you have to install some packages before first build.&lt;br /&gt;
&lt;br /&gt;
In order to run TDM, go to assets root directory, e.g.:&lt;br /&gt;
&lt;br /&gt;
 cd /mnt/hgfs/thedarkmod/darkmod&lt;br /&gt;
&lt;br /&gt;
Run TDM from there:&lt;br /&gt;
 &lt;br /&gt;
 ./thedarkmod.x64&lt;br /&gt;
&lt;br /&gt;
For TDM 2.07, you also have to do &amp;quot;&amp;lt;tt&amp;gt;sudo apt-get install libopenal1&amp;lt;/tt&amp;gt;&amp;quot; beforehand.&lt;br /&gt;
&lt;br /&gt;
Currently VMware seems to support OpenGL 3.0 in general and OpenGL 3.3 Core profile only.&lt;br /&gt;
&lt;br /&gt;
== Mouse look ==&lt;br /&gt;
&lt;br /&gt;
VMware breaks mouse cursor warping in the same way as VirtualBox does. Warping is critical for mouse-look in FPS games, including TDM. Without it, you won&#039;t be able even to navigate through menus.&lt;br /&gt;
&lt;br /&gt;
There are two ways to fix it in case of VMware Player:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VMware-side solution&#039;&#039;&#039;. Make sure the VM is shutdown, open the &amp;lt;tt&amp;gt;.vmx&amp;lt;/tt&amp;gt;-file of your VM and add the following magic lines to it:&lt;br /&gt;
&lt;br /&gt;
 usb.generic.allowHID = &amp;quot;TRUE&amp;quot;&lt;br /&gt;
 mouse.vusb.useBasicMouse = &amp;quot;FALSE&amp;quot;&lt;br /&gt;
 mouse.vusb.enable = &amp;quot;TRUE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Strangely, this is already enough to fix the problem. If your mouse is crazy in TDM, press Ctrl+Alt and click back to VM, and mouse look should return to normal.&lt;br /&gt;
&lt;br /&gt;
Also with these lines, you can passthrough your mouse and keyboard exclusively to VM. In order to do that, click &amp;quot;Player&amp;quot; -&amp;gt; &amp;quot;Removable Devices&amp;quot;, find your mouse/keyboard there and click &amp;quot;Connect&amp;quot;. Make sure that you have spare USB mouse or keyboard connected to computer so that at least some control is left on the host side.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TDM-side hack&#039;&#039;&#039;. Open game console and set &amp;quot;&amp;lt;tt&amp;gt;in_nowarp 1&amp;lt;/tt&amp;gt;&amp;quot; there. &lt;br /&gt;
After that you have a limited mouse-look. You cannot really play with it, but it is enough for clicking through menu and a bit of in-game testing. Use &amp;quot;turn left/right&amp;quot; keys as additional workaround.&lt;br /&gt;
&lt;br /&gt;
== The game runs very slow ==&lt;br /&gt;
&lt;br /&gt;
I have to set cvar &amp;quot;&amp;lt;tt&amp;gt;r_gpuBufferNonpersistentUpdateMode 1&amp;lt;/tt&amp;gt;&amp;quot; locally to get normal performance (supposedly since TDM 2.09).&lt;br /&gt;
With default value of this cvar, TDM rendering is very slow inside VM for some reason.&lt;br /&gt;
Note that this cvar is internal and does not affect normal installations that much.&lt;br /&gt;
&lt;br /&gt;
[[Category: Coding]]&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=What%27s_new_in_TDM_2.14&amp;diff=34459</id>
		<title>What&#039;s new in TDM 2.14</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=What%27s_new_in_TDM_2.14&amp;diff=34459"/>
		<updated>2026-03-21T11:51:26Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: Removed one more line about ACES tonemapping.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- keywords whats new --&amp;gt;&lt;br /&gt;
{{released|2.14|2026-03-20}}&lt;br /&gt;
See the  [https://bugs.thedarkmod.com/changelog_page.php?version_id=113 changelog] on our bugtracker.&lt;br /&gt;
Source Revision 11208&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;font size=&amp;quot;5&amp;quot;&amp;gt;The Dark Mod 2.14 Stability Release&amp;lt;/font&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;3&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
A major focus for The Dark Mod 2.14 development cycle was fixing lingering issues seen with some of the larger 2.13 changes and complete work started in 2.13.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;The new AI visibility feature in 2.13 was found to have a few issues with performance and object awareness that were not seen in 2.13 beta testing&lt;br /&gt;
&amp;lt;br&amp;gt;so many players reverted settings to the 2.12 mode. Now the feature is working better than ever with improved performance!&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;A few longstanding major bugs were finally solved! &lt;br /&gt;
* Frequent saving on large missions no longer results in AI getting stuck in walls or obstructions.&lt;br /&gt;
* The entity &amp;quot;suicide&amp;quot; script meant to cleanup unused objects has been fixed or removed from AI and Weapon animation cycles where it was causing random crashes.&lt;br /&gt;
* Item Inventory icons no longer randomly show as stacked on top of each other in the HUD&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Tone-mapping is now only applied to the 3D engine so the menus remain legible regardless of what extremity the user configures in the game. &lt;br /&gt;
&amp;lt;br&amp;gt;( We had this fix in 2.08 but it was reverted due to other bugs \ issues that it caused. Welcome back! )&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Non-Elite AI can be knocked out after a flashbomb blinds them!&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;The LOD menu has been given a new FULL option which disables all distance optimizations including ones not controlled by the LOD system.&lt;br /&gt;
&amp;lt;br&amp;gt;This is a pretty punishing setting on some missions but is offered for players who want a no compromises visual option if they have the hardware.&lt;br /&gt;
&amp;lt;br&amp;gt;It also serves as a debug option for visual anomalies are not LOD related and it fixes the brief portalsky bug when exiting underwater while swimming &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Guard animations have been improved to better handle transition states. Also a new &amp;quot;Old Man&amp;quot; AI has been added!&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Menu GUI&#039;s can now render a snapshot of the last in-game 3D screen. This is used to great effect in the new mission &amp;quot;Displacement&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;More Dhewm3 code has been ported into TDM and the Dhewm3 project maintainer has been actively involved in TDM development. &lt;br /&gt;
&amp;lt;br&amp;gt;Of note (other than some code stability changes), MD3 and MD5 animations fixes and improvements have been incorporated.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Projected Decals are now light interactive! Footprints, blood splats, projectile holes, all can have normalmaps and lighting interactions!&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;You can now enable SSAO in subviews such as mirrors / camera views so they will look more accurate. ( r_ssao_insubview )&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&#039;&#039;&#039;OPTIMIZATIONS&#039;&#039;&#039;&lt;br /&gt;
* Further optimization to the parallel model rendering code have been introduced. Now the operations broken into chunks and load-balanced better. More demanding missions like &amp;quot;Scroll of Remembrance&amp;quot; should run better for most players now.&lt;br /&gt;
* Mirror and Remote Render surfaces can now have lower resolution rendering ( this optimization was broken some time after 2.05 )&lt;br /&gt;
* Portal distance closure now follows the LOD menu distance settings&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;See our [https://forums.thedarkmod.com/index.php?/topic/23106-214-feature-discussion-threads/ Feature Discuss Threads] for more details about substantial changes.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;br&amp;gt;&amp;lt;br&amp;gt; &amp;lt;font size=&amp;quot;4&amp;quot;&amp;gt;&#039;&#039;&#039;Important CVARS&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font size=&amp;quot;4&amp;quot;&amp;gt;PLAYER&amp;lt;/font&amp;gt; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
r_ssao_insubview ( can enable ambient occlusion in subviews (mirrors, remotes, etc.) )&lt;br /&gt;
&lt;br /&gt;
tdm_frob_item_selects_item ( allows to not select an item immediately after player picks it up. )&lt;br /&gt;
&lt;br /&gt;
r_decalInteractive ( whether projected decals are lit with light interactions. Set to 0 to disable all interactions with lights for decals, to restore behavior of 2.13.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font size=&amp;quot;4&amp;quot;&amp;gt;TROUBLESHOOTING&amp;lt;/font&amp;gt; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MAJOR&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
g_lightQuotientAlgo ( which light estimate system is used by AI. It has been changed from &amp;quot;1&amp;quot; (hybrid) to &amp;quot;2&amp;quot; (only use the new system). If you suspect you have some problems with light evaluation by AI, can try to set it back to 1 or 0.)&lt;br /&gt;
&lt;br /&gt;
r_decalInteractive ( whether projected decals are lit with light interactions. Set to 0 to disable all interactions with lights for decals, to restore behavior of 2.13. )&lt;br /&gt;
&lt;br /&gt;
g_newSmokeParticles ( whether use the new system for emitting smoke particles. Set to 0 to switch the old smoke emitting code.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MINOR&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
r_useParallelAddModels ( controls internal parallelization in renderer frontend, also known as &amp;quot;Frontend Acceleration&amp;quot; in the main menu. If you want to disable the new dynamic scheduling, then you can change it from &amp;quot;2&amp;quot; to &amp;quot;1&amp;quot;. A related cvar for tweaking is r_parallelAddModelsChunk. )&lt;br /&gt;
&lt;br /&gt;
r_copyRenderUseScissor, r_remoteLimitResolutionByScreenSize ( control new subview optimizations. )&lt;br /&gt;
&lt;br /&gt;
r_useCachedDecalModels ( control optimization in interactible decals implementation. )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Graphics&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
* Tone-mapping is no longer applied to menu GUIs.&lt;br /&gt;
* New FULL LOD mode, with all distance based optimizations disabled&lt;br /&gt;
* Mirrors and Remote Renders can be rendered with lower resolution for performance&lt;br /&gt;
* Projected Decals are light interactive now &lt;br /&gt;
* Func Portals now respect LOD distance settings&lt;br /&gt;
* SSAO can be applied to subviews&lt;br /&gt;
* Fixed Linux crash when material with custom GLSL shader is loaded during gameplay&lt;br /&gt;
* Fixed shadow culling bug with volumetric lights&lt;br /&gt;
* Fixed shadow maps bug when light only lights noselfshadow and translucent surfaces.&lt;br /&gt;
* Fixed overbright surfaces in fog in some module models&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;AI&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
* AI ( non-elite ) can be knocked out after a flashbomb&lt;br /&gt;
* AI no longer get stuck in map geometry due to frequent saving&lt;br /&gt;
* AI should now notice absence and blood markers again&lt;br /&gt;
* Fixed backface shadows for parallel lights in AI light estimate system&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Mapping&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
* Now the engine defines macros TDM_VERSION/TDM_REVISION/TDM_VERSION_FULL in game scripts and GUI scripts. This adds more flexibility in making a mission compatible with several versions of the game despite occasional breaking changes&lt;br /&gt;
* The smoke particle generation system was reimplemented, fixing several discrepancies with particle generation for particle models and particle deform. In particular, it is now possible to use proper cycling, although this needs use_cycles spawnarg&lt;br /&gt;
* Dmap should no longer leave some files from the previous compilation, which used to cause confusion previously&lt;br /&gt;
* Removed collision from func_cameraTarget&lt;br /&gt;
* Increased radius of AAS visualization tool.&lt;br /&gt;
* Added editor description for efx_preset spawnarg.&lt;br /&gt;
* Now it is possible to use larger mesh models... at least static ones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Coding&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
* ParallelAddModels now has a chunking feature and load balances work better&lt;br /&gt;
* MD3 and MD5 Animation fixes and improvements ( MD5 skin scale effect, MD3 Shadows ) from the Dhewm3 project&lt;br /&gt;
* Crash fixes and code hardening ported from Dhewm3&lt;br /&gt;
* Fixed major issues in using OBJ meshes from Blender.&lt;br /&gt;
* Fixed promoting mission override into user value for some cvars&lt;br /&gt;
* Cvars from mission.cfg converted into mission overrides, even outside gameplay&lt;br /&gt;
* Fixed crash from having many localization packs&lt;br /&gt;
* Fixed too many decals spawned by brittle fracture sometimes&lt;br /&gt;
* Fixed saving/loading the special liquid model.&lt;br /&gt;
* Added sys.unsetcvar script event&lt;br /&gt;
* Some stim/response timer now uses game time instead of CPU clocks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Assets&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
See:&lt;br /&gt;
&lt;br /&gt;
https://forums.thedarkmod.com/index.php?/topic/23080-214-new-and-updated-assets/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;GUIs&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
* The last game frame can now be used in menu guis&lt;br /&gt;
* Inventory icons no longer encounter random stacking visuals in the HUD&lt;br /&gt;
* Tone-mapping no longer affects menus&lt;br /&gt;
* Various campaign fixes: GUI of wrong mission being shown, next mission not starting if some menu screens were disabled, shortsword name in tdm_campaign.def&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Sound&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
* Fixed dynamically started looping sounds with leadin, including main menu ones&lt;br /&gt;
* OpenAL build recipe adjusted for CMake 4&lt;br /&gt;
* Proper sounds will be played on certain frames where idle animations replacement were used.&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Translation&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
* Font improvements for Cyrillic and Romanian character support&lt;br /&gt;
* Font visuals and formatting been improved&lt;br /&gt;
&lt;br /&gt;
{{whatsnew|sort=214}}&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=What%27s_new_in_TDM_2.14&amp;diff=34458</id>
		<title>What&#039;s new in TDM 2.14</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=What%27s_new_in_TDM_2.14&amp;diff=34458"/>
		<updated>2026-03-21T11:50:27Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: Removed the line about ACES tonemapping&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- keywords whats new --&amp;gt;&lt;br /&gt;
{{released|2.14|2026-03-20}}&lt;br /&gt;
See the  [https://bugs.thedarkmod.com/changelog_page.php?version_id=113 changelog] on our bugtracker.&lt;br /&gt;
Source Revision 11208&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;font size=&amp;quot;5&amp;quot;&amp;gt;The Dark Mod 2.14 Stability Release&amp;lt;/font&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;3&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
A major focus for The Dark Mod 2.14 development cycle was fixing lingering issues seen with some of the larger 2.13 changes and complete work started in 2.13.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;The new AI visibility feature in 2.13 was found to have a few issues with performance and object awareness that were not seen in 2.13 beta testing&lt;br /&gt;
&amp;lt;br&amp;gt;so many players reverted settings to the 2.12 mode. Now the feature is working better than ever with improved performance!&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;A few longstanding major bugs were finally solved! &lt;br /&gt;
* Frequent saving on large missions no longer results in AI getting stuck in walls or obstructions.&lt;br /&gt;
* The entity &amp;quot;suicide&amp;quot; script meant to cleanup unused objects has been fixed or removed from AI and Weapon animation cycles where it was causing random crashes.&lt;br /&gt;
* Item Inventory icons no longer randomly show as stacked on top of each other in the HUD&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Tone-mapping is now only applied to the 3D engine so the menus remain legible regardless of what extremity the user configures in the game. &lt;br /&gt;
&amp;lt;br&amp;gt;( We had this fix in 2.08 but it was reverted due to other bugs \ issues that it caused. Welcome back! )&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Non-Elite AI can be knocked out after a flashbomb blinds them!&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;The LOD menu has been given a new FULL option which disables all distance optimizations including ones not controlled by the LOD system.&lt;br /&gt;
&amp;lt;br&amp;gt;This is a pretty punishing setting on some missions but is offered for players who want a no compromises visual option if they have the hardware.&lt;br /&gt;
&amp;lt;br&amp;gt;It also serves as a debug option for visual anomalies are not LOD related and it fixes the brief portalsky bug when exiting underwater while swimming &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Guard animations have been improved to better handle transition states. Also a new &amp;quot;Old Man&amp;quot; AI has been added!&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Menu GUI&#039;s can now render a snapshot of the last in-game 3D screen. This is used to great effect in the new mission &amp;quot;Displacement&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;More Dhewm3 code has been ported into TDM and the Dhewm3 project maintainer has been actively involved in TDM development. &lt;br /&gt;
&amp;lt;br&amp;gt;Of note (other than some code stability changes), MD3 and MD5 animations fixes and improvements have been incorporated.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Projected Decals are now light interactive! Footprints, blood splats, projectile holes, all can have normalmaps and lighting interactions!&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;You can now enable SSAO in subviews such as mirrors / camera views so they will look more accurate. ( r_ssao_insubview )&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&#039;&#039;&#039;OPTIMIZATIONS&#039;&#039;&#039;&lt;br /&gt;
* Further optimization to the parallel model rendering code have been introduced. Now the operations broken into chunks and load-balanced better. More demanding missions like &amp;quot;Scroll of Remembrance&amp;quot; should run better for most players now.&lt;br /&gt;
* Mirror and Remote Render surfaces can now have lower resolution rendering ( this optimization was broken some time after 2.05 )&lt;br /&gt;
* Portal distance closure now follows the LOD menu distance settings&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;See our [https://forums.thedarkmod.com/index.php?/topic/23106-214-feature-discussion-threads/ Feature Discuss Threads] for more details about substantial changes.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;br&amp;gt;&amp;lt;br&amp;gt; &amp;lt;font size=&amp;quot;4&amp;quot;&amp;gt;&#039;&#039;&#039;Important CVARS&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font size=&amp;quot;4&amp;quot;&amp;gt;PLAYER&amp;lt;/font&amp;gt; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
r_ssao_insubview ( can enable ambient occlusion in subviews (mirrors, remotes, etc.) )&lt;br /&gt;
&lt;br /&gt;
tdm_frob_item_selects_item ( allows to not select an item immediately after player picks it up. )&lt;br /&gt;
&lt;br /&gt;
r_decalInteractive ( whether projected decals are lit with light interactions. Set to 0 to disable all interactions with lights for decals, to restore behavior of 2.13.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font size=&amp;quot;4&amp;quot;&amp;gt;TROUBLESHOOTING&amp;lt;/font&amp;gt; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MAJOR&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
g_lightQuotientAlgo ( which light estimate system is used by AI. It has been changed from &amp;quot;1&amp;quot; (hybrid) to &amp;quot;2&amp;quot; (only use the new system). If you suspect you have some problems with light evaluation by AI, can try to set it back to 1 or 0.)&lt;br /&gt;
&lt;br /&gt;
r_decalInteractive ( whether projected decals are lit with light interactions. Set to 0 to disable all interactions with lights for decals, to restore behavior of 2.13. )&lt;br /&gt;
&lt;br /&gt;
g_newSmokeParticles ( whether use the new system for emitting smoke particles. Set to 0 to switch the old smoke emitting code.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MINOR&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
r_useParallelAddModels ( controls internal parallelization in renderer frontend, also known as &amp;quot;Frontend Acceleration&amp;quot; in the main menu. If you want to disable the new dynamic scheduling, then you can change it from &amp;quot;2&amp;quot; to &amp;quot;1&amp;quot;. A related cvar for tweaking is r_parallelAddModelsChunk. )&lt;br /&gt;
&lt;br /&gt;
r_copyRenderUseScissor, r_remoteLimitResolutionByScreenSize ( control new subview optimizations. )&lt;br /&gt;
&lt;br /&gt;
r_useCachedDecalModels ( control optimization in interactible decals implementation. )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Graphics&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
* New ACES Style Tone-Mapping with less blowout. Tone-mapping is no longer applied to menu GUIs.&lt;br /&gt;
* New FULL LOD mode, with all distance based optimizations disabled&lt;br /&gt;
* Mirrors and Remote Renders can be rendered with lower resolution for performance&lt;br /&gt;
* Projected Decals are light interactive now &lt;br /&gt;
* Func Portals now respect LOD distance settings&lt;br /&gt;
* SSAO can be applied to subviews&lt;br /&gt;
* Fixed Linux crash when material with custom GLSL shader is loaded during gameplay&lt;br /&gt;
* Fixed shadow culling bug with volumetric lights&lt;br /&gt;
* Fixed shadow maps bug when light only lights noselfshadow and translucent surfaces.&lt;br /&gt;
* Fixed overbright surfaces in fog in some module models&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;AI&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
* AI ( non-elite ) can be knocked out after a flashbomb&lt;br /&gt;
* AI no longer get stuck in map geometry due to frequent saving&lt;br /&gt;
* AI should now notice absence and blood markers again&lt;br /&gt;
* Fixed backface shadows for parallel lights in AI light estimate system&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Mapping&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
* Now the engine defines macros TDM_VERSION/TDM_REVISION/TDM_VERSION_FULL in game scripts and GUI scripts. This adds more flexibility in making a mission compatible with several versions of the game despite occasional breaking changes&lt;br /&gt;
* The smoke particle generation system was reimplemented, fixing several discrepancies with particle generation for particle models and particle deform. In particular, it is now possible to use proper cycling, although this needs use_cycles spawnarg&lt;br /&gt;
* Dmap should no longer leave some files from the previous compilation, which used to cause confusion previously&lt;br /&gt;
* Removed collision from func_cameraTarget&lt;br /&gt;
* Increased radius of AAS visualization tool.&lt;br /&gt;
* Added editor description for efx_preset spawnarg.&lt;br /&gt;
* Now it is possible to use larger mesh models... at least static ones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Coding&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
* ParallelAddModels now has a chunking feature and load balances work better&lt;br /&gt;
* MD3 and MD5 Animation fixes and improvements ( MD5 skin scale effect, MD3 Shadows ) from the Dhewm3 project&lt;br /&gt;
* Crash fixes and code hardening ported from Dhewm3&lt;br /&gt;
* Fixed major issues in using OBJ meshes from Blender.&lt;br /&gt;
* Fixed promoting mission override into user value for some cvars&lt;br /&gt;
* Cvars from mission.cfg converted into mission overrides, even outside gameplay&lt;br /&gt;
* Fixed crash from having many localization packs&lt;br /&gt;
* Fixed too many decals spawned by brittle fracture sometimes&lt;br /&gt;
* Fixed saving/loading the special liquid model.&lt;br /&gt;
* Added sys.unsetcvar script event&lt;br /&gt;
* Some stim/response timer now uses game time instead of CPU clocks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Assets&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
See:&lt;br /&gt;
&lt;br /&gt;
https://forums.thedarkmod.com/index.php?/topic/23080-214-new-and-updated-assets/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;GUIs&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
* The last game frame can now be used in menu guis&lt;br /&gt;
* Inventory icons no longer encounter random stacking visuals in the HUD&lt;br /&gt;
* Tone-mapping no longer affects menus&lt;br /&gt;
* Various campaign fixes: GUI of wrong mission being shown, next mission not starting if some menu screens were disabled, shortsword name in tdm_campaign.def&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Sound&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
* Fixed dynamically started looping sounds with leadin, including main menu ones&lt;br /&gt;
* OpenAL build recipe adjusted for CMake 4&lt;br /&gt;
* Proper sounds will be played on certain frames where idle animations replacement were used.&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Translation&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
* Font improvements for Cyrillic and Romanian character support&lt;br /&gt;
* Font visuals and formatting been improved&lt;br /&gt;
&lt;br /&gt;
{{whatsnew|sort=214}}&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=TDM_Script_Reference&amp;diff=34365</id>
		<title>TDM Script Reference</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=TDM_Script_Reference&amp;diff=34365"/>
		<updated>2026-01-14T19:25:42Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: Regenerated script reference for 2.14.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page has been generated automatically by the tdm_gen_script_event_doc console command.&lt;br /&gt;
&lt;br /&gt;
Generated by The Dark Mod 2.14, code revision 11087, last update: 2026-01-14 19:24&lt;br /&gt;
&lt;br /&gt;
{{tdm-scripting-reference-intro}}&lt;br /&gt;
&amp;lt;div class=&amp;quot;toclimit-4&amp;quot;&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
= TDM Script Event Reference =&lt;br /&gt;
&lt;br /&gt;
== All Events ==&lt;br /&gt;
=== Alphabetic List ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;accelSound&#039;&#039;&#039;(string sound); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the sound to be played when the mover accelerates.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;accelTime&#039;&#039;&#039;(float time); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the acceleration time. Set this acceleration time before initiating a new move.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;accelTo&#039;&#039;&#039;(float speed, float time); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates an acceleration to the given speed over the given time in seconds.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;acos&#039;&#039;&#039;(float cosine); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the angle in degrees with the given cosine.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CTarget_AddObjectives&#039;&#039;, &#039;&#039;CTarget_CallScriptFunction&#039;&#039;, &#039;&#039;CTarget_ChangeEntityRelation&#039;&#039;, &#039;&#039;CTarget_ChangeLockState&#039;&#039;, &#039;&#039;CTarget_ChangeTarget&#039;&#039;, &#039;&#039;CTarget_InterMissionTrigger&#039;&#039;, &#039;&#039;CTarget_ItemRemove&#039;&#039;, &#039;&#039;CTarget_SetEntityRelation&#039;&#039;, &#039;&#039;CTarget_SetFrobable&#039;&#039;, &#039;&#039;CTarget_SetObjectiveComponentState&#039;&#039;, &#039;&#039;CTarget_SetObjectiveState&#039;&#039;, &#039;&#039;CTarget_SetObjectiveVisibility&#039;&#039;, &#039;&#039;CTarget_SetRelations&#039;&#039;, &#039;&#039;CTarget_SetTeam&#039;&#039;, &#039;&#039;CTarget_StartConversation&#039;&#039;, &#039;&#039;idAFEntity_Generic&#039;&#039;, &#039;&#039;idAFEntity_WithAttachedHead&#039;&#039;, &#039;&#039;idAI&#039;&#039;, &#039;&#039;idActivator&#039;&#039;, &#039;&#039;idAnimated&#039;&#039;, &#039;&#039;idBeam&#039;&#039;, &#039;&#039;idBrittleFracture&#039;&#039;, &#039;&#039;idCameraAnim&#039;&#039;, &#039;&#039;idCameraView&#039;&#039;, &#039;&#039;idCombatNode&#039;&#039;, &#039;&#039;idDamagable&#039;&#039;, &#039;&#039;idEarthQuake&#039;&#039;, &#039;&#039;idEntityFx&#039;&#039;, &#039;&#039;idExplodable&#039;&#039;, &#039;&#039;idForceField&#039;&#039;, &#039;&#039;idFuncAASObstacle&#039;&#039;, &#039;&#039;idFuncAASPortal&#039;&#039;, &#039;&#039;idFuncPortal&#039;&#039;, &#039;&#039;idFuncSmoke&#039;&#039;, &#039;&#039;idItem&#039;&#039;, &#039;&#039;idLight&#039;&#039;, &#039;&#039;idListener&#039;&#039;, &#039;&#039;idMoveable&#039;&#039;, &#039;&#039;idMover&#039;&#039;, &#039;&#039;idMover_Binary&#039;&#039;, &#039;&#039;idPhantomObjects&#039;&#039;, &#039;&#039;idPlayerStart&#039;&#039;, &#039;&#039;idPortalSky&#039;&#039;, &#039;&#039;idRiser&#039;&#039;, &#039;&#039;idRotater&#039;&#039;, &#039;&#039;idShaking&#039;&#039;, &#039;&#039;idSound&#039;&#039;, &#039;&#039;idStaticEntity&#039;&#039;, &#039;&#039;idTarget_CallObjectFunction&#039;&#039;, &#039;&#039;idTarget_Damage&#039;&#039;, &#039;&#039;idTarget_EnableLevelWeapons&#039;&#039;, &#039;&#039;idTarget_EndLevel&#039;&#039;, &#039;&#039;idTarget_FadeEntity&#039;&#039;, &#039;&#039;idTarget_FadeSoundClass&#039;&#039;, &#039;&#039;idTarget_Give&#039;&#039;, &#039;&#039;idTarget_LightFadeIn&#039;&#039;, &#039;&#039;idTarget_LightFadeOut&#039;&#039;, &#039;&#039;idTarget_PostScriptEvent&#039;&#039;, &#039;&#039;idTarget_Remove&#039;&#039;, &#039;&#039;idTarget_RemoveWeapons&#039;&#039;, &#039;&#039;idTarget_SessionCommand&#039;&#039;, &#039;&#039;idTarget_SetFov&#039;&#039;, &#039;&#039;idTarget_SetGlobalShaderTime&#039;&#039;, &#039;&#039;idTarget_SetInfluence&#039;&#039;, &#039;&#039;idTarget_SetKeyVal&#039;&#039;, &#039;&#039;idTarget_SetModel&#039;&#039;, &#039;&#039;idTarget_SetShaderParm&#039;&#039;, &#039;&#039;idTarget_SetShaderTime&#039;&#039;, &#039;&#039;idTarget_Show&#039;&#039;, &#039;&#039;idTarget_WaitForButton&#039;&#039;, &#039;&#039;idTrigger_Count&#039;&#039;, &#039;&#039;idTrigger_EntityName&#039;&#039;, &#039;&#039;idTrigger_Fade&#039;&#039;, &#039;&#039;idTrigger_Hurt&#039;&#039;, &#039;&#039;idTrigger_Multi&#039;&#039;, &#039;&#039;idTrigger_Timer&#039;&#039;, &#039;&#039;idTrigger_Touch&#039;&#039;, &#039;&#039;idVacuumSeparatorEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activateContacts&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Activate objects sitting on this object.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activateTargets&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Causes this entity to activate all it&#039;s targets. Similar to how a trigger activates entities.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;addDescendant&#039;&#039;&#039;(entity vine); ====&lt;br /&gt;
&lt;br /&gt;
:Event called using vine.*()&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;tdmVine&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;addFrobPeer&#039;&#039;&#039;(entity peer); ====&lt;br /&gt;
&lt;br /&gt;
:Adds the passed entity as a frob peer.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;addInvItem&#039;&#039;&#039;(entity inv_item); ====&lt;br /&gt;
&lt;br /&gt;
:Adds the given item to the inventory. Depending on the type the passed entity will be removed from the game (as for loot items) or hidden.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;addItemToInv&#039;&#039;&#039;(entity target); ====&lt;br /&gt;
&lt;br /&gt;
:Adds the entity to the given entity&#039;s inventory. Depending on the type the entity will be removed from the game (as for loot items) or hidden. Example: $book-&amp;gt;addItemToInv($player1);&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;addTarget&#039;&#039;&#039;(entity target); ====&lt;br /&gt;
&lt;br /&gt;
:Add a target to this entity.&lt;br /&gt;
::&#039;&#039;target&#039;&#039;: the entity to add as target&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;addToClip&#039;&#039;&#039;(float amount); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;alert&#039;&#039;&#039;(string type, float val); ====&lt;br /&gt;
&lt;br /&gt;
:ai generalized alerts&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;alertAI&#039;&#039;&#039;(string type, float amount, entity actor); ====&lt;br /&gt;
&lt;br /&gt;
:internal&lt;br /&gt;
::&#039;&#039;type&#039;&#039;: alert type&lt;br /&gt;
::&#039;&#039;amount&#039;&#039;: alert amount&lt;br /&gt;
::&#039;&#039;actor&#039;&#039;: actor causing alert&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;allowDamage&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:The AI can take damage again.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;allowDrop&#039;&#039;&#039;(float allow); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;allowHiddenMovement&#039;&#039;&#039;(float enable); ====&lt;br /&gt;
&lt;br /&gt;
:Normally, when hidden, monsters do not run physics. This enables physics when hidden.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;allowMovement&#039;&#039;&#039;(float allow); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;ammoAvailable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Number of shots left in inventory&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;ammoInClip&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;angRotate&#039;&#039;&#039;(vector angles1, vector angles2); ====&lt;br /&gt;
&lt;br /&gt;
:Rotates the given Euler angles by each other.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;angToForward&#039;&#039;&#039;(vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a forward vector for the given Euler angles.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;angToRight&#039;&#039;&#039;(vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a right vector for the given Euler angles.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;angToUp&#039;&#039;&#039;(vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Returns an up vector for the given Euler angles.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;animDistance&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the distance that the anim travels. If the entity has multiple anims with animName, the distance may not match the anim that is played. Use chooseAnim to get a non-random anim and pass that string into animDistance.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;animDone&#039;&#039;&#039;(float channel, float blendOutFrames); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the animation playing on the given channel is completed considering a number of blend frames.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;, &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;animIsPaused&#039;&#039;&#039;(float channel); ====&lt;br /&gt;
&lt;br /&gt;
:Return whether the given anim channel is paused&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;, &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;animLength&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the length of the anim in seconds. If the entity has multiple anims with animName, length may not match the anim that is played. Use chooseAnim to get a non-random anim and pass that string into animLength.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;animState&#039;&#039;&#039;(float channel, string stateFunction, float blendFrame); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a new animation state script function for the given channel.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;animTurn&#039;&#039;&#039;(float angle); ====&lt;br /&gt;
&lt;br /&gt;
:Enable/disable animation controlled turning.&lt;br /&gt;
::&#039;&#039;angle&#039;&#039;: Pass in the maximum # of degrees the animation turns. Use an amount of 0 to disable.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;applyImpulse&#039;&#039;&#039;(entity source, float bodyid, vector point, vector impulse); ====&lt;br /&gt;
&lt;br /&gt;
:Applies an impulse to the entity. Example: entity.applyImpulse($player1, 0, entity.getOrigin(), &#039;0 0 2&#039;);&lt;br /&gt;
::&#039;&#039;source&#039;&#039;: Pass $null_entity or the entity that applies the impulse&lt;br /&gt;
::&#039;&#039;bodyid&#039;&#039;: For articulated figures, ID of the body, 0 for the first (main) body. Otherwise use 0.&lt;br /&gt;
::&#039;&#039;point&#039;&#039;: Point on the body where the impulse is applied to&lt;br /&gt;
::&#039;&#039;impulse&#039;&#039;: Vector of the impulse&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;asin&#039;&#039;&#039;(float sine); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the angle in degrees with the given sine.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;assert&#039;&#039;&#039;(float condition); ====&lt;br /&gt;
&lt;br /&gt;
:Breaks if the condition is zero. (Only works in debug builds.)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;attach&#039;&#039;&#039;(entity ent, string attName); ====&lt;br /&gt;
&lt;br /&gt;
:Attach an entity to the AI. Entity spawnArgs checked for attachments are:  - &amp;quot;origin&amp;quot;, &amp;quot;angles&amp;quot;, and &amp;quot;joint&amp;quot;. These must be set prior to calling attach.&lt;br /&gt;
::&#039;&#039;attName&#039;&#039;: the desired name of the attachment, e.g., &#039;melee_weapon&#039;&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;attachToPos&#039;&#039;&#039;(entity ent, string position, string attName); ====&lt;br /&gt;
&lt;br /&gt;
:Attach an entity to the AI, using a named attachment position&lt;br /&gt;
::&#039;&#039;attName&#039;&#039;: the desired name of the attachment, e.g., &#039;melee_weapon&#039;&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;attack&#039;&#039;&#039;(entity enemy, float ignoreCollisions); ====&lt;br /&gt;
&lt;br /&gt;
:Direct the turret to manually attack the specified entity. Use disableManualAttack() to disable.&lt;br /&gt;
::&#039;&#039;enemy&#039;&#039;: enemy to attack&lt;br /&gt;
::&#039;&#039;ignoreCollisions&#039;&#039;: whether to ignore obstacles in the way to the enemy when planning to attack&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idTurret&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;attackBegin&#039;&#039;&#039;(string damageDef); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;attackEnd&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;attackMelee&#039;&#039;&#039;(string damageDef); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the attack hit&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;attackMissile&#039;&#039;&#039;(string jointName); ====&lt;br /&gt;
&lt;br /&gt;
:returns projectile fired&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;attackPosition&#039;&#039;&#039;(vector targetPos, float ignoreCollisions); ====&lt;br /&gt;
&lt;br /&gt;
:Direct the turret to manually attack a position. Use disableManualAttack() to disable.&lt;br /&gt;
::&#039;&#039;targetPos&#039;&#039;: position to attack&lt;br /&gt;
::&#039;&#039;ignoreCollisions&#039;&#039;: whether to ignore obstacles in the way to the target position when planning to attack. Recommended true for this event.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idTurret&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;bark&#039;&#039;&#039;(string sound); ====&lt;br /&gt;
&lt;br /&gt;
:Let the AI bark a certain sound.&lt;br /&gt;
::&#039;&#039;sound&#039;&#039;: sound name, e.g. &#039;snd_warn_response&#039;&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;becomeNonSolid&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Makes the moveable non-solid for other entities.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;, &#039;&#039;idMoveable&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;becomeRagdoll&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:enables the ragdoll if the entity has one&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;becomeSolid&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;bind&#039;&#039;&#039;(entity master); ====&lt;br /&gt;
&lt;br /&gt;
:Fixes this entity&#039;s position and orientation relative to another entity, such that when the master entity moves, so does this entity.&lt;br /&gt;
::&#039;&#039;master&#039;&#039;: the entity to bind to&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;bindPosition&#039;&#039;&#039;(entity master); ====&lt;br /&gt;
&lt;br /&gt;
:Fixes this entity&#039;s position (but not orientation) relative to another entity, such that when the master entity moves, so does this entity.&lt;br /&gt;
::&#039;&#039;master&#039;&#039;: the entity to bind to&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;bindToBody&#039;&#039;&#039;(entity master, float bodyID, float orientated); ====&lt;br /&gt;
&lt;br /&gt;
:Bind to AF body&lt;br /&gt;
::&#039;&#039;master&#039;&#039;: entity to bind to&lt;br /&gt;
::&#039;&#039;bodyID&#039;&#039;: AF body ID to bind to&lt;br /&gt;
::&#039;&#039;orientated&#039;&#039;: binds the orientation as well as position, if set to 1&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;bindToJoint&#039;&#039;&#039;(entity master, string boneName, float rotateWithMaster); ====&lt;br /&gt;
&lt;br /&gt;
:Fixes this entity&#039;s position and orientation relative to a bone on another entity, such that when the master&#039;s bone moves, so does this entity.&lt;br /&gt;
::&#039;&#039;master&#039;&#039;: the entity to bind to&lt;br /&gt;
::&#039;&#039;boneName&#039;&#039;: the bone name&lt;br /&gt;
::&#039;&#039;rotateWithMaster&#039;&#039;: -&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;bob&#039;&#039;&#039;(float speed, float phase, vector distance); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a translation back and forth along the given vector with the given speed and phase.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;burn&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;cacheSoundShader&#039;&#039;&#039;(string shaderName); ====&lt;br /&gt;
&lt;br /&gt;
:Ensure the specified sound shader is loaded by the system. Prevents cache misses when playing sound shaders.&lt;br /&gt;
::&#039;&#039;shaderName&#039;&#039;: the sound shader to cache&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;, &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;callFunction&#039;&#039;&#039;(string functionName); ====&lt;br /&gt;
&lt;br /&gt;
:Calls a function on an entity&#039;s script object. See also callGlobalFunction().&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;callFunctionsByWildcard&#039;&#039;&#039;(string functionName); ====&lt;br /&gt;
&lt;br /&gt;
:Calls global functions with names matching the specified wildcard in separate threads (in lexicographical order). INTERNAL: don&#039;t use in mission scripting!&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;callGlobalFunction&#039;&#039;&#039;(string functionName, entity other); ====&lt;br /&gt;
&lt;br /&gt;
:calls a global function and passes the other entity along as the first argument calls the function in a new thread, so it continues executing in the current thread right away (unlike entity.callFunction( &amp;quot;blah&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;callGui&#039;&#039;&#039;(float handle, string namedEvent); ====&lt;br /&gt;
&lt;br /&gt;
:Calls a named event in a GUI.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canBecomeSolid&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canBeUsedBy&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the entity can be used by the argument entity&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canHitEnemy&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canHitEnemyFromAnim&#039;&#039;&#039;(string anim); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canHitEnemyFromJoint&#039;&#039;&#039;(string jointname); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canPlant&#039;&#039;&#039;(vector traceStart, vector traceEnd, entity ignore, entity vine); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canReachEnemy&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if character can walk to enemy&#039;s position. For walking monsters, enemy should be near the floor.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canReachEntity&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if character can walk to entity&#039;s position. For walking monsters, entity should be near the floor.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canReachPosition&#039;&#039;&#039;(vector pos); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if character can walk to specified position. For walking monsters, position should be near the floor.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canSee&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;, &#039;&#039;idSecurityCamera&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canSeeEntity&#039;&#039;&#039;(entity target, float useLighting); ====&lt;br /&gt;
&lt;br /&gt;
:This is a general version of idAI::canSee, that can be used by all entities. It doesn&#039;t regard FOV, it just performs a trace to check whether the target is occluded by world geometry. Is probably useful for stim/response as well Pass useLighting = true to take the lighting of the target entity into account. Use &amp;quot;isEntityHidden&amp;quot; as a script event with a threshold. The constant threshold value for useLighting is defined within the SDK in game/entity.h.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canSeeExt&#039;&#039;&#039;(entity ent, float b_useFOV, float b_useLighting); ====&lt;br /&gt;
&lt;br /&gt;
:This is an alternate version of canSee that can optionally choose to use field of vision and lighting calculations.&lt;br /&gt;
::&#039;&#039;b_useFOV&#039;&#039;: If 0 the entity will be visible even if the AI&#039;s back is turned to it&lt;br /&gt;
::&#039;&#039;b_useLighting&#039;&#039;: If b_useLighting is 0 the entity will be visible in complete darkness. If it is 1, the entity will only be visible if there is light shining on it, but the slightest light is enought. Use &amp;quot;isEntityHidden&amp;quot; as a script event with a threshold instead.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canSeePositionExt&#039;&#039;&#039;(vector position, float b_useFOV, float b_useLighting); ====&lt;br /&gt;
&lt;br /&gt;
:This is an alternate version of canSeeExt that tests a location rather than an entity. Note that any actor at the position may make it not seeable from a distance.&lt;br /&gt;
::&#039;&#039;b_useFOV&#039;&#039;: If 0 the entity will be visible even if the AI&#039;s back is turned to it&lt;br /&gt;
::&#039;&#039;b_useLighting&#039;&#039;: If 0 the entity will be visible in complete darkness&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canWater&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Event called using vine.*()&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;tdmVine&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;ceil&#039;&#039;&#039;(float x); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the smallest integer that is greater than or equal to the given value.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;changeEntityRelation&#039;&#039;&#039;(entity ent, float relationChange); ====&lt;br /&gt;
&lt;br /&gt;
:This changes the current relation to an entity by adding the new amount.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;changeInvIcon&#039;&#039;&#039;(string name, string category, string icon); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the inventory icon of the given item in the given category to &amp;lt;icon&amp;gt;.&lt;br /&gt;
::&#039;&#039;name&#039;&#039;: name of the item&lt;br /&gt;
::&#039;&#039;category&#039;&#039;: the item&#039;s category&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;changeInvItemCount&#039;&#039;&#039;(string name, string category, float amount); ====&lt;br /&gt;
&lt;br /&gt;
:Decreases the inventory item stack count by amount. The item is addressed using the name and category of the item. These are usually defined on the inventory item entity (&amp;quot;inv_name&amp;quot;, &amp;quot;inv_category&amp;quot;)  Amount can be both negative and positive.&lt;br /&gt;
::&#039;&#039;name&#039;&#039;: name of the item&lt;br /&gt;
::&#039;&#039;category&#039;&#039;: the item&#039;s category&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;changeInvLightgemModifier&#039;&#039;&#039;(string name, string category, float amount); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the lightgem modifier value of the given item. Valid arguments are between 0 and 32 (which is the maximum lightgem value).&lt;br /&gt;
::&#039;&#039;name&#039;&#039;: name of the item&lt;br /&gt;
::&#039;&#039;category&#039;&#039;: the item&#039;s category&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;changeLootAmount&#039;&#039;&#039;(float type, float amount); ====&lt;br /&gt;
&lt;br /&gt;
:Changes the loot amount of the given Type (e.g. GOODS) by &amp;lt;amount&amp;gt;.  The mission statisic for loot found gets changed too.  The new value of the changed type is returned (e.g. the new GOODS value if this has been changed).  Note: The LOOT_TOTAL type can&#039;t be changed and 0 is returned.&lt;br /&gt;
::&#039;&#039;type&#039;&#039;: one of: LOOT_GOLD, LOOT_GOODS, LOOT_JEWELRY&lt;br /&gt;
::&#039;&#039;amount&#039;&#039;: can be negative&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;changeWeaponName&#039;&#039;&#039;(string weaponName, string displayName); ====&lt;br /&gt;
&lt;br /&gt;
:Changes the display name of the given weapon item to something different. Pass an empty string to reset the display name to the definition as found in the weaponDef.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;changeWeaponProjectile&#039;&#039;&#039;(string weaponName, string projectileDefName); ====&lt;br /&gt;
&lt;br /&gt;
:Changes the projectile entityDef name of the given weapon (e.g. &amp;quot;broadhead&amp;quot;) to the specified entityDef (e.g. &amp;quot;atdm:projectile_broadhead&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;chargeAttack&#039;&#039;&#039;(string damageDef); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;checkAAS&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;checkAbsence&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:description missing&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;checkAnim&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Ensures that the animation exists and causes an error if it doesn&#039;t.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;chooseAnim&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Chooses a random anim and returns the name. Useful for doing move tests on anims.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearActiveInventoryMap&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Clear the active inventory map entity&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearActiveInventoryMapEnt&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Clear the active inventory map entity&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearAllJoints&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Removes any custom transforms on all joints.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAnimatedEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearBurn&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearController&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Need separate clearController because scripting doesn&#039;t like passing in $null_entity? (greebo: one could remove this function and set the argument type of setController to &#039;E&#039;.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CAIVehicle&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearEnemy&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Clears the enemy entity&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearFlyOffset&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the preferred height relative to the player&#039;s view height to fly at to the value set in the def file.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearJoint&#039;&#039;&#039;(float jointnum); ====&lt;br /&gt;
&lt;br /&gt;
:Removes any custom transforms on the specified joint.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAnimatedEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearMouseDeadTime&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearPersistentArgs&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Clears data that persists between maps.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearSignal&#039;&#039;&#039;(float signalNum); ====&lt;br /&gt;
&lt;br /&gt;
:Disables the callback function on the specified signal.&lt;br /&gt;
::&#039;&#039;signalNum&#039;&#039;: signal number&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearSignalThread&#039;&#039;&#039;(float signalNum, entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:Clears the script callback function set for when the given signal is raised on the given entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearWatered&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Event called using vine.*()&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;tdmVine&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;clipSize&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Close&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Closes the frobmover, regardless of its previous state. Mover must be open, otherwise nothing happens.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CBinaryFrobMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;closePortal&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Closes the renderer portal associated with this mover.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;, &#039;&#039;idMover_Binary&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;closestEnemyToPoint&#039;&#039;&#039;(vector point); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the enemy closest to the given location.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;closestReachableEnemy&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Used for determining tactile alert targets&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;closestReachableEnemyOfEntity&#039;&#039;&#039;(entity team_mate); ====&lt;br /&gt;
&lt;br /&gt;
:Finds another character&#039;s closest reachable enemy&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;copyBind&#039;&#039;&#039;(entity other); ====&lt;br /&gt;
&lt;br /&gt;
:copy bind information of other to this entity (i.e., bind this entity to the same entity that other is bound to)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;copySpawnArgs&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:copies the spawn args from an entity&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;cos&#039;&#039;&#039;(float degrees); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the cosine of the given angle in degrees.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;createMissile&#039;&#039;&#039;(string jointname); ====&lt;br /&gt;
&lt;br /&gt;
:returns projectile created&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;createMissileFromDef&#039;&#039;&#039;(string defName, string jointName); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;createOverlay&#039;&#039;&#039;(string guiFile, float layer); ====&lt;br /&gt;
&lt;br /&gt;
:Creates a GUI overlay. (must be used on the player)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;createProjectile&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;CreateTimer&#039;&#039;&#039;(float stimId, float hour, float minutes, float seconds, float milliseconds); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;createXrayOverlay&#039;&#039;&#039;(string guiFile); ====&lt;br /&gt;
&lt;br /&gt;
:Creates a GUI overlay with X-ray material. (must be used on the player)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;CrossProduct&#039;&#039;&#039;(vector vec1, vector vec2); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the cross product of the two vectors.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;cullAll&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Cull (remove from world) all entities.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;Seed&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;customDeath&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;damage&#039;&#039;&#039;(entity inflictor, entity attacker, vector dir, string damageDefName, float damageScale); ====&lt;br /&gt;
&lt;br /&gt;
:Deals damage to this entity (gets translated into the idEntity::Damage() method within the SDK).&lt;br /&gt;
::&#039;&#039;inflictor&#039;&#039;: the entity causing the damage (maybe a projectile)&lt;br /&gt;
::&#039;&#039;attacker&#039;&#039;: the &amp;quot;parent&amp;quot; entity of the inflictor, the one that is responsible for the inflictor (can be the same)&lt;br /&gt;
::&#039;&#039;dir&#039;&#039;: the direction the attack is coming from.&lt;br /&gt;
::&#039;&#039;damageDefName&#039;&#039;: the name of the damage entityDef to know what damage is being dealt to &amp;lt;self&amp;gt; (e.g. &amp;quot;damage_lava&amp;quot;)&lt;br /&gt;
::&#039;&#039;damageScale&#039;&#039;: the scale of the damage (pass 1.0 as default, this should be ok).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;dampenSound&#039;&#039;&#039;(float dampen); ====&lt;br /&gt;
&lt;br /&gt;
:Toggle whether the shattering sound is dampened on the window, e.g., when covered by moss.&lt;br /&gt;
::&#039;&#039;dampen&#039;&#039;: 1 = dampened, 0 = not dampened&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idBrittleFracture&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;deathMenu&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;debugArrow&#039;&#039;&#039;(vector color, vector start, vector end, float size, float lifetime); ====&lt;br /&gt;
&lt;br /&gt;
:line drawing for debug visualization.  lifetime of 0 == 1 frame.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;debugBounds&#039;&#039;&#039;(vector color, vector mins, vector maxs, float lifetime); ====&lt;br /&gt;
&lt;br /&gt;
:line drawing for debug visualization.  lifetime of 0 == 1 frame.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;debugCircle&#039;&#039;&#039;(vector color, vector origin, vector dir, float radius, float numSteps, float lifetime); ====&lt;br /&gt;
&lt;br /&gt;
:line drawing for debug visualization.  lifetime of 0 == 1 frame.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;debugLine&#039;&#039;&#039;(vector color, vector start, vector end, float lifetime); ====&lt;br /&gt;
&lt;br /&gt;
:line drawing for debug visualization.  lifetime of 0 == 1 frame.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;decelSound&#039;&#039;&#039;(string sound); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the sound to be played when the mover decelerates.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;decelTime&#039;&#039;&#039;(float time); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the deceleration time. Set this deceleration time before initiating a new move.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;decelTo&#039;&#039;&#039;(float speed, float time); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a deceleration to the given speed over the given time in seconds.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;destroyOverlay&#039;&#039;&#039;(float handle); ====&lt;br /&gt;
&lt;br /&gt;
:Destroys a GUI overlay. (must be used on the player)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;directDamage&#039;&#039;&#039;(entity damageTarget, string damageDef); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Disables the mover/trigger&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;Seed&#039;&#039;, &#039;&#039;idMover_Binary&#039;&#039;, &#039;&#039;idTrigger&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disableAFPush&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disableAnimchannel&#039;&#039;&#039;(float channel); ====&lt;br /&gt;
&lt;br /&gt;
:Used to disable a certain animchannel (for example if the ai is dead)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disableClip&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disableEyeFocus&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Disables eye focus.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disableGravity&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;DisableLegIK&#039;&#039;&#039;(float num); ====&lt;br /&gt;
&lt;br /&gt;
:disables leg IK&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disableManualAttack&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Stop attacking the manually specified enemy or position and return to automatic target acquisition mode.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idTurret&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disablePain&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Disables pain animations.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disableSplineAngles&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Disables aligning the mover with the spline direction.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;DisableWalkIK&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:disables walk IK&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disableWeapon&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Lowers and disables the player weapon.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;distanceTo&#039;&#039;&#039;(entity other); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the distance of this entity to another entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;distanceToPoint&#039;&#039;&#039;(vector point); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the distance of this entity to a point.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;DotProduct&#039;&#039;&#039;(vector vec1, vector vec2); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the dot product of the two vectors.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;drawText&#039;&#039;&#039;(string text, vector origin, float scale, vector color, float align, float lifetime); ====&lt;br /&gt;
&lt;br /&gt;
:text drawing for debugging. lifetime of 0 == 1 frame.&lt;br /&gt;
::&#039;&#039;align&#039;&#039;: 0 = left, 1 = center, 2 = right&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;dropAttachment&#039;&#039;&#039;(string attName); ====&lt;br /&gt;
&lt;br /&gt;
:Drop the attachment for the given attachment name.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;dropAttachmentInd&#039;&#039;&#039;(float index); ====&lt;br /&gt;
&lt;br /&gt;
:Drop the attachment for the given index.&lt;br /&gt;
::&#039;&#039;index&#039;&#039;: starts at 0&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;dropTorch&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ejectBrass&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;emitParticle&#039;&#039;&#039;(string particle, float startTime, float diversity, vector origin, vector angle); ====&lt;br /&gt;
&lt;br /&gt;
:Start a particle effect in the world without using an entity emitter. Will emit one quad per particle stage when first called with sys.getTime() as the start time. Designed to be called once per frame with the same startTime each call to achieve a normal particle effect, or on demand with sys.getTime() as the startTime for finer grained control, 1 quad at a time. Returns True (1) if there are more particles to be emitted from the stage, False (0) if the stage has released all its quads.&lt;br /&gt;
::&#039;&#039;particle&#039;&#039;: String: name of particle effect.&lt;br /&gt;
::&#039;&#039;startTime&#039;&#039;: Game seconds since map start: use sys.getTime() for the first call unless you want to back-date the particle so that it starts part way through its cycle.&lt;br /&gt;
::&#039;&#039;diversity&#039;&#039;: Randomizer value between 0 and 1. All particles with the same diversity will have the same path and rotation. Use sys.random(1) for a random path.&lt;br /&gt;
::&#039;&#039;origin&#039;&#039;: Origin of the particle effect.&lt;br /&gt;
::&#039;&#039;angle&#039;&#039;: Axis for the particle effect. Use $&amp;lt;entityname&amp;gt;.getAngles() to align the particle to an entity. use &#039;0 0 0&#039; for an upright (world-aligned) particle effect.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;emitterAddModel&#039;&#039;&#039;(string modelName, vector modelOffset); ====&lt;br /&gt;
&lt;br /&gt;
:Adds a new particle (or regular, if you wish) model to the emitter, located at modelOffset units away from the emitter&#039;s origin.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idFuncEmitter&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;emitterGetNumModels&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of models/particles this emitter has. Always &amp;gt;= 1.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idFuncEmitter&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;emptyHand&#039;&#039;&#039;(string hand); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Enables the mover/trigger&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;Seed&#039;&#039;, &#039;&#039;idMover_Binary&#039;&#039;, &#039;&#039;idTrigger&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enableAFPush&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enableAnim&#039;&#039;&#039;(float channel, float blendFrames); ====&lt;br /&gt;
&lt;br /&gt;
:Enables animation on the given channel.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enableClip&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enableDamage&#039;&#039;&#039;(float enable); ====&lt;br /&gt;
&lt;br /&gt;
:enable/disable damage&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMoveable&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enableEyeFocus&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Enables eye focus.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enableGravity&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;EnableLegIK&#039;&#039;&#039;(float num); ====&lt;br /&gt;
&lt;br /&gt;
:enables leg IK&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enablePain&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Enables pain animations.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enableSplineAngles&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Enables aligning the mover with the spline direction.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;EnableWalkIK&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:enables walk IK&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enableWeapon&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Enables the player weapon.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;endState&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Ends the current state with the given name, returns TRUE if more than one state is remaining.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;endZoom&#039;&#039;&#039;(float duration); ====&lt;br /&gt;
&lt;br /&gt;
:Starts the zoom out event, which performs a gradual transition back to the default FOV. May be called during a transition as well to intercept a pending zoom in transition.&lt;br /&gt;
::&#039;&#039;duration&#039;&#039;: duration of the transition in msec&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;enemyInCombatCone&#039;&#039;&#039;(entity combatNode, float use_current_enemy_location); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;enemyPositionValid&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;enemyRange&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;enemyRange2D&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;entityInAttackCone&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;error&#039;&#039;&#039;(string text); ====&lt;br /&gt;
&lt;br /&gt;
:Issues an error.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;exitTeleporter&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;extinguishLights&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Extinguishes all lights (i.e. the &amp;lt;self&amp;gt; entity plus all bound lights)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;faceEnemy&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;faceEntity&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;facingIdeal&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;fadeIn&#039;&#039;&#039;(vector color, float time); ====&lt;br /&gt;
&lt;br /&gt;
:Fades towards the given color over the given time in seconds.&lt;br /&gt;
::&#039;&#039;time&#039;&#039;: in seconds&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;fadeInLight&#039;&#039;&#039;(float time); ====&lt;br /&gt;
&lt;br /&gt;
:Turns the light on over the given time in seconds.&lt;br /&gt;
::&#039;&#039;time&#039;&#039;: in seconds&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idLight&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;fadeOut&#039;&#039;&#039;(vector color, float time); ====&lt;br /&gt;
&lt;br /&gt;
:Fades from the given color over the given time in seconds.&lt;br /&gt;
::&#039;&#039;time&#039;&#039;: in seconds&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;fadeOutLight&#039;&#039;&#039;(float time); ====&lt;br /&gt;
&lt;br /&gt;
:Turns the light out over the given time in seconds.&lt;br /&gt;
::&#039;&#039;time&#039;&#039;: in seconds&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idLight&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;fadeSound&#039;&#039;&#039;(float channel, float newLevel, float fadeTime); ====&lt;br /&gt;
&lt;br /&gt;
:Fades the sound on this entity to a new level over a period of time.  Use SND_CHANNEL_ANY for all currently playing sounds.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;fadeTo&#039;&#039;&#039;(vector color, float alpha, float time); ====&lt;br /&gt;
&lt;br /&gt;
:Fades to the given color up to the given alpha over the given time in seconds.&lt;br /&gt;
::&#039;&#039;time&#039;&#039;: in seconds&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;fadeToLight&#039;&#039;&#039;(vector color, float time); ====&lt;br /&gt;
&lt;br /&gt;
:Fades the light to the given color over a given time.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idLight&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;findActorsInBounds&#039;&#039;&#039;(vector mins, vector maxs); ====&lt;br /&gt;
&lt;br /&gt;
:Returns an entity within the bounds specified&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;findEnemy&#039;&#039;&#039;(float onlyInFov); ====&lt;br /&gt;
&lt;br /&gt;
:Finds enemy player in PVS&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;findEnemyAI&#039;&#039;&#039;(float onlyInFov); ====&lt;br /&gt;
&lt;br /&gt;
:Finds enemy monster in PVS&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;findEnemyInCombatNodes&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Finds enemy player in attack cones&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;findFriendlyAI&#039;&#039;&#039;(float team); ====&lt;br /&gt;
&lt;br /&gt;
:Use this to find a visible AI friendly to ourselves. It basically iterates over all active entities in the map and looks for friendly actors. The pythagorean distance is taken to evaluate the distance.  Don&#039;t call this every frame, this might get expensive in larger maps. Returns the nearest visible actor entity or the $null_entity, if none was found.&lt;br /&gt;
::&#039;&#039;team&#039;&#039;: used to constrain the search to a given team. Set this to -1 to let the code ignore this argument&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;finishAction&#039;&#039;&#039;(string action); ====&lt;br /&gt;
&lt;br /&gt;
:Finishes the given wait action.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;finishChannelAction&#039;&#039;&#039;(float channel, string animname); ====&lt;br /&gt;
&lt;br /&gt;
:Overloaded finishAction function for setting the waitstate on each channel separately&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;fireMissileAtTarget&#039;&#039;&#039;(string jointname, string targetname); ====&lt;br /&gt;
&lt;br /&gt;
:Launches a missile at entity specified by &#039;attack_target&#039;.  returns projectile fired&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;firstPerson&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns view control to the player entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;flashlight&#039;&#039;&#039;(float enable); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;flee&#039;&#039;&#039;(entity entToFleeFrom); ====&lt;br /&gt;
&lt;br /&gt;
:Flee from the given entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;fleeFromPoint&#039;&#039;&#039;(vector pos); ====&lt;br /&gt;
&lt;br /&gt;
:Flee from the given position.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;floor&#039;&#039;&#039;(float x); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the largest integer that is less than or equal to the given value.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;footstep&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Plays footstep sound.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;, &#039;&#039;idAnimated&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;foundBody&#039;&#039;&#039;(entity body); ====&lt;br /&gt;
&lt;br /&gt;
:Objective callback for when an AI finds a body.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;frob&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Frobs the entity (i.e. simulates a frob action performed by the player). Returns TRUE if the entity is frobable, FALSE otherwise.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;frobHilight&#039;&#039;&#039;(float state); ====&lt;br /&gt;
&lt;br /&gt;
:ishtvan: Tries to make the entity frobhilight or not&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;frobRidable&#039;&#039;&#039;(entity playerController); ====&lt;br /&gt;
&lt;br /&gt;
:Called when a player directly mounts or dismounts a ridable AI.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CAIVehicle&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Gas_Knockout&#039;&#039;&#039;(entity inflictor); ====&lt;br /&gt;
&lt;br /&gt;
:AI knockout&lt;br /&gt;
::&#039;&#039;inflictor&#039;&#039;: the entity causing the knockout, can be the $null_entity&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getActualStruckEnt&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Getter for projectile result variable&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CProjectileResult&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getAcuity&#039;&#039;&#039;(string type); ====&lt;br /&gt;
&lt;br /&gt;
:ai generalized alerts&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getAlertActor&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get the actor that alerted the AI in this frame.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getAlertLevelOfOtherAI&#039;&#039;&#039;(entity otherEntity); ====&lt;br /&gt;
&lt;br /&gt;
:This event gets the alert number of another AI (AI_AlertLevel variable value) Returns the alert number of the other AI, 0.0 if its not an AI or is NULL&lt;br /&gt;
::&#039;&#039;otherEntity&#039;&#039;: the other AI entity who&#039;s alert number is being queried&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getAngles&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current orientation of this entity (relative to bind parent if any).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getAngularVelocity&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the current angular velocity of this entity. The angular velocity of a physics object is a vector that passes through the center of mass. The direction of this vector defines the axis of rotation and the magnitude defines the rate of rotation about the axis in radians per second.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getAngularVelocityB&#039;&#039;&#039;(float id); ====&lt;br /&gt;
&lt;br /&gt;
:Get the angular velocitiy of a particular body Returns (0,0,0) if the body ID is invalid.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAFEntity_Base&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getAnimList&#039;&#039;&#039;(float channel); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a list of all animations and their anim rates.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getAnimRate&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the rate for the given animation. Returns -1 if animation cannot be found.&lt;br /&gt;
::&#039;&#039;animName&#039;&#039;: The name of the animation.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getAnimState&#039;&#039;&#039;(float channel); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the name of the current animation state script function used for the given channel.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getAttachment&#039;&#039;&#039;(string attName); ====&lt;br /&gt;
&lt;br /&gt;
:Get the attached entity with the given attachment name Will be NULL if the name is invalid or if the entity no longer exists&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getAttachmentInd&#039;&#039;&#039;(float index); ====&lt;br /&gt;
&lt;br /&gt;
:Get the attached entity at the given index. Will be NULL if the index is invalid or the entity no longer exists&lt;br /&gt;
::&#039;&#039;index&#039;&#039;: starts at 0&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getAttacker&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the attacking entity&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getAttackFlag&#039;&#039;&#039;(float combatType); ====&lt;br /&gt;
&lt;br /&gt;
:Returns 1 if the given attack flag is activated.&lt;br /&gt;
::&#039;&#039;combatType&#039;&#039;: see tdm_defs.script for possible enum values&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getAudThresh&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getAxialDir&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Getter for projectile result variable&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CProjectileResult&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getBindChild&#039;&#039;&#039;(float ind); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the ind_th bind child of this entity or NULL if index is invalid. NOTE: indices start at zero&lt;br /&gt;
::&#039;&#039;ind&#039;&#039;: child index&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getBindMaster&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the entity&#039;s bindmaster&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getBlendFrames&#039;&#039;&#039;(float channel); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of frames to blend between animations on the given channel.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;, &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getBoolKey&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Retrieves the boolean value of a specific spawn arg, defaulting to false.&lt;br /&gt;
::&#039;&#039;key&#039;&#039;: spawnarg name&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getButtons&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the button state from the current user command.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getCalibratedLightgemValue&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the calibrated light gem value.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getClipMask&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the clipmask of the physics object.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getClosestHiddenTarget&#039;&#039;&#039;(string entity_type); ====&lt;br /&gt;
&lt;br /&gt;
:Finds the closest targeted entity of the specified type.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getColor&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the color of this entity (shader parms Parm0, Parm1, Parm2).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getCombatNode&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getContents&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the contents of the physics object.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getCurInvCategory&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the name of the currently highlighted inventory category.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getCurInvIcon&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the icon of the currently highlighted inventory item.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getCurInvItemCount&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the item count of the currently highlighted inventory Item, if stackable.Returns - 1 if non - stackable&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getCurInvItemEntity&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the currently highlighted inventory item entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getCurInvItemId&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the name of the currently highlighted inventory item (the one defined in &amp;quot;inv_item_id&amp;quot;). Most items will return an empty string, unless the &amp;quot;inv_item_id&amp;quot; is set on purpose.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getCurInvItemName&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the name of the currently highlighted inventory item (the one defined in &amp;quot;inv_name&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getCurrentMissionNum&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of the current mission (0-based, the first mission has number 0).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getCurrentWeapon&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns weaponX where X is the number of the weapon the player is currently holding.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getCurrentYaw&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getCurWeaponName&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the name of the current weapon, as defined by &amp;quot;inv_weapon_name&amp;quot; in the weaponDef.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getcvar&#039;&#039;&#039;(string name); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the string for a cvar.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getcvarf&#039;&#039;&#039;(string name); ====&lt;br /&gt;
&lt;br /&gt;
:Returns float value for a cvar.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getDifficultyLevel&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns 0 (Easy), 1 (Medium) or 2 (Hard), depending on the difficulty level of the current mission.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getDifficultyName&#039;&#039;&#039;(float difficultyLevel); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the (translated) name of the difficulty level passed as the argument.&lt;br /&gt;
::&#039;&#039;difficultyLevel&#039;&#039;: 0 (Easy), 1 (Medium), 2 (Hard)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;GetDoor&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the associated door entity for this handle.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CFrobDoorHandle&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;GetDoorhandle&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the handle entity of this door. Can return NULL (== $null_entity)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CFrobDoor&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getDragged&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the currently dragged body. Returns $null_entity if the body is shouldered, the player has nothing in his hands, or he has a non-AF entity in his hands. See also getShouldered(), getGrabbed() and getFrobbed().&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getEnemy&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;, &#039;&#039;idSecurityCamera&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getEnemyEyePos&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getEnemyPos&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getEntity&#039;&#039;&#039;(string name); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a reference to the entity with the specified name.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getEntityFlag&#039;&#039;&#039;(string flagName); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the value of the specified entity flag.&lt;br /&gt;
::&#039;&#039;flagName&#039;&#039;: Can be one of (case insensitive): 	notarget: if true never attack or target this entity 	noknockback: if true no knockback from hits 	takedamage: if true this entity can be damaged 	hidden: if true this entity is not visible 	bindOrientated: if true both the master orientation is used for binding 	solidForTeam: if true this entity is considered solid when a physics team mate pushes entities 	forcePhysicsUpdate: if true always update from the physics whether the object moved or not 	selected: if true the entity is selected for editing 	neverDormant: if true the entity never goes dormant 	isDormant: if true the entity is dormant 	hasAwakened: before a monster has been awakened the first time, use full PVS for dormant instead of area-connected 	invisible: if true this entity cannot be seen 	inaudible: if true this entity cannot be heard &lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getEntityKey&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Retrieves the entity specified by the spawn arg.&lt;br /&gt;
::&#039;&#039;key&#039;&#039;: spawnarg name&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getEyePos&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get eye position of the player and the AI&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getFinalAngVel&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Getter for projectile result variable&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CProjectileResult&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getFinalVel&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Getter for projectile result variable&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CProjectileResult&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getFloatKey&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Retrieves the floating point value of a specific spawn arg, defaulting to 0.0f.&lt;br /&gt;
::&#039;&#039;key&#039;&#039;: spawnarg name&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getFov&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:This returns the current FOV of the player. You can modify the current FOV with startZoom() and endZoom().&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;GetFractionalPosition&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a fraction between 0.00 (closed) and 1.00 (open).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CBinaryFrobMover&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getFrameTime&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:returns the length of time between game frames.  this is not related to renderer frame rate.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getFrobbed&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the currently frobhilighted entity. This includes entities the player has in his hands. Sets &amp;quot;frob only used by&amp;quot; mode&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getGrabbed&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the currently entity in the players hands. Returns $null_entity if the player has nothing in his hands Dragging or shouldering a body counts as grabbing it. See also getDragged(), getShouldered(), getFrobbed().&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getGui&#039;&#039;&#039;(float handle); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the file currently loaded by a GUI.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getGuiFloat&#039;&#039;&#039;(float handle, string key); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a GUI parameter.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getGuiInt&#039;&#039;&#039;(float handle, string key); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a GUI parameter.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getGuiString&#039;&#039;&#039;(float handle, string key); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a GUI parameter.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getHead&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the entity used for the character&#039;s head, if it has one.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getHealth&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current health.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getHinderance&#039;&#039;&#039;(string source); ====&lt;br /&gt;
&lt;br /&gt;
:Used to get hinderance from a source.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getIdealWeapon&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getImmobilization&#039;&#039;&#039;(string source); ====&lt;br /&gt;
&lt;br /&gt;
:Used to get immobilization from a source. Warning: Not a finalized version. It&#039;s subject to change, so use it at your own risk.)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getIncidenceAngle&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Getter for projectile result variable&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CProjectileResult&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getInterceptTime&#039;&#039;&#039;(vector velocityTarget, float speedInterceptor, vector positionTarget, vector positionInterceptor); ====&lt;br /&gt;
&lt;br /&gt;
:Returns how much time it will take for an interceptor like a projectile to intercept a moving target at the earliest possible opportunity. Returns 0 if an intercept is not possible or the speed of the target and interceptor are too similar.&lt;br /&gt;
::&#039;&#039;velocityTarget&#039;&#039;: current velocity of target&lt;br /&gt;
::&#039;&#039;speedInterceptor&#039;&#039;: speed of interceptor&lt;br /&gt;
::&#039;&#039;positionTarget&#039;&#039;: current position of target&lt;br /&gt;
::&#039;&#039;positionInterceptor&#039;&#039;: starting position of interceptor&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getIntKey&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Retrieves the integer value of a specific spawn arg, defaulting to 0.&lt;br /&gt;
::&#039;&#039;key&#039;&#039;: spawnarg name&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getInventoryOverlay&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the default inventory overlay for the player. All other entities will return an invalid value.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getJointAngle&#039;&#039;&#039;(float jointnum); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the angular orientation of the joint in world space.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAnimatedEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getJointHandle&#039;&#039;&#039;(string jointname); ====&lt;br /&gt;
&lt;br /&gt;
:Looks up the number of the specified joint. Returns INVALID_JOINT if the joint is not found.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAnimatedEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getJointPos&#039;&#039;&#039;(float jointnum); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the position of the joint in world space.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAnimatedEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getJumpVelocity&#039;&#039;&#039;(vector pos, float speed, float max_jump_height); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getKey&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Retrieves the value of a specific spawn arg, defaulting to &#039;&#039;.&lt;br /&gt;
::&#039;&#039;key&#039;&#039;: spawnarg name&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getLightInPVS&#039;&#039;&#039;(float falloff, float scaling); ====&lt;br /&gt;
&lt;br /&gt;
:Computes the sum of all light in the PVS of the entity you call this on, and returns a vector with the sum.&lt;br /&gt;
::&#039;&#039;falloff&#039;&#039;: 0: no falloff with distance  0.5: sqrt(linear) falloff	(dist 100 =&amp;gt; 1/10)  1: linear falloff			(dist 100 =&amp;gt; 1/100)  2: square falloff			(dist 100 =&amp;gt; 1/10000) &lt;br /&gt;
::&#039;&#039;scaling&#039;&#039;: factor to scale the distance, can be used to lower/raise distance factor  after the linear or square scaling has been used good looking values are approx: sqrt(linear): 0.01, linear: 0.1, square 1.0&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getLightLevel&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get level (intensity) of a light, &amp;lt;= 0.0 indicates it is off&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idLight&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getLightOrigin&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get the light origin (independent of its visual model)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idLight&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getLightParm&#039;&#039;&#039;(float parmNum); ====&lt;br /&gt;
&lt;br /&gt;
:Gets a shader parameter.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idLight&#039;&#039;, &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getLinearVelocity&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the current linear velocity of this entity. The linear velocity of a physics object is a vector that defines the translation of the center of mass in units per second.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getLinearVelocityB&#039;&#039;&#039;(float id); ====&lt;br /&gt;
&lt;br /&gt;
:Get the linear velocitiy of a particular body Returns (0,0,0) if the body ID is invalid.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAFEntity_Base&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getListenLoc&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Retrieves the location of the listener when leaning.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getLocation&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the idLocation entity corresponding to the entity&#039;s current location. This was player-specific before, but is now available to all entities.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getLocationPoint&#039;&#039;&#039;(vector point); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the idLocation entity corresponding to the specified point&#039;s location.&lt;br /&gt;
::&#039;&#039;point&#039;&#039;: point whose location to check&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;GetLock&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the associated lock of this handle.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CFrobLockHandle&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getLootAmount&#039;&#039;&#039;(float type); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the amount of loot for the given type (e.g. LOOT_GOODS). Pass LOOT_TOTAL to return the sum of all loot types.&lt;br /&gt;
::&#039;&#039;type&#039;&#039;: one of: LOOT_GOLD, LOOT_GOODS, LOOT_JEWELRY, LOOT_TOTAL&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getMainAmbientLight&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the entity of the main ambient light.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMass&#039;&#039;&#039;(float body); ====&lt;br /&gt;
&lt;br /&gt;
:Gets mass of a body for an entity&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMaxHealth&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the max health of this entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getMaxs&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the maximum corner of this entity&#039;s bounding box.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMeleeActPhase&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current melee action phase (holding,recovering,etc).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMeleeActState&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current melee action state (attacking/defending).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMeleeActType&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current melee action type (overhead,thrust,etc.).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMeleeLastActTime&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the melee type of the last attack to hit this actor. Defaults to MELEETYPE_UNBLOCKABLE if we were not hit before.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMeleeLastHitByType&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the game time that the most recent melee action ended (in ms)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMeleeResult&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get the result of the last melee action Follows MELEERESULT_* enum defined in tdm_defs.script&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getMins&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the minimum corner of this entity&#039;s bounding box.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMissionStatistic&#039;&#039;&#039;(string statisticName); ====&lt;br /&gt;
&lt;br /&gt;
:Returns current mission statistic.&lt;br /&gt;
::&#039;&#039;statisticName&#039;&#039;: Can be one of (case insensitive): 	gamePlayTime: gameplay time in seconds 	damageDealt: damage dealt to enemies 	damageReceived: damage received by player 	healthReceived: health received by player 	pocketsPicked: pockets picked by player 	foundLoot: loot found by player 	missionLoot: total loot available in mission 	totalTimePlayerSeen: total time the player was seen by enemies in seconds. Updates only when AI lose sight of player 	numberTimesPlayerSeen: number of times player was seen by enemies 	numberTimesAISuspicious: number of times AI was &#039;observant&#039; or &#039;suspicious&#039;. A single AI passing through both alert levels will add 2 to the score. 	numberTimesAISearched: number of times AI was &#039;investigating&#039; or &#039;searching&#039;. A single AI passing through both alert levels will add 2 to the score. 	sightingScore: sighting score (number of times player was seen * weight) 	stealthScore: stealth score (sighting score + alerts * weights) 	killedByPlayer: number of enemies killed by player 	knockedOutByPlayer: number of enemies knocked out by player 	bodiesFound: number of times enemies have spotted a body 	secretsFound: number of secrets found by the player 	secretsTotal: total number of secrets in the mission &lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMouseGesture&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the results of the last mouse gesture in enum form. (see the definition for MOUSEDIR_* for which numbers correspond to which directions)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getMove&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the movement relative to the player&#039;s view angles from the current user command. vector_x = forward, vector_y = right, vector_z = up&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getMoveAnim&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the name of the player-requested movement anim for a player controlled AI vehicle&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CAIVehicle&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMoveSpeed&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get the movement speed.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMoveTime&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the movement time.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMoveType&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current movetype&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getName&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the name of this entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getNextEnemy&#039;&#039;&#039;(entity lastMatch); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the next enemy that the security camera can see.&lt;br /&gt;
::&#039;&#039;lastMatch&#039;&#039;: search will start after this entity.Use $null_entity or pass an uninitialized entity variable to start a new search.The first result in a new search will be the player, if the camera can see him.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idSecurityCamera&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getNextEntity&#039;&#039;&#039;(string key, string value, entity lastMatch); ====&lt;br /&gt;
&lt;br /&gt;
:Discover all entities in the map. Returns $null_entity when no more found.&lt;br /&gt;
::&#039;&#039;key&#039;&#039;: Optional string: prefix for spawnarg key match. E.g. &amp;quot;target&amp;quot; will match &amp;quot;target&amp;quot;, &amp;quot;target1&amp;quot; etc.&lt;br /&gt;
::&#039;&#039;value&#039;&#039;: Optional string: spawnarg value to match. Can be used independently of &#039;&#039;key&#039;&#039;. If &#039;&#039;key&#039;&#039; is not set, all spawnargs will be checked for the value.&lt;br /&gt;
::&#039;&#039;lastMatch&#039;&#039;: Last match: search will start after this entity. Use $null_entity or pass an uninitialized entity variable to start a new search.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getNextHinderance&#039;&#039;&#039;(string prefix, string lastMatch); ====&lt;br /&gt;
&lt;br /&gt;
:Used to get the next hinderance from a source.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getNextIdleAnim&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:This returns the name of the next idle anim to be played on this AI (used by AnimState scripts).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getNextImmobilization&#039;&#039;&#039;(string prefix, string lastMatch); ====&lt;br /&gt;
&lt;br /&gt;
:Used to get immobilization from a source. Warning: Not a finalized version. It&#039;s subject to change, so use it at your own risk.)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getNextInvItem&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Cycles the standard cursor to the next inventory item. Returns the item entity pointed to after the operation is complete.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getNextKey&#039;&#039;&#039;(string prefix, string lastMatch); ====&lt;br /&gt;
&lt;br /&gt;
:Searches for the name of a spawn arg that matches the prefix.  For example, passing in &amp;quot;attack_target&amp;quot; matches &amp;quot;attack_target1&amp;quot;, &amp;quot;attack_targetx&amp;quot;, &amp;quot;attack_target_enemy&amp;quot;,  etc. The returned string is the name of the key which can then be passed into functions like getKey() to lookup the value of that spawn arg.  This is useful for when you have multiple values to look up, like when you target multiple objects.  To find the next matching key, pass in the previous result and the next key returned will be the first one that matches after the previous result. Pass in &amp;quot;&amp;quot; to get the first match. Passing in a non-existent key is the same as passing in &amp;quot;&amp;quot;. Returns &amp;quot;&amp;quot; when no  more keys match.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getNextTurnHinderance&#039;&#039;&#039;(string prefix, string lastMatch); ====&lt;br /&gt;
&lt;br /&gt;
:Get the next hinderance on the view turning from a source&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getNumAttachments&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Return the number of attachments on an AI. Used to iterate through the attachments if desired.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getNumBodies&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of bodies in the AF. If the AF physics pointer is NULL, it returns 0.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAFEntity_Base&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getNumMeleeWeapons&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of melee weapons attached to an actor. This refers to the TDM-style attachments with the spawnarg &#039;is_weapon_melee&#039; set to &#039;1&#039;.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getNumRangedWeapons&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of ranged weapons attached to an actor. This refers to the TDM-style attachments with the spawnarg &#039;is_weapon_ranged&#039; set to &#039;1&#039;.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getObjectiveComp&#039;&#039;&#039;(float ObjNum, float CompNum); ====&lt;br /&gt;
&lt;br /&gt;
:Used to get the state of custom objective components&lt;br /&gt;
::&#039;&#039;ObjNum&#039;&#039;: Starts counting at 1&lt;br /&gt;
::&#039;&#039;CompNum&#039;&#039;: Starts counting at 1&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getObjectiveState&#039;&#039;&#039;(float ObjNum); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current state of the objective with the number ObjNum.  State is one of the following: OBJ_INCOMPLETE = 0, OBJ_COMPLETE = 1, OBJ_INVALID = 2, OBJ_FAILED = 3&lt;br /&gt;
::&#039;&#039;ObjNum&#039;&#039;: Starts counting at 1&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getObjectiveVisible&#039;&#039;&#039;(float ObjNum); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current visibility of the objective with the number ObjNum.&lt;br /&gt;
::&#039;&#039;ObjNum&#039;&#039;: Starts counting at 1&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getObservationPosition&#039;&#039;&#039;(vector targetPoint, float visualAcuityZeroToOne); ====&lt;br /&gt;
&lt;br /&gt;
:This event is used to get a position that the AI can move to observe a  given position.  It is useful for looking at hiding spots that can&#039;t be reached, and performing other investigation functions.  Returns a world position from which the observation can take place. Returns the current AI origin if no such point is found.  @sideEffect This uses the AI_DEST_UNREACHABLE flag variable  to indicate if a point was found. It will be true if none was found, false if one was found.&lt;br /&gt;
::&#039;&#039;targetPoint&#039;&#039;: the world position to be observed&lt;br /&gt;
::&#039;&#039;visualAcuityZeroToOne&#039;&#039;: the visual acuity of the AI on a scale of 0.0 to 1.0 where 0.0 is blind and 1.0 is perfect vision.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getObstacle&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the obstacle in the character&#039;s path&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getOrigin&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current position of this entity (relative to bind parent if any).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getOwner&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the owning entity&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getPainAnim&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the name of the pain animation.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getPersistentFloat&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the floating point value for the given persistent arg&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getPersistentString&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the string for the given persistent arg&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getPersistentVector&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the vector for the given persistent arg&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getPortAISoundLoss&#039;&#039;&#039;(float handle); ====&lt;br /&gt;
&lt;br /&gt;
:AI sound propagation scriptfunction on the sys object&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getPortalHandle&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the portal handle.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPortalEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getPortPlayerSoundLoss&#039;&#039;&#039;(float handle); ====&lt;br /&gt;
&lt;br /&gt;
:Player sound loss  scriptfunction on the sys object&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getPortSoundLoss&#039;&#039;&#039;(float handle); ====&lt;br /&gt;
&lt;br /&gt;
:Sound propagation scriptfunction on the sys object&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getPrevInvItem&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Cycles the standard cursor to the previous inventory item. Returns the item entity pointed to after the operation is complete.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getPreviousWeapon&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns weaponX where X is the number of the weapon the player was previously holding.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getPrime&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Event called using vine.*()&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;tdmVine&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getProjectileState&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the current state of the projectile. States are defined in tdm_defs.script&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idProjectile&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getProjMass&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Getter for projectile result variable&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CProjectileResult&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getRadius&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the light radius.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idLight&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getRandomTarget&#039;&#039;&#039;(string entity_type); ====&lt;br /&gt;
&lt;br /&gt;
:Finds a random targeted entity of the specified type.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getReachableEntityPosition&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the position of the entity within the AAS if possible, otherwise just the entity position.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getRelation&#039;&#039;&#039;(float team1, float team2); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getRelationEnt&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;GetResponseEntity&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the entity which should take the response. Some entities like AI heads are not responding themselves to stims, but relay it to another entity (i.e. the bodies they&#039;re attached to).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getSecurityCameraState&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the security camera&#039;s state. 1 = unalerted, 2 = suspicious, 3 = fully alerted, 4 = inactive, 5 = destroyed.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idSecurityCamera&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getShader&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the shader name used by the light.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idLight&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getShaderParm&#039;&#039;&#039;(float parm); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the value of the specified shader parm.&lt;br /&gt;
::&#039;&#039;parm&#039;&#039;: shader parm index&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getShouldered&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the currently shouldered body, otherwise $null_entity. See also getDragged(), getGrabbed() and getFrobbed().&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getSize&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the size of this entity&#039;s bounding box.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getSndDir&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:ai hearing of sound &lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getSoundLoss&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the sound loss value (dB).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPortalEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getSoundVolume&#039;&#039;&#039;(string soundName); ====&lt;br /&gt;
&lt;br /&gt;
:Get the volume of the sound to play.&lt;br /&gt;
::&#039;&#039;soundName&#039;&#039;: the name of the sound&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getSpotLight&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the spotlight used by the camera. Returns null_entity if none is used.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idSecurityCamera&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getState&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the current state.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getStruckEnt&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Getter for projectile result variable&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CProjectileResult&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getSurfNormal&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Getter for projectile result variable&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CProjectileResult&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getSurfType&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Getter for projectile result variable&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CProjectileResult&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getTactEnt&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:ai sense of touch&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getTalkTarget&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the entity (player) trying to talk to the character&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getTarget&#039;&#039;&#039;(float num); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the requested target entity.&lt;br /&gt;
::&#039;&#039;num&#039;&#039;: The target number. Starts at 0.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getTDMVersion&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get the current TDM version as integer. The value will be 108 for v1.08, 109 for v1.09 and 200 for v2.00 etc.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getTeam&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current team number.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getTicsPerSecond&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:returns the number of game frames per second.  this is not related to renderer frame rate.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getTime&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current game time in seconds.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getTraceBody&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of the body part of the entity which was hit during the last call to trace or tracePoint&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getTraceEndPos&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the position the trace stopped due to a collision with solid geometry during the last call to trace or tracePoint&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getTraceEntity&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a reference to the entity which was hit during the last call to trace or tracePoint&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getTraceFraction&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the fraction of movement completed during the last call to trace or tracePoint.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getTraceJoint&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of the skeletal joint closest to the location on the entity which was hit during the last call to trace or tracePoint&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getTraceNormal&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the normal of the hit plane during the last call to trace or tracePoint&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getTraceSurfType&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the type of the surface (i.e. metal, snow) which was hit during the last call to trace or tracePoint&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getTurnDelta&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getTurnHinderance&#039;&#039;&#039;(string source); ====&lt;br /&gt;
&lt;br /&gt;
:* Get the hinderance on the view turning from a source&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getTurnRate&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the rate the character turns.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getTurretState&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the turret&#039;s state.  0 = passive: no active security cameras connected. 1 = unalerted, 2 = suspicious, 3 = fully alerted, 4 = power off, 5 = destroyed.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idTurret&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getVectorKey&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Retrieves the vector value of a specific spawn arg, defaulting to &#039;0 0 0&#039;.&lt;br /&gt;
::&#039;&#039;key&#039;&#039;: spawnarg name&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getVectorToIdealOrigin&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the vector from where the AI is to where he ideally should be&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getViewAngles&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the player view angles.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getVinePlantLoc&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Event important to the growing of vines from vine arrows&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getVinePlantNormal&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Event important to the growing of vines from vine arrows&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getVisDir&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns position of the last visual alert.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getWeaponEntity&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the entity for the player&#039;s weapon&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getWorldModel&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the entity that controls the world model&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getWorldOrigin&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current world-space position of this entity (regardless of any bind parent).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;gib&#039;&#039;&#039;(string damageDefName); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAFEntity_Gibbable&#039;&#039;, &#039;&#039;idMoveableItem&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;giveHealthPool&#039;&#039;&#039;(float amount); ====&lt;br /&gt;
&lt;br /&gt;
:This increases/decreases the healthpool of the player by the given amount. The healthpool is gradually decreased over time, healing (damaging?) the player.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;handleMissionEvent&#039;&#039;&#039;(entity objEnt, float eventType, string argument); ====&lt;br /&gt;
&lt;br /&gt;
:Generic interface for passing on mission events from scripts to the SDK. Available since TDM 1.02&lt;br /&gt;
::&#039;&#039;objEnt&#039;&#039;: the entity that triggered this event (e.g. a readable)&lt;br /&gt;
::&#039;&#039;eventType&#039;&#039;: a numeric identifier (enumerated both in MissionData.h and tdm_defs.script) specifying the type of event&lt;br /&gt;
::&#039;&#039;argument&#039;&#039;: an optional string parameter, eventtype-specific.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;hasAnim&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true when an entity has a specific animation.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;hasEnemies&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the actor has one or more enemies.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;hasFunction&#039;&#039;&#039;(string functionName); ====&lt;br /&gt;
&lt;br /&gt;
:checks if an entity&#039;s script object has a specific function&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;hasInvItem&#039;&#039;&#039;(entity item); ====&lt;br /&gt;
&lt;br /&gt;
:Tests whether the player has the specified item entity in his inventory.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;hasSeenEvidence&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:This returns 1 when the AI has seen evidence of intruders before (an enemy, a body...)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;heal&#039;&#039;&#039;(string healDefName, float healScale); ====&lt;br /&gt;
&lt;br /&gt;
:Heals the entity this is called on using the specified healing entityDef. Returns 1 if the entity could be healed, 0 otherwise (if the entity is already at full health, for ex.)&lt;br /&gt;
::&#039;&#039;healDefName&#039;&#039;: the name of the entityDef containing the healing information (e.g. &amp;quot;heal_potion&amp;quot;)&lt;br /&gt;
::&#039;&#039;healScale&#039;&#039;: the scaling value to be applied to the healAmount found in the healEntityDef&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;heldEntity&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the entity currently being held, or $null_entity if the player&#039;s hands are empty.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;hide&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Makes this entity invisible.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;holdEntity&#039;&#039;&#039;(entity entity); ====&lt;br /&gt;
&lt;br /&gt;
:Forces the player to hold an entity (e.g. puts it into the grabber). Drops whatever is in the player&#039;s hands if $null_entity is passed to it. Returns 1 if successful, 0 if not.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;idleAnim&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Plays the given idle animation on the given channel.  Returns false if anim doesn&#039;t exist.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ignoreDamage&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:The AI can no longer take damage.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;inAnimState&#039;&#039;&#039;(float channel, string stateFunc); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the given animation state script function is currently used for the given channel.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;influenceActive&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Checks if an influence is active&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;inPVS&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns non-zero if this entity is in PVS. For lights, it will return true when the light&#039;s bounding box is in PVS, even though the light may not actually be in PVS. (an unmoved shadowcasting light may not be visible to PVS areas its bounding box intersects with)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isAirborne&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Checks whether the player is in the air.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isAtRest&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if object is not moving&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMoveable&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isDroppable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get whether an item may be dropped from the inventory&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isEnemy&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the given entity is an enemy.&lt;br /&gt;
::&#039;&#039;ent&#039;&#039;: The entity in question&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isEntityHidden&#039;&#039;&#039;(entity ent, float f_sightThreshold); ====&lt;br /&gt;
&lt;br /&gt;
:This is an alternate version of canSee, using FOV, distance and lighting.&lt;br /&gt;
::&#039;&#039;f_sightThreshold&#039;&#039;: goes from 0.0 (entity visible in complete darkness) to 1.0 (entity only visible if completely lit up).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isFriend&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the given entity is a friend.&lt;br /&gt;
::&#039;&#039;ent&#039;&#039;: The entity in question&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isFrobable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get whether the entity is frobable&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isHidden&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:checks if the entity&#039;s model is invisible.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isHilighted&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if entity is currently frobhilighted.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isInLiquid&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns 1 if the entity is in or touching a liquid.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isInvisible&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isLeaning&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get whether the player is leaning&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isLight&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;IsLocked&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true (nonzero) if the mover is currently locked.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CBinaryFrobMover&#039;&#039;, &#039;&#039;CFrobLock&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isMoving&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if a mover is moving&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isNeutral&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the given entity is neutral.&lt;br /&gt;
::&#039;&#039;ent&#039;&#039;: The entity in question&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;IsOpen&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true (nonzero) if the mover is open, which is basically the same as &amp;quot;not closed&amp;quot;. A mover is considered closed when it is at its close position.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CBinaryFrobMover&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isPeekLeaning&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get whether the player is peek leaning (against a keyhole or crack)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;IsPickable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true (nonzero) if this frobmover is pickable.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CBinaryFrobMover&#039;&#039;, &#039;&#039;CFrobLock&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isPlayerResponsibleForDeath&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the player was responsible for the AI&#039;s caller&#039;s death.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isRotating&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if a mover is rotating&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isType&#039;&#039;&#039;(string spawnclass); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if this entity is of the given type.&lt;br /&gt;
::&#039;&#039;spawnclass&#039;&#039;: spawn class name&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isVineFriendly&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Vine-arrow event&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CProjectileResult&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;kickObstacles&#039;&#039;&#039;(entity kickEnt, float force); ====&lt;br /&gt;
&lt;br /&gt;
:Kicks any obstacle in the character&#039;s path.&lt;br /&gt;
::&#039;&#039;kickEnt&#039;&#039;: pass in $null_entity if you don&#039;t have a specific entity to kick&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;kill&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Kills the monster.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;killthread&#039;&#039;&#039;(string threadName); ====&lt;br /&gt;
&lt;br /&gt;
:Kills all threads with the specified name&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;KO_Knockout&#039;&#039;&#039;(entity inflictor); ====&lt;br /&gt;
&lt;br /&gt;
:AI knockout&lt;br /&gt;
::&#039;&#039;inflictor&#039;&#039;: is the entity causing the knockout, can be the $null_entity&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;launch&#039;&#039;&#039;(vector start, vector dir, vector velocity); ====&lt;br /&gt;
&lt;br /&gt;
:Launches the projectile from &amp;lt;start&amp;gt; in direction &amp;lt;dir&amp;gt; with the given &amp;lt;velocity&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idProjectile&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;launchGuided&#039;&#039;&#039;(vector start, vector dir, vector velocity, entity target); ====&lt;br /&gt;
&lt;br /&gt;
:Launches the guided projectile from &amp;lt;start&amp;gt; in direction &amp;lt;dir&amp;gt; with the given &amp;lt;velocity&amp;gt; at &amp;lt;target entity&amp;gt;. Pass $null_entity to fire an unguided projectile.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idGuidedProjectile&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;launchMissile&#039;&#039;&#039;(vector origin, vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the projectile entity&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;launchMissiles&#039;&#039;&#039;(string projectilename, string sound, string launchbone, string targetbone, float numshots, float framedelay); ====&lt;br /&gt;
&lt;br /&gt;
:Launches a projectile.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAnimated&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;launchProjectiles&#039;&#039;&#039;(float num_projectiles, float spread, float fuseOffset, float launchPower, float dmgPower); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;leftFoot&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Changes to left foot and plays footstep sound.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;, &#039;&#039;idAnimated&#039;&#039;, &#039;&#039;idTestModel&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;loadExternalData&#039;&#039;&#039;(string declFile, string prefix); ====&lt;br /&gt;
&lt;br /&gt;
:Load an external xdata declaration.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;locateEnemy&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Updates the last known position of the enemy independent from whether or not the enemy is visible.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Lock&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Locks the mover. Calls to Open() will not succeed after this call. &lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CBinaryFrobMover&#039;&#039;, &#039;&#039;CFrobLock&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;log&#039;&#039;&#039;(float x); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the log of the given argument.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;logString&#039;&#039;&#039;(float logClass, float logType, string output); ====&lt;br /&gt;
&lt;br /&gt;
:This is the script counterpart to DM_LOG&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;lookAt&#039;&#039;&#039;(entity focusEntity, float duration); ====&lt;br /&gt;
&lt;br /&gt;
:Aims the character&#039;s eyes and head toward an entity for a period of time.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;lookAtAngles&#039;&#039;&#039;(float yawAngleClockwise, float pitchAngleUp, float rollAngle, float durationInSeconds); ====&lt;br /&gt;
&lt;br /&gt;
:A look at event that just looks at a set of angles relative  to the current body facing of the AI. This method is just like the vanilla Doom3 lookAt and lookAtEnemy methods, but it looks at the specified angles from the current body facing of the AI.&lt;br /&gt;
::&#039;&#039;yawAngleClockwise&#039;&#039;: Negative angles are to the left of  the AIs body and positive angles are to the right.&lt;br /&gt;
::&#039;&#039;pitchAngleUp&#039;&#039;: Negative values are down and positive values are up  where down and up are defined by the body axis.&lt;br /&gt;
::&#039;&#039;rollAngle&#039;&#039;: This is currently unused and does nothing.&lt;br /&gt;
::&#039;&#039;durationInSeconds&#039;&#039;: The duration to look in seconds.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;lookAtEnemy&#039;&#039;&#039;(float duration); ====&lt;br /&gt;
&lt;br /&gt;
:Aims the character&#039;s eyes and head toward the current enemy for a period of time.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;lookAtPosition&#039;&#039;&#039;(vector lookAtWorldPosition, float durationInSeconds); ====&lt;br /&gt;
&lt;br /&gt;
:This method is just like the vanilla Doom3 lookAt and lookAtEnemy methods, but instead of looking at an entity, it looks at a position in worldspace.  That is, it turns the head of the AI to look at the position.&lt;br /&gt;
::&#039;&#039;lookAtWorldPosition&#039;&#039;: position in space to look at&lt;br /&gt;
::&#039;&#039;durationInSeconds&#039;&#039;: duration to look in seconds&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;lookupReplacementAnim&#039;&#039;&#039;(string anim); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current replacement animation for &amp;quot;anim&amp;quot;. Returns empty if no replacement anim &lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;markUsed&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Disables the combat node if &amp;quot;use_once&amp;quot; is set on the entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idCombatNode&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;max&#039;&#039;&#039;(float x, float y); ====&lt;br /&gt;
&lt;br /&gt;
:returns the larger of two provided float values.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;melee&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;meleeActionFinished&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Called when the animation for the melee action has finished.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;meleeActionHeld&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Called when the melee action reaches the &amp;quot;hold&amp;quot; point.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;meleeActionReleased&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Called when the melee action is released from the hold point.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;meleeAttackStarted&#039;&#039;&#039;(float attType); ====&lt;br /&gt;
&lt;br /&gt;
:Registers the start of a given melee attack Intended to be called from a script that also starts the animation&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;meleeAttackToJoint&#039;&#039;&#039;(string joint, string damageDef); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;meleeBestParry&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the melee type integer of the best parry given the enemy attacks at the time If no attacking enemy is found, returns default of MELEETYPE_RL Follows MELEETYPE_* enum defined in tdm_defs.script&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;meleeNameForNum&#039;&#039;&#039;(float num); ====&lt;br /&gt;
&lt;br /&gt;
:Converts a melee type integer to a string name suffix Used for finding the right animation for a given type, etc. Possible names are, in order: &amp;quot;Over, LR, RL, Thrust, General&amp;quot; Where general blocks all attacks types except unblockable&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;meleeParryStarted&#039;&#039;&#039;(float parType); ====&lt;br /&gt;
&lt;br /&gt;
:Registers the start of a given melee parry Intended to be called from a script that also starts the animation&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;min&#039;&#039;&#039;(float x, float y); ====&lt;br /&gt;
&lt;br /&gt;
:returns the smaller of two provided float values.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;missionFailed&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;missionSuccess&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;mouseGestureFinished&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the player is not currently doing a mouse gesture.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;move&#039;&#039;&#039;(float angle, float distance); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a translation with the given distance in the given yaw direction. Uses the current speed/time and acceleration and deceleration settings.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveOutOfRange&#039;&#039;&#039;(entity ent, float range); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveSound&#039;&#039;&#039;(string sound); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the sound to be played when the moving.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;moveStatus&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveTo&#039;&#039;&#039;(entity targetEntity); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a translation to the position of an entity. Uses the current speed/time and acceleration and deceleration settings.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveToAttackPosition&#039;&#039;&#039;(entity ent, string attack_anim); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveToCover&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveToCoverFrom&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveToEnemy&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveToEnemyHeight&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveToEntity&#039;&#039;&#039;(entity destination); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveToPos&#039;&#039;&#039;(vector pos); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a translation to an absolute position. Uses the current speed/time and acceleration and deceleration settings.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveToPosition&#039;&#039;&#039;(vector position); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;music&#039;&#039;&#039;(string shaderName); ====&lt;br /&gt;
&lt;br /&gt;
:Starts playing background music.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;muzzleFlash&#039;&#039;&#039;(string jointname); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;netEndReload&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;netReload&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;nextEnemy&#039;&#039;&#039;(entity lastEnemy); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the next enemy the actor has acquired.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;nextWeapon&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;noShadows&#039;&#039;&#039;(float noShadows); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the noShadow property on the entity to true/false, turning shadowcasting on or off for this entity.&lt;br /&gt;
::&#039;&#039;noShadows&#039;&#039;: 1 = disable shadows, 0 = enable shadows&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;noShadowsDelayed&#039;&#039;&#039;(float noShadows, float delay); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the noShadow property on the entity to true/false after delay in ms, turning shadows cast by this entity on or off.&lt;br /&gt;
::&#039;&#039;noShadows&#039;&#039;: 1 = disable shadows, 0 = enable shadows&lt;br /&gt;
::&#039;&#039;delay&#039;&#039;: delay in ms&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;numBindChildren&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of bound entities lower down in the bind chain than this entity, but be sure to give it the topmost bindmaster&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;numSmokeEmitters&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the # of emitters defined by &#039;smokeParticleSystem&#039; in the entitydef&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;numTargets&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of entities this entity has targeted.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;objectiveCompUnlatch&#039;&#039;&#039;(float ObjNum, float CompNum); ====&lt;br /&gt;
&lt;br /&gt;
:Unlatch an irreversible objective component that has latched into a state&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;objectiveUnlatch&#039;&#039;&#039;(float ObjNum); ====&lt;br /&gt;
&lt;br /&gt;
:Unlatch an irreversible objective that has latched into a state&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Off&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Switches the emitter off.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idFuncEmitter&#039;&#039;, &#039;&#039;idLight&#039;&#039;, &#039;&#039;idSecurityCamera&#039;&#039;, &#039;&#039;idSound&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;offsetRelation&#039;&#039;&#039;(float team1, float team2, float val); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;On&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Switches the emitter on.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idFuncEmitter&#039;&#039;, &#039;&#039;idLight&#039;&#039;, &#039;&#039;idSecurityCamera&#039;&#039;, &#039;&#039;idSound&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;onSignal&#039;&#039;&#039;(float signalNum, entity ent, string functionName); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a script callback function for when the given signal is raised on the given entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Open&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Opens the frobmover, regardless of its previous state. The mover will not move when it&#039;s locked. &lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CBinaryFrobMover&#039;&#039;, &#039;&#039;CFrobLock&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;OpenDoor&#039;&#039;&#039;(float master); ====&lt;br /&gt;
&lt;br /&gt;
:The OpenDoor method is necessary to give the FrobDoorHandles a  &amp;quot;low level&amp;quot; open routine. The CFrobDoor::Open() call is re-routed to the FrobDoorHandle::Tap() method, so there must be a way to actually let the door open. Which is what this method does.  Note: Shouldn&#039;t be called directly by scripters, call handle-&amp;gt;Tap() instead. Unless you know what you&#039;re doing.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CFrobDoor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;openPortal&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Opens the renderer portal associated with this mover.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;, &#039;&#039;idMover_Binary&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Operate&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Call this to operate this entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CFrobButton&#039;&#039;, &#039;&#039;CFrobLever&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;overrideAnim&#039;&#039;&#039;(float channel); ====&lt;br /&gt;
&lt;br /&gt;
:Disables the animation currently playing on the given channel and syncs the animation with the animation of the nearest animating channel.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;pause&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Pauses the current thread.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;pauseAnim&#039;&#039;&#039;(float channel, float bPause); ====&lt;br /&gt;
&lt;br /&gt;
:Pause all animations playing on the given channel. NOTE: Can also be used used by idWeapons&lt;br /&gt;
::&#039;&#039;bPause&#039;&#039;: true = pause, false = unpause&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;, &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;pauseGame&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Pauses the game. This should only be called for threads that are explicitly maintained by a special SDK method, because ordinary threads won&#039;t get executed during g_stopTime == true. Note: This is used by the objective GUI threads. Note: Must be called on the player entity, not the sys entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;performRelight&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Deal with doused lights.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;playAndLipSync&#039;&#039;&#039;(string soundName, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Play the given sound, using the given lipsync animation. The lipsync animation should just be a simple non-loopable animation of the mouth opening in a linear fashion. The code will select individual frames from this to construct a simple lipsyncing effect which is in time with the sound.  Returns the length of the played sound in seconds.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;playAnim&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Do not use, this is part of TDM&#039;s internal mechanics. Use playCustomAnim() on AI.in scripts instead of this. Plays the given animation on the given channel. Returns false if anim doesn&#039;t exist.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;, &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;playCustomAnim&#039;&#039;&#039;(string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Plays the given animation on legs and torso. Returns false if anim doesn&#039;t exist.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;playCycle&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Continuously repeats the given animation on the given channel.  Returns false if anim doesn&#039;t exist.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;, &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;playStartSound&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;pointInLiquid&#039;&#039;&#039;(vector point, entity ignoreEntity); ====&lt;br /&gt;
&lt;br /&gt;
:Checks if a point is in a liquid, returns 1 if this is the case.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;pointIsInBounds&#039;&#039;&#039;(vector point, vector mins, vector maxs); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the point is within the bounds specified.&lt;br /&gt;
::&#039;&#039;point&#039;&#039;: test whether this point is in the bounds&lt;br /&gt;
::&#039;&#039;mins&#039;&#039;: minimal corner of the bounds&lt;br /&gt;
::&#039;&#039;maxs&#039;&#039;: maximal corner of the bounds&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;pow&#039;&#039;&#039;(float x, float y); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the power of x to y.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;preBurn&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;predictEnemyPos&#039;&#039;&#039;(float time); ====&lt;br /&gt;
&lt;br /&gt;
:Tries to predict the player&#039;s movement based on the AAS and his direction of movement.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;preventPain&#039;&#039;&#039;(float duration); ====&lt;br /&gt;
&lt;br /&gt;
:Prevents any pain animation from being played for the given time in seconds.&lt;br /&gt;
::&#039;&#039;duration&#039;&#039;: time in seconds&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;print&#039;&#039;&#039;(string text); ====&lt;br /&gt;
&lt;br /&gt;
:Prints the given string to the console.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;println&#039;&#039;&#039;(string text); ====&lt;br /&gt;
&lt;br /&gt;
:Prints the given line to the console.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;processBlindStim&#039;&#039;&#039;(entity stimSource, float skipVisibilityCheck); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;processVisualStim&#039;&#039;&#039;(entity stimSource); ====&lt;br /&gt;
&lt;br /&gt;
:Use this call to let the AI react to a visual stim (coming from the source entity).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;projectDecal&#039;&#039;&#039;(vector traceOrigin, vector traceEnd, entity passEntity, string decal, float decalSize, float angle); ====&lt;br /&gt;
&lt;br /&gt;
:Performs a trace from the specified origin and end positions, then projects a decal in that direction.&lt;br /&gt;
::&#039;&#039;traceOrigin&#039;&#039;: Start of the trace.&lt;br /&gt;
::&#039;&#039;traceEnd&#039;&#039;: End of the trace.&lt;br /&gt;
::&#039;&#039;passEntity&#039;&#039;: This entity will be considered non-solid by the trace.&lt;br /&gt;
::&#039;&#039;decal&#039;&#039;: Decal to be projected.&lt;br /&gt;
::&#039;&#039;decalSize&#039;&#039;: Size of the decal quad.&lt;br /&gt;
::&#039;&#039;angle&#039;&#039;: Angle of the decal quad.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;propagateSound&#039;&#039;&#039;(string soundName, float propVolMod, float msgTag); ====&lt;br /&gt;
&lt;br /&gt;
:Generates a propagated sound&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;propSound&#039;&#039;&#039;(string name); ====&lt;br /&gt;
&lt;br /&gt;
:Sound propagation scriptfunctions on all entities propagate a sound directly without playing an audible sound&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;propSoundMod&#039;&#039;&#039;(string name, float volMod); ====&lt;br /&gt;
&lt;br /&gt;
:propagate a sound directly with a volume modifier&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;pushPointIntoAAS&#039;&#039;&#039;(vector post); ====&lt;br /&gt;
&lt;br /&gt;
:Tries to push the point into a valid AAS area&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;pushState&#039;&#039;&#039;(string stateName); ====&lt;br /&gt;
&lt;br /&gt;
:Pushes the state with the given name, current one is postponed.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;radiusDamage&#039;&#039;&#039;(vector origin, entity inflictor, entity attacker, entity ignore, string damageDefName, float dmgPower); ====&lt;br /&gt;
&lt;br /&gt;
:damages entities within a radius defined by the damageDef.  inflictor is the entity  causing the damage and can be the same as the attacker (in the case   of projectiles, the projectile is the inflictor, while the attacker is the character  that fired the projectile).&lt;br /&gt;
::&#039;&#039;inflictor&#039;&#039;: the entity causing the damage&lt;br /&gt;
::&#039;&#039;ignore&#039;&#039;: an entity to not cause damage to&lt;br /&gt;
::&#039;&#039;dmgPower&#039;&#039;: scales the damage (for cases where damage is dependent on time)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;radiusDamageFromJoint&#039;&#039;&#039;(string jointname, string damageDef); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;random&#039;&#039;&#039;(float range); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a random value X where 0 &amp;lt;= X &amp;lt; range.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;randomPath&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;, &#039;&#039;idPathCorner&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;randomTarget&#039;&#039;&#039;(string ignoreName); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a random targeted entity. Pass in an entity name to skip that entity.&lt;br /&gt;
::&#039;&#039;ignoreName&#039;&#039;: the name of an entity to ignore&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;rangedThreatTo&#039;&#039;&#039;(entity target); ====&lt;br /&gt;
&lt;br /&gt;
:Could this entity threaten the given (target) entity from a distance?&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;readLightgemModifierFromWorldspawn&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;reAttachToCoords&#039;&#039;&#039;(string attName, string joint, vector offset, vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Reattach an existing attachment&lt;br /&gt;
::&#039;&#039;attName&#039;&#039;: the name of the attachment we want to reattach. &lt;br /&gt;
::&#039;&#039;joint&#039;&#039;: the name of the joint to attach to&lt;br /&gt;
::&#039;&#039;offset&#039;&#039;: the translation offset from joint&lt;br /&gt;
::&#039;&#039;angles&#039;&#039;: a (pitch, yaw, roll) angle vector that defines the rotation  of the attachment relative to the joint&#039;s orientation&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;reAttachToPos&#039;&#039;&#039;(string attName, string position); ====&lt;br /&gt;
&lt;br /&gt;
:Reattach an existing attachment to a named attachment position. Example: reAttachToPos( melee_weapon, right_hand_held )&lt;br /&gt;
::&#039;&#039;attName&#039;&#039;: the name of the attachment we want to reattach.&lt;br /&gt;
::&#039;&#039;position&#039;&#039;: the new position we want to attach it to.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;reloadTorchReplacementAnims&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:If actor has a torch, reload the torch&#039;s replacement anims.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;remove&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Removes the entity from the game. For AI, use kill() instead.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idClass&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;removeBinds&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Removes all attached entities from the game&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;removeFrobPeer&#039;&#039;&#039;(entity peer); ====&lt;br /&gt;
&lt;br /&gt;
:Removes the passed entity as a frob peer.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;removeInitialSplineAngles&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Subtracts the initial spline angles to maintain the initial orientation of the mover.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;removeKey&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Removes a key from an object&#039;s spawnargs, so things like getNextKey() don&#039;t retrieve it.&lt;br /&gt;
::&#039;&#039;key&#039;&#039;: the spawnarg to remove&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;removeReplacementAnim&#039;&#039;&#039;(string anim); ====&lt;br /&gt;
&lt;br /&gt;
:Removes the replacement for the given &amp;quot;anim&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;removeTarget&#039;&#039;&#039;(entity target); ====&lt;br /&gt;
&lt;br /&gt;
:Remove a target from this entity.&lt;br /&gt;
::&#039;&#039;target&#039;&#039;: the entity to remove from the targets&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;replaceInvItem&#039;&#039;&#039;(entity oldItem, entity newItem); ====&lt;br /&gt;
&lt;br /&gt;
:Replaces the entity &amp;lt;oldItem&amp;gt; with &amp;lt;newItem&amp;gt; in the inventory, while keeping &amp;lt;oldItem&amp;gt;&#039;s inventory position intact.  Note: The position guarantee only applies if &amp;lt;oldItem&amp;gt; and newItem  share the same category. If the categories are different, the position of &amp;lt;newItem&amp;gt; is likely to be different than the one of &amp;lt;oldItem&amp;gt;.  Note that &amp;lt;oldItem&amp;gt; will be removed from the inventory.  If &amp;lt;newItem&amp;gt; is the $null_entity, &amp;lt;oldItem&amp;gt; is just removed and no replacement happens.  Returns 1 if the operation was successful, 0 otherwise.&lt;br /&gt;
::&#039;&#039;newItem&#039;&#039;: can be $null_entity&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ResetTimer&#039;&#039;&#039;(float stimId); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;resetWeaponProjectile&#039;&#039;&#039;(string weaponName); ====&lt;br /&gt;
&lt;br /&gt;
:Reloads the original projectile def name from the weaponDef. Used to revert a change made by the event changeWeaponProjectile().&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;resetZoom&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Cancels any pending zoom transitions and resets the FOV to normal.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;reskinCollisionModel&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:For use after setSkin() on moveables and static models, if the CM needs to be refreshed to update surface properties after a skin change. CM will be regenerated from the original model file with the new skin.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;respawn&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Respawn&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idItem&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ResponseAdd&#039;&#039;&#039;(float type); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ResponseAllow&#039;&#039;&#039;(float type, entity responder); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ResponseEnable&#039;&#039;&#039;(float type, float state); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
::&#039;&#039;state&#039;&#039;: 0 = disabled, 1 = enabled&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ResponseIgnore&#039;&#039;&#039;(float type, entity responder); ====&lt;br /&gt;
&lt;br /&gt;
:This functions must be called on the stim entity. It will add the response to the ignore list, so that subsequent stims, should not trigger the stim anymore.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ResponseRemove&#039;&#039;&#039;(float type); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ResponseSetAction&#039;&#039;&#039;(float type, string action); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ResponseTrigger&#039;&#039;&#039;(entity source, float stimType); ====&lt;br /&gt;
&lt;br /&gt;
:Fires a response on this entity, without a stim (a stand-alone response, so to say)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;restartPatrol&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;RestartTimer&#039;&#039;&#039;(float stimId); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;restoreAddedEnts&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAFEntity_Base&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;restoreMove&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;restorePosition&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns this entity to the position stored in the &amp;quot;origin&amp;quot; spawn arg. This is the position the entity was spawned in unless the &amp;quot;origin&amp;quot; key is changed. Note that there is no guarantee that the entity won&#039;t be stuck in another entity when moved, so care should be taken to make sure that isn&#039;t possible.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;rightFoot&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Changes to right foot and plays footstep sound.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;, &#039;&#039;idAnimated&#039;&#039;, &#039;&#039;idTestModel&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ropeRemovalCleanup&#039;&#039;&#039;(entity ropeEnt); ====&lt;br /&gt;
&lt;br /&gt;
:Called when rope arrow ropes are removed, removes stale pointers on the player object.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;rotate&#039;&#039;&#039;(vector angleSpeed); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a rotation with the given angular speed. Uses the current speed/time and acceleration and deceleration settings.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;rotateDownTo&#039;&#039;&#039;(float axis, float angle); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a rotation about the given axis by decreasing the current angle towards the given angle. Uses the current speed/time and acceleration and deceleration settings.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;rotateOnce&#039;&#039;&#039;(vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a rotation towards the current angles plus the given Euler angles. Uses the current speed/time and acceleration and deceleration settings.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;rotateTo&#039;&#039;&#039;(vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a rotation towards the given Euler angles. Uses the current speed/time and acceleration and deceleration settings.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;rotateUpTo&#039;&#039;&#039;(float axis, float angle); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a rotation about the given axis by increasing the current angle towards the given angle. Uses the current speed/time and acceleration and deceleration settings.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;saveConDump&#039;&#039;&#039;(string cmd, string cmd); ====&lt;br /&gt;
&lt;br /&gt;
:Saves condump into FM directory; first argument is appended to dump filename, everything before last occurence of second argument is removed&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;saveGame&#039;&#039;&#039;(string filename); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;saveMove&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;say&#039;&#039;&#039;(string text); ====&lt;br /&gt;
&lt;br /&gt;
:Multiplayer - Print this line on the network&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;scaleVine&#039;&#039;&#039;(float factor); ====&lt;br /&gt;
&lt;br /&gt;
:Event called using vine.*()&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;tdmVine&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;selectWeapon&#039;&#039;&#039;(string weapon); ====&lt;br /&gt;
&lt;br /&gt;
:Selects the weapon the player is holding.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;sessionCommand&#039;&#039;&#039;(string cmd); ====&lt;br /&gt;
&lt;br /&gt;
:Sends the sessioncommand to the game&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setActiveInventoryMapEnt&#039;&#039;&#039;(entity mapEnt); ====&lt;br /&gt;
&lt;br /&gt;
:Notify the player about a new active map entity. This clears out any previously active maps.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAcuity&#039;&#039;&#039;(string type, float val); ====&lt;br /&gt;
&lt;br /&gt;
:ai generalized alerts&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAirAccelerate&#039;&#039;&#039;(float newAccelerate); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a multiplier for the player&#039;s horizontal acceleration while airborne. Default is 1.0.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAlertGracePeriod&#039;&#039;&#039;(float frac, float duration, float count); ====&lt;br /&gt;
&lt;br /&gt;
:This starts the alert grace period for an AI. Should be called in the same frame as the alert that pushes them into a higher state.&lt;br /&gt;
::&#039;&#039;frac&#039;&#039;: the fraction of the alert below which they should ignore alerts during the grace period.&lt;br /&gt;
::&#039;&#039;duration&#039;&#039;: the duration of the period in seconds&lt;br /&gt;
::&#039;&#039;count&#039;&#039;: the number of alerts ignored above which the grace period is invalid&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAlertLevel&#039;&#039;&#039;(float newLevel); ====&lt;br /&gt;
&lt;br /&gt;
:Set the alert level (AI_AlertLevel). This should always be called instead of setting AI_AlertLevel directly.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAngles&#039;&#039;&#039;(vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the current orientation of this entity (relative to bind parent if any)&lt;br /&gt;
::&#039;&#039;angles&#039;&#039;: the new orientation&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAngularVelocity&#039;&#039;&#039;(vector velocity); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the current angular velocity of this entity. The angular velocity of a physics object is a vector that passes through the center of mass. The direction of this vector defines the axis of rotation and the magnitude defines the rate of rotation about the axis in radians per second.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAngularVelocityB&#039;&#039;&#039;(vector velocity, float id); ====&lt;br /&gt;
&lt;br /&gt;
:Set the angular velocity of a particular body&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAFEntity_Base&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAnimPrefix&#039;&#039;&#039;(string prefix); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a string which is placed in front of any animation names.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;setAnimRate&#039;&#039;&#039;(float channel, string animName, float animRate); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the animation rate to the given value. Returns 1 if successful, otherwise -1&lt;br /&gt;
::&#039;&#039;animName&#039;&#039;: The name of the animation.&lt;br /&gt;
::&#039;&#039;animRate&#039;&#039;: The rate to set the animation to.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAttackFlag&#039;&#039;&#039;(float combatType, float enabled); ====&lt;br /&gt;
&lt;br /&gt;
:Activate or deactivate the given attack flag&lt;br /&gt;
::&#039;&#039;combatType&#039;&#039;: see tdm_defs.script for possible enum values&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAudThresh&#039;&#039;&#039;(float val); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setBlendFrames&#039;&#039;&#039;(float channel, float blendFrame); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the number of frames to blend between animations on the given channel.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;, &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setBoneMod&#039;&#039;&#039;(float allowBoneMod); ====&lt;br /&gt;
&lt;br /&gt;
:Enables or disables head looking (may be obsolete).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setCamera&#039;&#039;&#039;(entity cameraEnt); ====&lt;br /&gt;
&lt;br /&gt;
:Turns over view control to the given camera entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setClipMask&#039;&#039;&#039;(float clipMask); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the clipmask of the physics object.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setColor&#039;&#039;&#039;(float parm0, float parm1, float parm2); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the RGB color of this entity (shader parms Parm0, Parm1, Parm2). See also setColorVec for a variant that accepts a vector instead.&lt;br /&gt;
::&#039;&#039;parm0&#039;&#039;: red&lt;br /&gt;
::&#039;&#039;parm1&#039;&#039;: green&lt;br /&gt;
::&#039;&#039;parm2&#039;&#039;: blue&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setColorVec&#039;&#039;&#039;(vector newColor); ====&lt;br /&gt;
&lt;br /&gt;
:Similar to setColor, but accepts the new RGB color as a vector instead of 3 different floats.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;SetConstraintPosition&#039;&#039;&#039;(string constraintName, vector position); ====&lt;br /&gt;
&lt;br /&gt;
:Moves the constraint with the given name that binds this entity to another entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAFEntity_Base&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setContents&#039;&#039;&#039;(float contents); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the contents of the physics object.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setController&#039;&#039;&#039;(entity playerController); ====&lt;br /&gt;
&lt;br /&gt;
:Let a player assume movement control of an AI vehicle (may be remote control as in a player on a coach pulled by a horse)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CAIVehicle&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;setCurInvCategory&#039;&#039;&#039;(string categoryName); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the inventory cursor to the first item of the named category. Returns 1 on success, 0 on failure (e.g. wrong category name)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;setCurInvItem&#039;&#039;&#039;(string itemName); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the inventory cursor to the named item. Returns: the item entity of the newly selected item (can be $null_entity).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setcvar&#039;&#039;&#039;(string name, string value); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a cvar.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setDroppable&#039;&#039;&#039;(float droppable); ====&lt;br /&gt;
&lt;br /&gt;
:Set whether an item may be dropped from the inventory. &lt;br /&gt;
::&#039;&#039;droppable&#039;&#039;: if non-zero the item becomes droppable, when called with 0 the item becomes non-droppable&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setEnemy&#039;&#039;&#039;(entity enemy); ====&lt;br /&gt;
&lt;br /&gt;
:Make the given entity an enemy.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setEntityRelation&#039;&#039;&#039;(entity ent, float relation); ====&lt;br /&gt;
&lt;br /&gt;
:Set a relation to another entity, this can be friendly (&amp;gt;0), neutral(0) or hostile (&amp;lt;0)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setFlyOffset&#039;&#039;&#039;(float offset); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the preferred height relative to the player&#039;s view height to fly at.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setFlySpeed&#039;&#039;&#039;(float speed); ====&lt;br /&gt;
&lt;br /&gt;
:Set the speed flying creatures move at. Also sets speed for moveTypeSlide.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setFrobable&#039;&#039;&#039;(float frobable); ====&lt;br /&gt;
&lt;br /&gt;
:Set whether the entity is frobable&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setFrobActionScript&#039;&#039;&#039;(string frobActionScript); ====&lt;br /&gt;
&lt;br /&gt;
:Changes the frob action script of this entity. Also updates the &#039;frob_action_script&#039; spawnarg.&lt;br /&gt;
::&#039;&#039;frobActionScript&#039;&#039;: the new script to call when the entity is frobbed&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setFrobMaster&#039;&#039;&#039;(entity master); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the passed entity as the frob master. Pass null_entity to remove the current frob master, if any.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setFrobOnlyUsedByInv&#039;&#039;&#039;(float OnOff); ====&lt;br /&gt;
&lt;br /&gt;
:Engages or disengages a mode where we only frobhilight entities that can be used by our current inventory item. This also disables general frobactions and only allows &amp;quot;used by&amp;quot; frob actions.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setGravity&#039;&#039;&#039;(vector newGravity); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a new gravity vector for this entity. Note that non-upright vectors are poorly supported at present.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setGui&#039;&#039;&#039;(float handle, string guiFile); ====&lt;br /&gt;
&lt;br /&gt;
:Loads a new file into an existing GUI.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setGuiFloat&#039;&#039;&#039;(float handle, string key, float val); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a GUI parameter.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setGuiInt&#039;&#039;&#039;(float handle, string key, float val); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a GUI parameter.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setGuiString&#039;&#039;&#039;(float handle, string key, string val); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a GUI parameter.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setGuiStringFromKey&#039;&#039;&#039;(float handle, string key, entity src, string srcKey); ====&lt;br /&gt;
&lt;br /&gt;
:This is a kludge. It is equivelant to: setGuiString( handle, key, src.getKey(srcKey) ) However, it&#039;s used to bypass the 127 char size limit on script strings.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setHealth&#039;&#039;&#039;(float health); ====&lt;br /&gt;
&lt;br /&gt;
:Use these to set the health of AI or players (this also updates the AI_DEAD flag)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setHinderance&#039;&#039;&#039;(string source, float mCap, float fCap); ====&lt;br /&gt;
&lt;br /&gt;
:Used to set hinderance from a source.&lt;br /&gt;
::&#039;&#039;mCap&#039;&#039;: mCap values from all sources are multiplied together to define a cap&lt;br /&gt;
::&#039;&#039;fCap&#039;&#039;: fCap values are not additive, the smallest one among all the sources is used&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setImmobilization&#039;&#039;&#039;(string source, float type); ====&lt;br /&gt;
&lt;br /&gt;
:Used to set immobilization from a source. Warning: Not a finalized version. It&#039;s subject to change, so use it at your own risk.)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setJointAngle&#039;&#039;&#039;(float jointnum, float transform_type, vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Modifies the orientation of the joint based on the transform type.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAnimatedEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setJointPos&#039;&#039;&#039;(float jointnum, float transform_type, vector pos); ====&lt;br /&gt;
&lt;br /&gt;
:Modifies the position of the joint based on the transform type.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAnimatedEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setKey&#039;&#039;&#039;(string key, string value); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a key on this entity&#039;s spawn args. Note that most spawn args are evaluated when this entity spawns in, so this will not change the entity&#039;s behavior in most cases. This is chiefly for saving data the script needs in an entity for later retrieval.&lt;br /&gt;
::&#039;&#039;key&#039;&#039;: the spawnarg to set&lt;br /&gt;
::&#039;&#039;value&#039;&#039;: the value to store&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setLightgemModifier&#039;&#039;&#039;(string modifierName, float value); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the named lightgem modifier to a certain value. An example would be the player lantern: setLightgemModifier(&amp;quot;lantern&amp;quot;, 32). This way multiple modifiers can be set by concurrent script threads.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setLightOrigin&#039;&#039;&#039;(vector pos); ====&lt;br /&gt;
&lt;br /&gt;
:Set origin of lights independent of model origin&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idLight&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setLightParm&#039;&#039;&#039;(float parmNum, float value); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a shader parameter.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idLight&#039;&#039;, &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setLightParms&#039;&#039;&#039;(float parm0, float parm1, float parm2, float parm3); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the red/green/blue/alpha shader parms on the light and the model.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idLight&#039;&#039;, &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setLinearVelocity&#039;&#039;&#039;(vector velocity); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the current linear velocity of this entity in units per second. The linear velocity of a physics object is a vector that defines the translation of the center of mass in units per second.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setLinearVelocityB&#039;&#039;&#039;(vector velocity, float id); ====&lt;br /&gt;
&lt;br /&gt;
:Set the linear velocity of a particular body&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAFEntity_Base&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setMaxHealth&#039;&#039;&#039;(float maxHealth); ====&lt;br /&gt;
&lt;br /&gt;
:Use these to set the max health of AI or players. Note that the health bar GUI is limited to showing a max health of 100. If health exceeds max health after this, health will be set to be equal to max health (which would also update the AI_DEAD flag)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setModel&#039;&#039;&#039;(string modelName); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the model this entity uses&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setMoveType&#039;&#039;&#039;(float movetype); ====&lt;br /&gt;
&lt;br /&gt;
:Set the current movetype.  movetypes are defined in tdm_ai.script&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setName&#039;&#039;&#039;(string name); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the name of this entity.&lt;br /&gt;
::&#039;&#039;name&#039;&#039;: the new name&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setNeverDormant&#039;&#039;&#039;(float enable); ====&lt;br /&gt;
&lt;br /&gt;
:enables or prevents an entity from going dormant&lt;br /&gt;
::&#039;&#039;enable&#039;&#039;: 1 = enable, 0 = disable&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setNextState&#039;&#039;&#039;(string stateFunc); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the next state and waits until thread exits, or a frame delay before calling it. Handy for setting the state in the constructor.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setObjectiveComp&#039;&#039;&#039;(float ObjNum, float CompNum, float state); ====&lt;br /&gt;
&lt;br /&gt;
:Used to set the state of custom objective components&lt;br /&gt;
::&#039;&#039;ObjNum&#039;&#039;: objective number. Starts counting at 1&lt;br /&gt;
::&#039;&#039;CompNum&#039;&#039;: component number. Starts counting at 1&lt;br /&gt;
::&#039;&#039;state&#039;&#039;: 1 or 0 for true or false&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setObjectiveEnabling&#039;&#039;&#039;(float ObjNum, string strIn); ====&lt;br /&gt;
&lt;br /&gt;
:Set an objective&#039;s enabling objectives (objectives that must be completed before that objective may be completed).&lt;br /&gt;
::&#039;&#039;strIn&#039;&#039;: takes the form of a string that is a space-delimited list of integer objectives representing the new enabling objectives. E.g. : &#039;1 2 3 4&#039;&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setObjectiveNotification&#039;&#039;&#039;(float ObjNote); ====&lt;br /&gt;
&lt;br /&gt;
:Turns the notifications (sound ++ text) for objectives on/off.&lt;br /&gt;
::&#039;&#039;ObjNote&#039;&#039;: Turn notifications on/off&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setObjectiveOngoing&#039;&#039;&#039;(float ObjNum, float val); ====&lt;br /&gt;
&lt;br /&gt;
:Sets objective ongoing.&lt;br /&gt;
::&#039;&#039;val&#039;&#039;: 1 for true, 0 for false&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setObjectiveOptional&#039;&#039;&#039;(float ObjNum, float val); ====&lt;br /&gt;
&lt;br /&gt;
:Sets objective mandatory.&lt;br /&gt;
::&#039;&#039;val&#039;&#039;: 1 for true, 0 for false&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setObjectiveState&#039;&#039;&#039;(float ObjNum, float State); ====&lt;br /&gt;
&lt;br /&gt;
:Used to set the state of objectives from the script. For example, use this to invalidate an objective when something happens in your mission. The first argument is the numerical index of the objective (taking &#039;user&#039; objective indices, starting at 1). Choose from the following for the second argument: OBJ_INCOMPLETE, OBJ_COMPLETE, OBJ_INVALID, OBJ_FAILED. Use this on $player1 like $player1.setObjectiveState(1, OBJ_COMPLETE);&lt;br /&gt;
::&#039;&#039;ObjNum&#039;&#039;: Starts counting at 1&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setObjectiveText&#039;&#039;&#039;(float ObjNum, string newText); ====&lt;br /&gt;
&lt;br /&gt;
:Modify the displayed text for an objective. Can also be a string template like #str_20000&lt;br /&gt;
::&#039;&#039;ObjNum&#039;&#039;: Starts counting at 1&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setObjectiveVisible&#039;&#039;&#039;(float ObjNum, float val); ====&lt;br /&gt;
&lt;br /&gt;
:Sets objective visibility.&lt;br /&gt;
::&#039;&#039;val&#039;&#039;: 1 for true, 0 for false&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setOrigin&#039;&#039;&#039;(vector origin); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the current position of this entity (relative to it&#039;s bind parent if any)&lt;br /&gt;
::&#039;&#039;origin&#039;&#039;: the new origin&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setOwner&#039;&#039;&#039;(entity owner); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the owner of this entity. Entities will never collide with their owner.&lt;br /&gt;
::&#039;&#039;owner&#039;&#039;: the entity which will be made owner of this entity&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setPeekOverlayBackground&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the background overlay for peeking, depending on aspect ratio.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setPeekView&#039;&#039;&#039;(float OnOff, vector origin); ====&lt;br /&gt;
&lt;br /&gt;
:Toggle whether we should use a view from a peek entity as the player&#039;s view&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setPersistentArg&#039;&#039;&#039;(string key, string value); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a key/value pair that persists between maps&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setPortAISoundLoss&#039;&#039;&#039;(float handle, float value); ====&lt;br /&gt;
&lt;br /&gt;
:AI sound propagation scriptfunction on the sys object&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setPortPlayerSoundLoss&#039;&#039;&#039;(float handle, float value); ====&lt;br /&gt;
&lt;br /&gt;
:Player sound loss scriptfunction on the sys object&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setPortSoundLoss&#039;&#039;&#039;(float handle, float value); ====&lt;br /&gt;
&lt;br /&gt;
:Sound propagation scriptfunction on the sys object&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setPrime&#039;&#039;&#039;(entity vine); ====&lt;br /&gt;
&lt;br /&gt;
:Event called using vine.*()&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;tdmVine&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setRadius&#039;&#039;&#039;(float radius); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the size of the bounding box, x=y=z=radius.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idLight&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setRadiusXYZ&#039;&#039;&#039;(float x, float y, float z); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the width/length/height of the light bounding box.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idLight&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setRelation&#039;&#039;&#039;(float team1, float team2, float val); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setReplacementAnim&#039;&#039;&#039;(string animToReplace, string replacement); ====&lt;br /&gt;
&lt;br /&gt;
:Replaces the animation &amp;quot;animToReplace&amp;quot; with &amp;quot;replacement&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSavePermissions&#039;&#039;&#039;(float permission); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
::&#039;&#039;permission&#039;&#039;: 0&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSecretsFound&#039;&#039;&#039;(float secrets); ====&lt;br /&gt;
&lt;br /&gt;
:Set how many secrets the player has found. Use getMissionStatistic() for getting the current value.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSecretsTotal&#039;&#039;&#039;(float secrets); ====&lt;br /&gt;
&lt;br /&gt;
:Set how many secrets exist in the map in total. Use getMissionStatistic() for getting the current value.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setShader&#039;&#039;&#039;(string shader); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the shader to be used for the light.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idLight&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setShaderParm&#039;&#039;&#039;(float parm, float value); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the value of the specified shader parm.&lt;br /&gt;
::&#039;&#039;parm&#039;&#039;: shader parm index&lt;br /&gt;
::&#039;&#039;value&#039;&#039;: new value&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;, &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setShaderParms&#039;&#039;&#039;(float parm0, float parm1, float parm2, float parm3); ====&lt;br /&gt;
&lt;br /&gt;
:Sets shader parms Parm0, Parm1, Parm2, and Parm3 (red, green, blue, and alpha respectively).&lt;br /&gt;
::&#039;&#039;parm0&#039;&#039;: red&lt;br /&gt;
::&#039;&#039;parm1&#039;&#039;: green&lt;br /&gt;
::&#039;&#039;parm2&#039;&#039;: blue&lt;br /&gt;
::&#039;&#039;parm3&#039;&#039;: alpha&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSightThreshold&#039;&#039;&#039;(float sightThreshold); ====&lt;br /&gt;
&lt;br /&gt;
:Set the sight threshold of the security camera: how lit up the player&#039;s lightgem needs to be in order to be seen. 0.0 to 1.0&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idSecurityCamera&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSize&#039;&#039;&#039;(vector min, vector max); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the size of this entity&#039;s bounding box.&lt;br /&gt;
::&#039;&#039;min&#039;&#039;: minimum corner coordinates&lt;br /&gt;
::&#039;&#039;max&#039;&#039;: maximum corner coordinates&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSkin&#039;&#039;&#039;(string skinName); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the skin this entity uses.  Set to &amp;quot;&amp;quot; to turn off the skin.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSmoke&#039;&#039;&#039;(string particleDef); ====&lt;br /&gt;
&lt;br /&gt;
:Changes the smoke particle of a func_smoke.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idFuncSmoke&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSmokeVisibility&#039;&#039;&#039;(float particle_num, float on); ====&lt;br /&gt;
&lt;br /&gt;
:enables/disables smoke particles on bones.  pass in the particle #, or ALL_PARTICLES for turning on/off all particle systems. particles are spawned in the order they appear in the entityDef&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSolid&#039;&#039;&#039;(float solidity); ====&lt;br /&gt;
&lt;br /&gt;
:Set the solidity of the entity. If the entity has never been solid before it will be assigned solid and opaque contents/clip masks.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSoundLoss&#039;&#039;&#039;(float loss); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the sound loss value (dB).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPortalEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSoundVolume&#039;&#039;&#039;(float newLevel); ====&lt;br /&gt;
&lt;br /&gt;
:Set the volume of the sound to play, must be issued before startSoundShader.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSpawnArg&#039;&#039;&#039;(string key, string value); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a key/value pair to be used when a new entity is spawned.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSpyglassOverlayBackground&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the background overlay for the spyglass, depending on aspect ratio.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setStartedOff&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idLight&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setState&#039;&#039;&#039;(string stateFunc); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the next state and goes to it immediately&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSyncedAnimWeight&#039;&#039;&#039;(float channel, float animindex, float weight); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the blend amount on multi-point anims.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setTalkState&#039;&#039;&#039;(float state); ====&lt;br /&gt;
&lt;br /&gt;
:Sets whether the player can talk to this character or not.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setTalkTarget&#039;&#039;&#039;(entity target); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the entity (player) trying to talk to the character&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setTeam&#039;&#039;&#039;(float newTeam); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the team number of this entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;SetTimerState&#039;&#039;&#039;(float stimId, float state); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setTurnHinderance&#039;&#039;&#039;(string source, float mCap, float fCap); ====&lt;br /&gt;
&lt;br /&gt;
:Set the hinderance on the view turning from a source&lt;br /&gt;
::&#039;&#039;mCap&#039;&#039;: mCap values from all sources are multiplied together to define a cap&lt;br /&gt;
::&#039;&#039;fCap&#039;&#039;: fCap values are not additive, the smallest one among all the sources is used&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setTurnRate&#039;&#039;&#039;(float rate); ====&lt;br /&gt;
&lt;br /&gt;
:Set the rate the character turns at&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setUsedBy&#039;&#039;&#039;(entity ent, float b_canUse); ====&lt;br /&gt;
&lt;br /&gt;
:Allows to change which entities can use this entity.&lt;br /&gt;
::&#039;&#039;ent&#039;&#039;: specify an entity here, like a key&lt;br /&gt;
::&#039;&#039;b_canUse&#039;&#039;: whether the specified entity can use this entity&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setViewAngles&#039;&#039;&#039;(vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the player view angles, e.g. make the player facing this direction. 0 0 0 is east (along the X axis in DR), 0 90 0 north (along the Y axis in DR) 0 180 0 west, 0 270 0 south.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setWatered&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Event called using vine.*()&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;tdmVine&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setWorldOrigin&#039;&#039;&#039;(vector origin); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the current position of this entity (regardless of any bind parent).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;shooterFireProjectile&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Fires a projectile.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;tdmFuncShooter&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;shooterGetAmmo&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get the ammonition&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;tdmFuncShooter&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;shooterGetState&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current state of this shooter.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;tdmFuncShooter&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;shooterSetAmmo&#039;&#039;&#039;(float newAmmo); ====&lt;br /&gt;
&lt;br /&gt;
:Set the ammonition&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;tdmFuncShooter&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;shooterSetState&#039;&#039;&#039;(float state); ====&lt;br /&gt;
&lt;br /&gt;
:Activates / deactivates the shooter entity.&lt;br /&gt;
::&#039;&#039;state&#039;&#039;: 1 = active, 0 = inactive&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;tdmFuncShooter&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;show&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Makes this entity visible if it has a model.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;showAttachment&#039;&#039;&#039;(string attName, float show); ====&lt;br /&gt;
&lt;br /&gt;
:Show or hide an attachment.&lt;br /&gt;
::&#039;&#039;show&#039;&#039;: 1 shows attachment, 0 hides it.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;, &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;showAttachmentInd&#039;&#039;&#039;(float index, float show); ====&lt;br /&gt;
&lt;br /&gt;
:Show or hide an attachment by array index.&lt;br /&gt;
::&#039;&#039;index&#039;&#039;: starts at 0&lt;br /&gt;
::&#039;&#039;show&#039;&#039;: 1 shows attachment, 0 hides it.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;, &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;shrivel&#039;&#039;&#039;(float time); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;sin&#039;&#039;&#039;(float degrees); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the sine of the given angle in degrees.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;slideTo&#039;&#039;&#039;(vector position, float time); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;smoking&#039;&#039;&#039;(float state); ====&lt;br /&gt;
&lt;br /&gt;
:flame is now smoking (1), or not (0)&lt;br /&gt;
::&#039;&#039;state&#039;&#039;: 1 = smoking, 0 = not smoking&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idLight&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;spawn&#039;&#039;&#039;(string classname); ====&lt;br /&gt;
&lt;br /&gt;
:Creates an entity of the specified classname and returns a reference to the entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;SpawnFloat&#039;&#039;&#039;(string key, float default); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the floating point value for the given spawn argument.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;SpawnString&#039;&#039;&#039;(string key, string default); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the string for the given spawn argument.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;spawnThrowableProjectile&#039;&#039;&#039;(string projectileName, string jointName); ====&lt;br /&gt;
&lt;br /&gt;
:This method spawns a projectile of the type named by the caller and attaches it to the joint given by the caller.  The projectile becomes the AI&#039;s firable projectile. Returns a pointer to a projectile entity that can be  thrown by the AI. You can use AI_LaunchMissle (e* = launchMissle(v,v) ) to throw the stone.&lt;br /&gt;
::&#039;&#039;projectileName&#039;&#039;: The name of the projectile to spawn (as seen in a .def file) Must be descended from idProjectile&lt;br /&gt;
::&#039;&#039;jointName&#039;&#039;: The name of the joint on the model to which the particle should be attached for throwing. If this is NULL or the empty string, then it is attached to the model center.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;SpawnVector&#039;&#039;&#039;(string key, vector default); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the vector for the given spawn argument.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;speed&#039;&#039;&#039;(float speed); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the movement speed. Set this speed before initiating a new move.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;sqrt&#039;&#039;&#039;(float square); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the square root of the given number.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;start&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Starts a spline or anim camera moving.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idCameraAnim&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;startFx&#039;&#039;&#039;(string fx); ====&lt;br /&gt;
&lt;br /&gt;
:Starts an FX on this entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;startGamePlayTimer&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Resets the game play timer to zero and (re)starts it.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;startMouseGesture&#039;&#039;&#039;(float key, float thresh, float test, float inverted, float turnHinderance, float decideTime, float deadTime); ====&lt;br /&gt;
&lt;br /&gt;
:Start tracking a mouse gesture that started when the key impulse was pressed. Discretizes analog mouse movement into a few different gesture possibilities. Impulse arg can also be a button, see the UB_* enum in usercmdgen.h. For now, only one mouse gesture check at a time.&lt;br /&gt;
::&#039;&#039;thresh&#039;&#039;: Waits until the threshold mouse input thresh is reached before deciding.&lt;br /&gt;
::&#039;&#039;test&#039;&#039;: determines which test to do (0 = up/down, 1 = left/right, 2 = 4 directions, 3 = 8 directions).&lt;br /&gt;
::&#039;&#039;inverted&#039;&#039;: inverts the movement if set to 1, does not if 0&lt;br /&gt;
::&#039;&#039;turnHinderance&#039;&#039;: Sets the max player view turn rate when checking this mouse gesture (0 =&amp;gt; player view locked, 1.0 =&amp;gt; no effect on view turning)&lt;br /&gt;
::&#039;&#039;decideTime&#039;&#039;: time in milliseconds after which the mouse gesture is auto-decided, in the event that the mouse movement threshold was not reached. A DecideTime of -1 means wait forever until the button is released.&lt;br /&gt;
::&#039;&#039;deadTime&#039;&#039;: how long after attack is pressed that mouse control remains dampened by the fraction turnHinderance.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;startRagdoll&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Switches to a ragdoll taking over the animation.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAnimated&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;startSound&#039;&#039;&#039;(string sound, float channel, float netSync); ====&lt;br /&gt;
&lt;br /&gt;
:Plays the sound specified by the snd_* key/value pair on the channel and returns the length of the sound in seconds. This is the preferred method for playing sounds on an entity since it ensures that the sound is precached.&lt;br /&gt;
::&#039;&#039;sound&#039;&#039;: the spawnarg to reference, e.g. &#039;snd_move&#039;&lt;br /&gt;
::&#039;&#039;channel&#039;&#039;: the channel to play on&lt;br /&gt;
::&#039;&#039;netSync&#039;&#039;: -&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;startSoundShader&#039;&#039;&#039;(string shaderName, float channel); ====&lt;br /&gt;
&lt;br /&gt;
:Plays a specific sound shader on the channel and returns the length of the sound in seconds. This is not the preferred method of playing a sound since you must ensure that the sound is loaded.&lt;br /&gt;
::&#039;&#039;shaderName&#039;&#039;: the sound shader to play&lt;br /&gt;
::&#039;&#039;channel&#039;&#039;: the channel to play the sound on&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;startSpline&#039;&#039;&#039;(entity spline); ====&lt;br /&gt;
&lt;br /&gt;
:Starts moving along a spline stored on the given entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;StartTimer&#039;&#039;&#039;(float stimId); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;startZoom&#039;&#039;&#039;(float duration, float startFOV, float endFOV); ====&lt;br /&gt;
&lt;br /&gt;
:Call this to start the zoom in event. The player FOV is gradually zoomed in until over the given timespan.&lt;br /&gt;
::&#039;&#039;duration&#039;&#039;: duration of the transition in msec&lt;br /&gt;
::&#039;&#039;startFOV&#039;&#039;: The start FOV, this is clamped to [1..179]&lt;br /&gt;
::&#039;&#039;endFOV&#039;&#039;: The end FOV, this is clamped to [1..179]&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;state_light&#039;&#039;&#039;(float set); ====&lt;br /&gt;
&lt;br /&gt;
:Switches the spotlight on or off. Respects the security camera&#039;s power state.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idSecurityCamera&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;state_see_AI&#039;&#039;&#039;(float set); ====&lt;br /&gt;
&lt;br /&gt;
:Set whether the camera can see AIs.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idSecurityCamera&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;state_see_animals&#039;&#039;&#039;(float set); ====&lt;br /&gt;
&lt;br /&gt;
:Set whether the camera can see animals. Checked after seeAI or seeBodies.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idSecurityCamera&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;state_see_bodies&#039;&#039;&#039;(float set); ====&lt;br /&gt;
&lt;br /&gt;
:Set whether the camera can see bodies.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idSecurityCamera&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;state_see_player&#039;&#039;&#039;(float set); ====&lt;br /&gt;
&lt;br /&gt;
:Set whether the camera can see the player.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idSecurityCamera&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;state_sweep&#039;&#039;&#039;(float set); ====&lt;br /&gt;
&lt;br /&gt;
:Enables or disables the camera&#039;s sweeping.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idSecurityCamera&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;StimAdd&#039;&#039;&#039;(float type, float radius); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;StimClearIgnoreList&#039;&#039;&#039;(float type); ====&lt;br /&gt;
&lt;br /&gt;
:This clears the ignore list for the stim of the given type It can be used if an entity changes state in some way that it would no longer be ignored&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;StimEmit&#039;&#039;&#039;(float type, float radius, vector stimOrigin); ====&lt;br /&gt;
&lt;br /&gt;
:Emits a stim in a radius around the specified origin. The entity from which this event is called needs to have the corresponding stim setup on itself, it does not need to be active.&lt;br /&gt;
::&#039;&#039;type&#039;&#039;: Index ID of the stim to emit, i.e. 21 or STIM_TRIGGER for a trigger stim.&lt;br /&gt;
::&#039;&#039;radius&#039;&#039;: How far the stim will reach. Pass negative to use the radius settings on the entity.&lt;br /&gt;
::&#039;&#039;stimOrigin&#039;&#039;: Emit the stim from here.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;StimEnable&#039;&#039;&#039;(float type, float state); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
::&#039;&#039;state&#039;&#039;: 0 = disabled, 1 = enabled&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;StimRemove&#039;&#039;&#039;(float type); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;StimSetScriptBased&#039;&#039;&#039;(float type, float state); ====&lt;br /&gt;
&lt;br /&gt;
:Converts a stim to being script-based. It will only be emitted when a script calls StimEmit on the entity.&lt;br /&gt;
::&#039;&#039;type&#039;&#039;: Index ID of the stim to alter, i.e. 21 or STIM_TRIGGER for a trigger stim.&lt;br /&gt;
::&#039;&#039;state&#039;&#039;: New state.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stop&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Stops a spline or anim camera moving.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idCameraAnim&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopAnim&#039;&#039;&#039;(float channel, float frames); ====&lt;br /&gt;
&lt;br /&gt;
:Stops the animation currently playing on the given channel over the given number of frames.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopFxFov&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopMouseGesture&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopMove&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopMoving&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Stops any translational movement.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopPatrol&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Stops an AI from patrolling&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopRagdoll&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:turns off the ragdoll&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopRotating&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Stops any rotational movement.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopSound&#039;&#039;&#039;(float channel, float netSync); ====&lt;br /&gt;
&lt;br /&gt;
:Stops a specific sound shader on the channel.&lt;br /&gt;
::&#039;&#039;channel&#039;&#039;: the channel to stop playback on&lt;br /&gt;
::&#039;&#039;netSync&#039;&#039;: -&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopSpline&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Stops moving along a spline.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopThinking&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;StopTimer&#039;&#039;&#039;(float stimId); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;strFind&#039;&#039;&#039;(string text, string find, float casesensitive, float start, float end); ====&lt;br /&gt;
&lt;br /&gt;
:Return the position of the given substring, counting from 0, or -1 if not found.&lt;br /&gt;
::&#039;&#039;casesensitive&#039;&#039;: 0&lt;br /&gt;
::&#039;&#039;start&#039;&#039;: 0&lt;br /&gt;
::&#039;&#039;end&#039;&#039;: -1&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;strLeft&#039;&#039;&#039;(string text, float num); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a string composed of the first num characters&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;strLength&#039;&#039;&#039;(string text); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of characters in the string&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;strMid&#039;&#039;&#039;(string text, float start, float num); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a string composed of the characters from start to start + num&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;strRemove&#039;&#039;&#039;(string text, string remove); ====&lt;br /&gt;
&lt;br /&gt;
:Replace all occurances of the given substring with &amp;quot;&amp;quot;. Example: StrRemove(&amp;quot;abba&amp;quot;,&amp;quot;bb&amp;quot;) results in &amp;quot;aa&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;strReplace&#039;&#039;&#039;(string text, string remove, string replace); ====&lt;br /&gt;
&lt;br /&gt;
:Replace all occurances of the given string with the replacement string. Example: StrRemove(&amp;quot;abba&amp;quot;,&amp;quot;bb&amp;quot;,&amp;quot;ccc&amp;quot;) results in &amp;quot;accca&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;strRight&#039;&#039;&#039;(string text, float num); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a string composed of the last num characters&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;strSkip&#039;&#039;&#039;(string text, float num); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the string following the first num characters&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;strToFloat&#039;&#039;&#039;(string text); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the numeric value of the given string.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;strToInt&#039;&#039;&#039;(string text); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the integer value of the given string.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;sway&#039;&#039;&#039;(float speed, float phase, vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a rotation back and forth along the given angles with the given speed and phase.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Switch&#039;&#039;&#039;(float newState); ====&lt;br /&gt;
&lt;br /&gt;
:Move the lever to the on or off position (0 = off).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CFrobLever&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;switchState&#039;&#039;&#039;(string stateName); ====&lt;br /&gt;
&lt;br /&gt;
:Switches to the state with the given name, current one is ended.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;syncAnimChannels&#039;&#039;&#039;(float fromChannel, float toChannel, float blendFrames); ====&lt;br /&gt;
&lt;br /&gt;
:Synchronises the channels&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Tap&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Operates this handle.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CFrobHandle&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;TDM_Lock_OnLockPicked&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:internal&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CBinaryFrobMover&#039;&#039;, &#039;&#039;CFrobLock&#039;&#039;, &#039;&#039;idProjectile&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;TDM_Lock_StatusUpdate&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:internal&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CBinaryFrobMover&#039;&#039;, &#039;&#039;CFrobLock&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;teleportTo&#039;&#039;&#039;(entity other); ====&lt;br /&gt;
&lt;br /&gt;
:Teleports the entity to the position of the other entity, plus a possible offset and random offset (defined on the spawnargs of the entity to be teleported)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;terminate&#039;&#039;&#039;(float threadNumber); ====&lt;br /&gt;
&lt;br /&gt;
:Terminates a thread.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;testAnimAttack&#039;&#039;&#039;(string animname); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;testAnimMove&#039;&#039;&#039;(string animname); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;testAnimMoveTowardEnemy&#039;&#039;&#039;(string animname); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;testChargeAttack&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;testEvent1&#039;&#039;&#039;(float float_pi, float int_beef, float float_exp, string string_tdm, float float_exp10, float int_food); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;testEvent2&#039;&#039;&#039;(float int_prevres, vector vec_123, float int_food, entity ent_player, entity ent_null, float float_pi, float float_exp); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;testEvent3&#039;&#039;&#039;(entity ent_prevres, vector vec_123, float float_pi, entity ent_player); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;testMeleeAttack&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;testMoveToPosition&#039;&#039;&#039;(vector position); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;threadname&#039;&#039;&#039;(string name); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the name of the current thread.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;throwAF&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;throwMoveable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;time&#039;&#039;&#039;(float time); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the movement time. Set this time before initiating a new move.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Toggle&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Turns the forcefield on and off.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idForceField&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;toggle_light&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Toggles the spotlight on/off.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idSecurityCamera&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;toggle_see_AI&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Toggles whether the camera can see AIs.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idSecurityCamera&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;toggle_see_animals&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Toggles whether the camera can see bodies. Checked after seeAI or seeBodies.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idSecurityCamera&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;toggle_see_bodies&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Toggles whether the camera can see bodies.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idSecurityCamera&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;toggle_see_player&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Toggles whether the camera can see the player.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idSecurityCamera&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;toggle_sweep&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Toggles the camera sweep.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idSecurityCamera&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ToggleLock&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Toggles the lock state. Unlocked movers will be locked and vice versa. The notes above concerning Unlock() still apply if this call unlocks the mover. &lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CBinaryFrobMover&#039;&#039;, &#039;&#039;CFrobLock&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ToggleOpen&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Toggles the mover state. Closes when fully open, opens when fully closed. If the mover is &amp;quot;interrupted&amp;quot; (e.g. when the player frobbed the mover in between), the move direction depends on the state of the internal &amp;quot;intent_open&amp;quot; flag. &lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CBinaryFrobMover&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;totalAmmoCount&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Amount of ammo in inventory. since each shot may use more than 1 ammo, this is different than ammoAvailable()&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;touches&#039;&#039;&#039;(entity other); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if this entity touches the other entity.&lt;br /&gt;
::&#039;&#039;other&#039;&#039;: the entity to check against&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;trace&#039;&#039;&#039;(vector start, vector end, vector mins, vector maxs, float contents_mask, entity passEntity); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the fraction of movement completed before the box from &#039;mins&#039; to &#039;maxs&#039; hits solid geometry when moving from &#039;start&#039; to &#039;end&#039;. The &#039;passEntity&#039; is considered non-solid during the move.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;tracePoint&#039;&#039;&#039;(vector start, vector end, float contents_mask, entity passEntity); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the fraction of movement completed before the trace hits solid geometry when moving from &#039;start&#039; to &#039;end&#039;. The &#039;passEntity&#039; is considered non-solid during the move.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;translate&#039;&#039;&#039;(string input); ====&lt;br /&gt;
&lt;br /&gt;
:Translates a string (like #str_12345) into the current language&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;travelDistanceBetweenEntities&#039;&#039;&#039;(entity source, entity dest); ====&lt;br /&gt;
&lt;br /&gt;
:Approximate travel distance between two entities.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;travelDistanceBetweenPoints&#039;&#039;&#039;(vector source, vector dest); ====&lt;br /&gt;
&lt;br /&gt;
:Approximate travel distance between two points.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;travelDistanceToEntity&#039;&#039;&#039;(entity destination); ====&lt;br /&gt;
&lt;br /&gt;
:Approximate travel distance to entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;travelDistanceToPoint&#039;&#039;&#039;(vector destination); ====&lt;br /&gt;
&lt;br /&gt;
:Approximate travel distance to point.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;trigger&#039;&#039;&#039;(entity entityToTrigger); ====&lt;br /&gt;
&lt;br /&gt;
:Triggers the given entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;triggerMissionEnd&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;triggerParticles&#039;&#039;&#039;(string jointName); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;turnTo&#039;&#039;&#039;(float yaw); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;turnToEntity&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;turnToPos&#039;&#039;&#039;(vector pos); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;unbind&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Detaches this entity from its master.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Unlock&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Unlocks the mover. Calls to Open() will succeed after this call. Depending on the value of the spawnarg &amp;quot;open_on_unlock&amp;quot; the mover might automatically open after this call. &lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CBinaryFrobMover&#039;&#039;, &#039;&#039;CFrobLock&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;unpauseGame&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Unpauses the game. Most scripts are not executed during g_stopTime == true and won&#039;t get into the position of calling this.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;useAmmo&#039;&#039;&#039;(float amount); ====&lt;br /&gt;
&lt;br /&gt;
:Eats the specified amount of ammo&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;vecLength&#039;&#039;&#039;(vector vec); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the length of the given vector.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;vecNormalize&#039;&#039;&#039;(vector vec); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the normalized version of the given vector.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;VecRotate&#039;&#039;&#039;(vector vector, vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Rotates a vector by the specified angles.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;VecToAngles&#039;&#039;&#039;(vector vec); ====&lt;br /&gt;
&lt;br /&gt;
:Returns Euler angles for the given direction.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;visScan&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Checks for enemies or player in the AI&#039;s FOV, using light level and distance. For now the check is only done on the player.  Returns a reference to the sighted actor.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;wait&#039;&#039;&#039;(float time); ====&lt;br /&gt;
&lt;br /&gt;
:Suspends execution of the current thread for the given number of seconds.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;, &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;waitAction&#039;&#039;&#039;(string name); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;waitFor&#039;&#039;&#039;(entity mover); ====&lt;br /&gt;
&lt;br /&gt;
:Waits for the given entity to complete its move.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;waitForRender&#039;&#039;&#039;(entity e); ====&lt;br /&gt;
&lt;br /&gt;
:Suspends the current thread until &#039;e&#039; might have been rendered. It&#039;s event based, so it doesn&#039;t waste CPU repeatedly checking inPVS(). e.inPVS() will very likely be true when the thread resumes. If e.inPVS() is true, calling waitForRender() will probably just wait a frame, unless D3 can figure out that the entity doesn&#039;t need to be rendered. Optimizations regarding shadowcasting lights may not apply to this function - it is based purely off whether or not the entity&#039;s bounding box is visible.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;waitForThread&#039;&#039;&#039;(float threadNumber); ====&lt;br /&gt;
&lt;br /&gt;
:Waits for the given thread to terminate.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;waitFrame&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Suspends execution of current thread for one game frame.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;, &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;waitMove&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;wakeOnFlashlight&#039;&#039;&#039;(float enable); ====&lt;br /&gt;
&lt;br /&gt;
:Tells the monster to activate when flashlight shines on them.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;wander&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;warning&#039;&#039;&#039;(string text); ====&lt;br /&gt;
&lt;br /&gt;
:Issues a warning.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;wasDamaged&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Check if the player was damaged this frame.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;weaponHolstered&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;weaponLowering&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;weaponOutOfAmmo&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;weaponReady&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;weaponReloading&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;weaponRising&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;weaponState&#039;&#039;&#039;(string stateFunction, float blendFrames); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Events by Spawnclass / Entity Type ==&lt;br /&gt;
=== idClass ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;remove&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Removes the entity from the game. For AI, use kill() instead.&lt;br /&gt;
&lt;br /&gt;
=== idActor ===&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;animDistance&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the distance that the anim travels. If the entity has multiple anims with animName, the distance may not match the anim that is played. Use chooseAnim to get a non-random anim and pass that string into animDistance.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;animDone&#039;&#039;&#039;(float channel, float blendOutFrames); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the animation playing on the given channel is completed considering a number of blend frames.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;animIsPaused&#039;&#039;&#039;(float channel); ====&lt;br /&gt;
&lt;br /&gt;
:Return whether the given anim channel is paused&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;animLength&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the length of the anim in seconds. If the entity has multiple anims with animName, length may not match the anim that is played. Use chooseAnim to get a non-random anim and pass that string into animLength.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;animState&#039;&#039;&#039;(float channel, string stateFunction, float blendFrame); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a new animation state script function for the given channel.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;attach&#039;&#039;&#039;(entity ent, string attName); ====&lt;br /&gt;
&lt;br /&gt;
:Attach an entity to the AI. Entity spawnArgs checked for attachments are:  - &amp;quot;origin&amp;quot;, &amp;quot;angles&amp;quot;, and &amp;quot;joint&amp;quot;. These must be set prior to calling attach.&lt;br /&gt;
::&#039;&#039;attName&#039;&#039;: the desired name of the attachment, e.g., &#039;melee_weapon&#039;&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;attachToPos&#039;&#039;&#039;(entity ent, string position, string attName); ====&lt;br /&gt;
&lt;br /&gt;
:Attach an entity to the AI, using a named attachment position&lt;br /&gt;
::&#039;&#039;attName&#039;&#039;: the desired name of the attachment, e.g., &#039;melee_weapon&#039;&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;checkAnim&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Ensures that the animation exists and causes an error if it doesn&#039;t.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;chooseAnim&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Chooses a random anim and returns the name. Useful for doing move tests on anims.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;closestEnemyToPoint&#039;&#039;&#039;(vector point); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the enemy closest to the given location.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disableAnimchannel&#039;&#039;&#039;(float channel); ====&lt;br /&gt;
&lt;br /&gt;
:Used to disable a certain animchannel (for example if the ai is dead)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disableEyeFocus&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Disables eye focus.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;DisableLegIK&#039;&#039;&#039;(float num); ====&lt;br /&gt;
&lt;br /&gt;
:disables leg IK&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disablePain&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Disables pain animations.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;DisableWalkIK&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:disables walk IK&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;dropAttachment&#039;&#039;&#039;(string attName); ====&lt;br /&gt;
&lt;br /&gt;
:Drop the attachment for the given attachment name.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;dropAttachmentInd&#039;&#039;&#039;(float index); ====&lt;br /&gt;
&lt;br /&gt;
:Drop the attachment for the given index.&lt;br /&gt;
::&#039;&#039;index&#039;&#039;: starts at 0&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enableAnim&#039;&#039;&#039;(float channel, float blendFrames); ====&lt;br /&gt;
&lt;br /&gt;
:Enables animation on the given channel.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enableEyeFocus&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Enables eye focus.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;EnableLegIK&#039;&#039;&#039;(float num); ====&lt;br /&gt;
&lt;br /&gt;
:enables leg IK&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enablePain&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Enables pain animations.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;EnableWalkIK&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:enables walk IK&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;finishAction&#039;&#039;&#039;(string action); ====&lt;br /&gt;
&lt;br /&gt;
:Finishes the given wait action.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;finishChannelAction&#039;&#039;&#039;(float channel, string animname); ====&lt;br /&gt;
&lt;br /&gt;
:Overloaded finishAction function for setting the waitstate on each channel separately&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;footstep&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Plays footstep sound.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getAnimList&#039;&#039;&#039;(float channel); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a list of all animations and their anim rates.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getAnimRate&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the rate for the given animation. Returns -1 if animation cannot be found.&lt;br /&gt;
::&#039;&#039;animName&#039;&#039;: The name of the animation.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getAnimState&#039;&#039;&#039;(float channel); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the name of the current animation state script function used for the given channel.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getAttachment&#039;&#039;&#039;(string attName); ====&lt;br /&gt;
&lt;br /&gt;
:Get the attached entity with the given attachment name Will be NULL if the name is invalid or if the entity no longer exists&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getAttachmentInd&#039;&#039;&#039;(float index); ====&lt;br /&gt;
&lt;br /&gt;
:Get the attached entity at the given index. Will be NULL if the index is invalid or the entity no longer exists&lt;br /&gt;
::&#039;&#039;index&#039;&#039;: starts at 0&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getAttackFlag&#039;&#039;&#039;(float combatType); ====&lt;br /&gt;
&lt;br /&gt;
:Returns 1 if the given attack flag is activated.&lt;br /&gt;
::&#039;&#039;combatType&#039;&#039;: see tdm_defs.script for possible enum values&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getBlendFrames&#039;&#039;&#039;(float channel); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of frames to blend between animations on the given channel.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getEyePos&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get eye position of the player and the AI&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getHead&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the entity used for the character&#039;s head, if it has one.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMeleeActPhase&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current melee action phase (holding,recovering,etc).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMeleeActState&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current melee action state (attacking/defending).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMeleeActType&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current melee action type (overhead,thrust,etc.).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMeleeLastActTime&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the melee type of the last attack to hit this actor. Defaults to MELEETYPE_UNBLOCKABLE if we were not hit before.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMeleeLastHitByType&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the game time that the most recent melee action ended (in ms)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMeleeResult&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get the result of the last melee action Follows MELEERESULT_* enum defined in tdm_defs.script&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getNumAttachments&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Return the number of attachments on an AI. Used to iterate through the attachments if desired.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getNumMeleeWeapons&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of melee weapons attached to an actor. This refers to the TDM-style attachments with the spawnarg &#039;is_weapon_melee&#039; set to &#039;1&#039;.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getNumRangedWeapons&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of ranged weapons attached to an actor. This refers to the TDM-style attachments with the spawnarg &#039;is_weapon_ranged&#039; set to &#039;1&#039;.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getPainAnim&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the name of the pain animation.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getState&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the current state.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;hasAnim&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true when an entity has a specific animation.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;hasEnemies&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the actor has one or more enemies.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;idleAnim&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Plays the given idle animation on the given channel.  Returns false if anim doesn&#039;t exist.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;inAnimState&#039;&#039;&#039;(float channel, string stateFunc); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the given animation state script function is currently used for the given channel.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;leftFoot&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Changes to left foot and plays footstep sound.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;lookupReplacementAnim&#039;&#039;&#039;(string anim); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current replacement animation for &amp;quot;anim&amp;quot;. Returns empty if no replacement anim &lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;meleeActionFinished&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Called when the animation for the melee action has finished.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;meleeActionHeld&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Called when the melee action reaches the &amp;quot;hold&amp;quot; point.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;meleeActionReleased&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Called when the melee action is released from the hold point.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;meleeAttackStarted&#039;&#039;&#039;(float attType); ====&lt;br /&gt;
&lt;br /&gt;
:Registers the start of a given melee attack Intended to be called from a script that also starts the animation&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;meleeBestParry&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the melee type integer of the best parry given the enemy attacks at the time If no attacking enemy is found, returns default of MELEETYPE_RL Follows MELEETYPE_* enum defined in tdm_defs.script&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;meleeNameForNum&#039;&#039;&#039;(float num); ====&lt;br /&gt;
&lt;br /&gt;
:Converts a melee type integer to a string name suffix Used for finding the right animation for a given type, etc. Possible names are, in order: &amp;quot;Over, LR, RL, Thrust, General&amp;quot; Where general blocks all attacks types except unblockable&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;meleeParryStarted&#039;&#039;&#039;(float parType); ====&lt;br /&gt;
&lt;br /&gt;
:Registers the start of a given melee parry Intended to be called from a script that also starts the animation&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;nextEnemy&#039;&#039;&#039;(entity lastEnemy); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the next enemy the actor has acquired.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;overrideAnim&#039;&#039;&#039;(float channel); ====&lt;br /&gt;
&lt;br /&gt;
:Disables the animation currently playing on the given channel and syncs the animation with the animation of the nearest animating channel.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;pauseAnim&#039;&#039;&#039;(float channel, float bPause); ====&lt;br /&gt;
&lt;br /&gt;
:Pause all animations playing on the given channel. NOTE: Can also be used used by idWeapons&lt;br /&gt;
::&#039;&#039;bPause&#039;&#039;: true = pause, false = unpause&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;playAnim&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Do not use, this is part of TDM&#039;s internal mechanics. Use playCustomAnim() on AI.in scripts instead of this. Plays the given animation on the given channel. Returns false if anim doesn&#039;t exist.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;playCycle&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Continuously repeats the given animation on the given channel.  Returns false if anim doesn&#039;t exist.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;preventPain&#039;&#039;&#039;(float duration); ====&lt;br /&gt;
&lt;br /&gt;
:Prevents any pain animation from being played for the given time in seconds.&lt;br /&gt;
::&#039;&#039;duration&#039;&#039;: time in seconds&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;reAttachToCoords&#039;&#039;&#039;(string attName, string joint, vector offset, vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Reattach an existing attachment&lt;br /&gt;
::&#039;&#039;attName&#039;&#039;: the name of the attachment we want to reattach. &lt;br /&gt;
::&#039;&#039;joint&#039;&#039;: the name of the joint to attach to&lt;br /&gt;
::&#039;&#039;offset&#039;&#039;: the translation offset from joint&lt;br /&gt;
::&#039;&#039;angles&#039;&#039;: a (pitch, yaw, roll) angle vector that defines the rotation  of the attachment relative to the joint&#039;s orientation&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;reAttachToPos&#039;&#039;&#039;(string attName, string position); ====&lt;br /&gt;
&lt;br /&gt;
:Reattach an existing attachment to a named attachment position. Example: reAttachToPos( melee_weapon, right_hand_held )&lt;br /&gt;
::&#039;&#039;attName&#039;&#039;: the name of the attachment we want to reattach.&lt;br /&gt;
::&#039;&#039;position&#039;&#039;: the new position we want to attach it to.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;reloadTorchReplacementAnims&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:If actor has a torch, reload the torch&#039;s replacement anims.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;removeReplacementAnim&#039;&#039;&#039;(string anim); ====&lt;br /&gt;
&lt;br /&gt;
:Removes the replacement for the given &amp;quot;anim&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;rightFoot&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Changes to right foot and plays footstep sound.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAnimPrefix&#039;&#039;&#039;(string prefix); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a string which is placed in front of any animation names.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;setAnimRate&#039;&#039;&#039;(float channel, string animName, float animRate); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the animation rate to the given value. Returns 1 if successful, otherwise -1&lt;br /&gt;
::&#039;&#039;animName&#039;&#039;: The name of the animation.&lt;br /&gt;
::&#039;&#039;animRate&#039;&#039;: The rate to set the animation to.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAttackFlag&#039;&#039;&#039;(float combatType, float enabled); ====&lt;br /&gt;
&lt;br /&gt;
:Activate or deactivate the given attack flag&lt;br /&gt;
::&#039;&#039;combatType&#039;&#039;: see tdm_defs.script for possible enum values&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setBlendFrames&#039;&#039;&#039;(float channel, float blendFrame); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the number of frames to blend between animations on the given channel.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setNextState&#039;&#039;&#039;(string stateFunc); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the next state and waits until thread exits, or a frame delay before calling it. Handy for setting the state in the constructor.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setReplacementAnim&#039;&#039;&#039;(string animToReplace, string replacement); ====&lt;br /&gt;
&lt;br /&gt;
:Replaces the animation &amp;quot;animToReplace&amp;quot; with &amp;quot;replacement&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setState&#039;&#039;&#039;(string stateFunc); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the next state and goes to it immediately&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSyncedAnimWeight&#039;&#039;&#039;(float channel, float animindex, float weight); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the blend amount on multi-point anims.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;showAttachment&#039;&#039;&#039;(string attName, float show); ====&lt;br /&gt;
&lt;br /&gt;
:Show or hide an attachment.&lt;br /&gt;
::&#039;&#039;show&#039;&#039;: 1 shows attachment, 0 hides it.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;showAttachmentInd&#039;&#039;&#039;(float index, float show); ====&lt;br /&gt;
&lt;br /&gt;
:Show or hide an attachment by array index.&lt;br /&gt;
::&#039;&#039;index&#039;&#039;: starts at 0&lt;br /&gt;
::&#039;&#039;show&#039;&#039;: 1 shows attachment, 0 hides it.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopAnim&#039;&#039;&#039;(float channel, float frames); ====&lt;br /&gt;
&lt;br /&gt;
:Stops the animation currently playing on the given channel over the given number of frames.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;syncAnimChannels&#039;&#039;&#039;(float fromChannel, float toChannel, float blendFrames); ====&lt;br /&gt;
&lt;br /&gt;
:Synchronises the channels&lt;br /&gt;
&lt;br /&gt;
=== idAFEntity_Base ===&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getAngularVelocityB&#039;&#039;&#039;(float id); ====&lt;br /&gt;
&lt;br /&gt;
:Get the angular velocitiy of a particular body Returns (0,0,0) if the body ID is invalid.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getLinearVelocityB&#039;&#039;&#039;(float id); ====&lt;br /&gt;
&lt;br /&gt;
:Get the linear velocitiy of a particular body Returns (0,0,0) if the body ID is invalid.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getNumBodies&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of bodies in the AF. If the AF physics pointer is NULL, it returns 0.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;restoreAddedEnts&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAngularVelocityB&#039;&#039;&#039;(vector velocity, float id); ====&lt;br /&gt;
&lt;br /&gt;
:Set the angular velocity of a particular body&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;SetConstraintPosition&#039;&#039;&#039;(string constraintName, vector position); ====&lt;br /&gt;
&lt;br /&gt;
:Moves the constraint with the given name that binds this entity to another entity.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setLinearVelocityB&#039;&#039;&#039;(vector velocity, float id); ====&lt;br /&gt;
&lt;br /&gt;
:Set the linear velocity of a particular body&lt;br /&gt;
&lt;br /&gt;
=== idAFEntity_Gibbable ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;gib&#039;&#039;&#039;(string damageDefName); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
=== idAFEntity_Generic ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idAFEntity_WithAttachedHead ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== CAIVehicle ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearController&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Need separate clearController because scripting doesn&#039;t like passing in $null_entity? (greebo: one could remove this function and set the argument type of setController to &#039;E&#039;.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;frobRidable&#039;&#039;&#039;(entity playerController); ====&lt;br /&gt;
&lt;br /&gt;
:Called when a player directly mounts or dismounts a ridable AI.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getMoveAnim&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the name of the player-requested movement anim for a player controlled AI vehicle&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setController&#039;&#039;&#039;(entity playerController); ====&lt;br /&gt;
&lt;br /&gt;
:Let a player assume movement control of an AI vehicle (may be remote control as in a player on a coach pulled by a horse)&lt;br /&gt;
&lt;br /&gt;
=== idCombatNode ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;markUsed&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Disables the combat node if &amp;quot;use_once&amp;quot; is set on the entity.&lt;br /&gt;
&lt;br /&gt;
=== idAI ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;alert&#039;&#039;&#039;(string type, float val); ====&lt;br /&gt;
&lt;br /&gt;
:ai generalized alerts&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;alertAI&#039;&#039;&#039;(string type, float amount, entity actor); ====&lt;br /&gt;
&lt;br /&gt;
:internal&lt;br /&gt;
::&#039;&#039;type&#039;&#039;: alert type&lt;br /&gt;
::&#039;&#039;amount&#039;&#039;: alert amount&lt;br /&gt;
::&#039;&#039;actor&#039;&#039;: actor causing alert&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;allowDamage&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:The AI can take damage again.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;allowHiddenMovement&#039;&#039;&#039;(float enable); ====&lt;br /&gt;
&lt;br /&gt;
:Normally, when hidden, monsters do not run physics. This enables physics when hidden.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;allowMovement&#039;&#039;&#039;(float allow); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;animTurn&#039;&#039;&#039;(float angle); ====&lt;br /&gt;
&lt;br /&gt;
:Enable/disable animation controlled turning.&lt;br /&gt;
::&#039;&#039;angle&#039;&#039;: Pass in the maximum # of degrees the animation turns. Use an amount of 0 to disable.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;attackBegin&#039;&#039;&#039;(string damageDef); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;attackEnd&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;attackMelee&#039;&#039;&#039;(string damageDef); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the attack hit&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;attackMissile&#039;&#039;&#039;(string jointName); ====&lt;br /&gt;
&lt;br /&gt;
:returns projectile fired&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;bark&#039;&#039;&#039;(string sound); ====&lt;br /&gt;
&lt;br /&gt;
:Let the AI bark a certain sound.&lt;br /&gt;
::&#039;&#039;sound&#039;&#039;: sound name, e.g. &#039;snd_warn_response&#039;&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;becomeNonSolid&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Makes the moveable non-solid for other entities.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;becomeRagdoll&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:enables the ragdoll if the entity has one&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;becomeSolid&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;burn&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canBecomeSolid&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canHitEnemy&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canHitEnemyFromAnim&#039;&#039;&#039;(string anim); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canHitEnemyFromJoint&#039;&#039;&#039;(string jointname); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canReachEnemy&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if character can walk to enemy&#039;s position. For walking monsters, enemy should be near the floor.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canReachEntity&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if character can walk to entity&#039;s position. For walking monsters, entity should be near the floor.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canReachPosition&#039;&#039;&#039;(vector pos); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if character can walk to specified position. For walking monsters, position should be near the floor.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canSee&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canSeeExt&#039;&#039;&#039;(entity ent, float b_useFOV, float b_useLighting); ====&lt;br /&gt;
&lt;br /&gt;
:This is an alternate version of canSee that can optionally choose to use field of vision and lighting calculations.&lt;br /&gt;
::&#039;&#039;b_useFOV&#039;&#039;: If 0 the entity will be visible even if the AI&#039;s back is turned to it&lt;br /&gt;
::&#039;&#039;b_useLighting&#039;&#039;: If b_useLighting is 0 the entity will be visible in complete darkness. If it is 1, the entity will only be visible if there is light shining on it, but the slightest light is enought. Use &amp;quot;isEntityHidden&amp;quot; as a script event with a threshold instead.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canSeePositionExt&#039;&#039;&#039;(vector position, float b_useFOV, float b_useLighting); ====&lt;br /&gt;
&lt;br /&gt;
:This is an alternate version of canSeeExt that tests a location rather than an entity. Note that any actor at the position may make it not seeable from a distance.&lt;br /&gt;
::&#039;&#039;b_useFOV&#039;&#039;: If 0 the entity will be visible even if the AI&#039;s back is turned to it&lt;br /&gt;
::&#039;&#039;b_useLighting&#039;&#039;: If 0 the entity will be visible in complete darkness&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;chargeAttack&#039;&#039;&#039;(string damageDef); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearBurn&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearEnemy&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Clears the enemy entity&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearFlyOffset&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the preferred height relative to the player&#039;s view height to fly at to the value set in the def file.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;closestReachableEnemy&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Used for determining tactile alert targets&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;closestReachableEnemyOfEntity&#039;&#039;&#039;(entity team_mate); ====&lt;br /&gt;
&lt;br /&gt;
:Finds another character&#039;s closest reachable enemy&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;createMissile&#039;&#039;&#039;(string jointname); ====&lt;br /&gt;
&lt;br /&gt;
:returns projectile created&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;createMissileFromDef&#039;&#039;&#039;(string defName, string jointName); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;directDamage&#039;&#039;&#039;(entity damageTarget, string damageDef); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disableAFPush&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disableClip&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disableGravity&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;dropTorch&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;emptyHand&#039;&#039;&#039;(string hand); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enableAFPush&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enableClip&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enableGravity&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;endState&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Ends the current state with the given name, returns TRUE if more than one state is remaining.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;enemyInCombatCone&#039;&#039;&#039;(entity combatNode, float use_current_enemy_location); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;enemyPositionValid&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;enemyRange&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;enemyRange2D&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;entityInAttackCone&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;faceEnemy&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;faceEntity&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;facingIdeal&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;findActorsInBounds&#039;&#039;&#039;(vector mins, vector maxs); ====&lt;br /&gt;
&lt;br /&gt;
:Returns an entity within the bounds specified&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;findEnemy&#039;&#039;&#039;(float onlyInFov); ====&lt;br /&gt;
&lt;br /&gt;
:Finds enemy player in PVS&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;findEnemyAI&#039;&#039;&#039;(float onlyInFov); ====&lt;br /&gt;
&lt;br /&gt;
:Finds enemy monster in PVS&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;findEnemyInCombatNodes&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Finds enemy player in attack cones&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;findFriendlyAI&#039;&#039;&#039;(float team); ====&lt;br /&gt;
&lt;br /&gt;
:Use this to find a visible AI friendly to ourselves. It basically iterates over all active entities in the map and looks for friendly actors. The pythagorean distance is taken to evaluate the distance.  Don&#039;t call this every frame, this might get expensive in larger maps. Returns the nearest visible actor entity or the $null_entity, if none was found.&lt;br /&gt;
::&#039;&#039;team&#039;&#039;: used to constrain the search to a given team. Set this to -1 to let the code ignore this argument&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;fireMissileAtTarget&#039;&#039;&#039;(string jointname, string targetname); ====&lt;br /&gt;
&lt;br /&gt;
:Launches a missile at entity specified by &#039;attack_target&#039;.  returns projectile fired&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;flee&#039;&#039;&#039;(entity entToFleeFrom); ====&lt;br /&gt;
&lt;br /&gt;
:Flee from the given entity.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;fleeFromPoint&#039;&#039;&#039;(vector pos); ====&lt;br /&gt;
&lt;br /&gt;
:Flee from the given position.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;foundBody&#039;&#039;&#039;(entity body); ====&lt;br /&gt;
&lt;br /&gt;
:Objective callback for when an AI finds a body.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Gas_Knockout&#039;&#039;&#039;(entity inflictor); ====&lt;br /&gt;
&lt;br /&gt;
:AI knockout&lt;br /&gt;
::&#039;&#039;inflictor&#039;&#039;: the entity causing the knockout, can be the $null_entity&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getAcuity&#039;&#039;&#039;(string type); ====&lt;br /&gt;
&lt;br /&gt;
:ai generalized alerts&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getAlertActor&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get the actor that alerted the AI in this frame.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getAlertLevelOfOtherAI&#039;&#039;&#039;(entity otherEntity); ====&lt;br /&gt;
&lt;br /&gt;
:This event gets the alert number of another AI (AI_AlertLevel variable value) Returns the alert number of the other AI, 0.0 if its not an AI or is NULL&lt;br /&gt;
::&#039;&#039;otherEntity&#039;&#039;: the other AI entity who&#039;s alert number is being queried&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getAttacker&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the attacking entity&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getAudThresh&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getClosestHiddenTarget&#039;&#039;&#039;(string entity_type); ====&lt;br /&gt;
&lt;br /&gt;
:Finds the closest targeted entity of the specified type.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getCombatNode&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getCurrentYaw&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getEnemy&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getEnemyEyePos&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getEnemyPos&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getJumpVelocity&#039;&#039;&#039;(vector pos, float speed, float max_jump_height); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMoveType&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current movetype&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getNextIdleAnim&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:This returns the name of the next idle anim to be played on this AI (used by AnimState scripts).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getObservationPosition&#039;&#039;&#039;(vector targetPoint, float visualAcuityZeroToOne); ====&lt;br /&gt;
&lt;br /&gt;
:This event is used to get a position that the AI can move to observe a  given position.  It is useful for looking at hiding spots that can&#039;t be reached, and performing other investigation functions.  Returns a world position from which the observation can take place. Returns the current AI origin if no such point is found.  @sideEffect This uses the AI_DEST_UNREACHABLE flag variable  to indicate if a point was found. It will be true if none was found, false if one was found.&lt;br /&gt;
::&#039;&#039;targetPoint&#039;&#039;: the world position to be observed&lt;br /&gt;
::&#039;&#039;visualAcuityZeroToOne&#039;&#039;: the visual acuity of the AI on a scale of 0.0 to 1.0 where 0.0 is blind and 1.0 is perfect vision.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getObstacle&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the obstacle in the character&#039;s path&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getRandomTarget&#039;&#039;&#039;(string entity_type); ====&lt;br /&gt;
&lt;br /&gt;
:Finds a random targeted entity of the specified type.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getReachableEntityPosition&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the position of the entity within the AAS if possible, otherwise just the entity position.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getRelationEnt&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getSndDir&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:ai hearing of sound &lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getTactEnt&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:ai sense of touch&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getTalkTarget&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the entity (player) trying to talk to the character&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getTurnDelta&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getTurnRate&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the rate the character turns.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getVectorToIdealOrigin&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the vector from where the AI is to where he ideally should be&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getVisDir&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns position of the last visual alert.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;hasSeenEvidence&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:This returns 1 when the AI has seen evidence of intruders before (an enemy, a body...)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ignoreDamage&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:The AI can no longer take damage.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isEntityHidden&#039;&#039;&#039;(entity ent, float f_sightThreshold); ====&lt;br /&gt;
&lt;br /&gt;
:This is an alternate version of canSee, using FOV, distance and lighting.&lt;br /&gt;
::&#039;&#039;f_sightThreshold&#039;&#039;: goes from 0.0 (entity visible in complete darkness) to 1.0 (entity only visible if completely lit up).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isPlayerResponsibleForDeath&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the player was responsible for the AI&#039;s caller&#039;s death.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;kickObstacles&#039;&#039;&#039;(entity kickEnt, float force); ====&lt;br /&gt;
&lt;br /&gt;
:Kicks any obstacle in the character&#039;s path.&lt;br /&gt;
::&#039;&#039;kickEnt&#039;&#039;: pass in $null_entity if you don&#039;t have a specific entity to kick&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;kill&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Kills the monster.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;KO_Knockout&#039;&#039;&#039;(entity inflictor); ====&lt;br /&gt;
&lt;br /&gt;
:AI knockout&lt;br /&gt;
::&#039;&#039;inflictor&#039;&#039;: is the entity causing the knockout, can be the $null_entity&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;launchMissile&#039;&#039;&#039;(vector origin, vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the projectile entity&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;locateEnemy&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Updates the last known position of the enemy independent from whether or not the enemy is visible.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;lookAt&#039;&#039;&#039;(entity focusEntity, float duration); ====&lt;br /&gt;
&lt;br /&gt;
:Aims the character&#039;s eyes and head toward an entity for a period of time.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;lookAtAngles&#039;&#039;&#039;(float yawAngleClockwise, float pitchAngleUp, float rollAngle, float durationInSeconds); ====&lt;br /&gt;
&lt;br /&gt;
:A look at event that just looks at a set of angles relative  to the current body facing of the AI. This method is just like the vanilla Doom3 lookAt and lookAtEnemy methods, but it looks at the specified angles from the current body facing of the AI.&lt;br /&gt;
::&#039;&#039;yawAngleClockwise&#039;&#039;: Negative angles are to the left of  the AIs body and positive angles are to the right.&lt;br /&gt;
::&#039;&#039;pitchAngleUp&#039;&#039;: Negative values are down and positive values are up  where down and up are defined by the body axis.&lt;br /&gt;
::&#039;&#039;rollAngle&#039;&#039;: This is currently unused and does nothing.&lt;br /&gt;
::&#039;&#039;durationInSeconds&#039;&#039;: The duration to look in seconds.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;lookAtEnemy&#039;&#039;&#039;(float duration); ====&lt;br /&gt;
&lt;br /&gt;
:Aims the character&#039;s eyes and head toward the current enemy for a period of time.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;lookAtPosition&#039;&#039;&#039;(vector lookAtWorldPosition, float durationInSeconds); ====&lt;br /&gt;
&lt;br /&gt;
:This method is just like the vanilla Doom3 lookAt and lookAtEnemy methods, but instead of looking at an entity, it looks at a position in worldspace.  That is, it turns the head of the AI to look at the position.&lt;br /&gt;
::&#039;&#039;lookAtWorldPosition&#039;&#039;: position in space to look at&lt;br /&gt;
::&#039;&#039;durationInSeconds&#039;&#039;: duration to look in seconds&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;meleeAttackToJoint&#039;&#039;&#039;(string joint, string damageDef); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveOutOfRange&#039;&#039;&#039;(entity ent, float range); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;moveStatus&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveToAttackPosition&#039;&#039;&#039;(entity ent, string attack_anim); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveToCover&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveToCoverFrom&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveToEnemy&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveToEnemyHeight&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveToEntity&#039;&#039;&#039;(entity destination); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveToPosition&#039;&#039;&#039;(vector position); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;muzzleFlash&#039;&#039;&#039;(string jointname); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;numSmokeEmitters&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the # of emitters defined by &#039;smokeParticleSystem&#039; in the entitydef&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;performRelight&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Deal with doused lights.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;playAndLipSync&#039;&#039;&#039;(string soundName, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Play the given sound, using the given lipsync animation. The lipsync animation should just be a simple non-loopable animation of the mouth opening in a linear fashion. The code will select individual frames from this to construct a simple lipsyncing effect which is in time with the sound.  Returns the length of the played sound in seconds.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;playCustomAnim&#039;&#039;&#039;(string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Plays the given animation on legs and torso. Returns false if anim doesn&#039;t exist.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;preBurn&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;predictEnemyPos&#039;&#039;&#039;(float time); ====&lt;br /&gt;
&lt;br /&gt;
:Tries to predict the player&#039;s movement based on the AAS and his direction of movement.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;processBlindStim&#039;&#039;&#039;(entity stimSource, float skipVisibilityCheck); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;processVisualStim&#039;&#039;&#039;(entity stimSource); ====&lt;br /&gt;
&lt;br /&gt;
:Use this call to let the AI react to a visual stim (coming from the source entity).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;pushPointIntoAAS&#039;&#039;&#039;(vector post); ====&lt;br /&gt;
&lt;br /&gt;
:Tries to push the point into a valid AAS area&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;pushState&#039;&#039;&#039;(string stateName); ====&lt;br /&gt;
&lt;br /&gt;
:Pushes the state with the given name, current one is postponed.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;radiusDamageFromJoint&#039;&#039;&#039;(string jointname, string damageDef); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;randomPath&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;restartPatrol&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;restoreMove&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;saveMove&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAcuity&#039;&#039;&#039;(string type, float val); ====&lt;br /&gt;
&lt;br /&gt;
:ai generalized alerts&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAlertGracePeriod&#039;&#039;&#039;(float frac, float duration, float count); ====&lt;br /&gt;
&lt;br /&gt;
:This starts the alert grace period for an AI. Should be called in the same frame as the alert that pushes them into a higher state.&lt;br /&gt;
::&#039;&#039;frac&#039;&#039;: the fraction of the alert below which they should ignore alerts during the grace period.&lt;br /&gt;
::&#039;&#039;duration&#039;&#039;: the duration of the period in seconds&lt;br /&gt;
::&#039;&#039;count&#039;&#039;: the number of alerts ignored above which the grace period is invalid&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAlertLevel&#039;&#039;&#039;(float newLevel); ====&lt;br /&gt;
&lt;br /&gt;
:Set the alert level (AI_AlertLevel). This should always be called instead of setting AI_AlertLevel directly.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAudThresh&#039;&#039;&#039;(float val); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setBoneMod&#039;&#039;&#039;(float allowBoneMod); ====&lt;br /&gt;
&lt;br /&gt;
:Enables or disables head looking (may be obsolete).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setEnemy&#039;&#039;&#039;(entity enemy); ====&lt;br /&gt;
&lt;br /&gt;
:Make the given entity an enemy.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setFlyOffset&#039;&#039;&#039;(float offset); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the preferred height relative to the player&#039;s view height to fly at.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setFlySpeed&#039;&#039;&#039;(float speed); ====&lt;br /&gt;
&lt;br /&gt;
:Set the speed flying creatures move at. Also sets speed for moveTypeSlide.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setMoveType&#039;&#039;&#039;(float movetype); ====&lt;br /&gt;
&lt;br /&gt;
:Set the current movetype.  movetypes are defined in tdm_ai.script&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSmokeVisibility&#039;&#039;&#039;(float particle_num, float on); ====&lt;br /&gt;
&lt;br /&gt;
:enables/disables smoke particles on bones.  pass in the particle #, or ALL_PARTICLES for turning on/off all particle systems. particles are spawned in the order they appear in the entityDef&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setTalkState&#039;&#039;&#039;(float state); ====&lt;br /&gt;
&lt;br /&gt;
:Sets whether the player can talk to this character or not.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setTalkTarget&#039;&#039;&#039;(entity target); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the entity (player) trying to talk to the character&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setTurnRate&#039;&#039;&#039;(float rate); ====&lt;br /&gt;
&lt;br /&gt;
:Set the rate the character turns at&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;shrivel&#039;&#039;&#039;(float time); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;slideTo&#039;&#039;&#039;(vector position, float time); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;spawnThrowableProjectile&#039;&#039;&#039;(string projectileName, string jointName); ====&lt;br /&gt;
&lt;br /&gt;
:This method spawns a projectile of the type named by the caller and attaches it to the joint given by the caller.  The projectile becomes the AI&#039;s firable projectile. Returns a pointer to a projectile entity that can be  thrown by the AI. You can use AI_LaunchMissle (e* = launchMissle(v,v) ) to throw the stone.&lt;br /&gt;
::&#039;&#039;projectileName&#039;&#039;: The name of the projectile to spawn (as seen in a .def file) Must be descended from idProjectile&lt;br /&gt;
::&#039;&#039;jointName&#039;&#039;: The name of the joint on the model to which the particle should be attached for throwing. If this is NULL or the empty string, then it is attached to the model center.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopMove&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopPatrol&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Stops an AI from patrolling&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopRagdoll&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:turns off the ragdoll&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopThinking&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;switchState&#039;&#039;&#039;(string stateName); ====&lt;br /&gt;
&lt;br /&gt;
:Switches to the state with the given name, current one is ended.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;testAnimAttack&#039;&#039;&#039;(string animname); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;testAnimMove&#039;&#039;&#039;(string animname); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;testAnimMoveTowardEnemy&#039;&#039;&#039;(string animname); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;testChargeAttack&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;testMeleeAttack&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;testMoveToPosition&#039;&#039;&#039;(vector position); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;throwAF&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;throwMoveable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;travelDistanceBetweenEntities&#039;&#039;&#039;(entity source, entity dest); ====&lt;br /&gt;
&lt;br /&gt;
:Approximate travel distance between two entities.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;travelDistanceBetweenPoints&#039;&#039;&#039;(vector source, vector dest); ====&lt;br /&gt;
&lt;br /&gt;
:Approximate travel distance between two points.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;travelDistanceToEntity&#039;&#039;&#039;(entity destination); ====&lt;br /&gt;
&lt;br /&gt;
:Approximate travel distance to entity.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;travelDistanceToPoint&#039;&#039;&#039;(vector destination); ====&lt;br /&gt;
&lt;br /&gt;
:Approximate travel distance to point.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;triggerParticles&#039;&#039;&#039;(string jointName); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;turnTo&#039;&#039;&#039;(float yaw); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;turnToEntity&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;turnToPos&#039;&#039;&#039;(vector pos); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;visScan&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Checks for enemies or player in the AI&#039;s FOV, using light level and distance. For now the check is only done on the player.  Returns a reference to the sighted actor.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;waitAction&#039;&#039;&#039;(string name); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;waitMove&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;wakeOnFlashlight&#039;&#039;&#039;(float enable); ====&lt;br /&gt;
&lt;br /&gt;
:Tells the monster to activate when flashlight shines on them.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;wander&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
=== idTestModel ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;leftFoot&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Changes to left foot and plays footstep sound.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;rightFoot&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Changes to right foot and plays footstep sound.&lt;br /&gt;
&lt;br /&gt;
=== CBinaryFrobMover ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Close&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Closes the frobmover, regardless of its previous state. Mover must be open, otherwise nothing happens.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;GetFractionalPosition&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a fraction between 0.00 (closed) and 1.00 (open).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;IsLocked&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true (nonzero) if the mover is currently locked.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;IsOpen&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true (nonzero) if the mover is open, which is basically the same as &amp;quot;not closed&amp;quot;. A mover is considered closed when it is at its close position.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;IsPickable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true (nonzero) if this frobmover is pickable.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Lock&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Locks the mover. Calls to Open() will not succeed after this call. &lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Open&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Opens the frobmover, regardless of its previous state. The mover will not move when it&#039;s locked. &lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;TDM_Lock_OnLockPicked&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:internal&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;TDM_Lock_StatusUpdate&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:internal&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ToggleLock&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Toggles the lock state. Unlocked movers will be locked and vice versa. The notes above concerning Unlock() still apply if this call unlocks the mover. &lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ToggleOpen&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Toggles the mover state. Closes when fully open, opens when fully closed. If the mover is &amp;quot;interrupted&amp;quot; (e.g. when the player frobbed the mover in between), the move direction depends on the state of the internal &amp;quot;intent_open&amp;quot; flag. &lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Unlock&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Unlocks the mover. Calls to Open() will succeed after this call. Depending on the value of the spawnarg &amp;quot;open_on_unlock&amp;quot; the mover might automatically open after this call. &lt;br /&gt;
&lt;br /&gt;
=== idBrittleFracture ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;dampenSound&#039;&#039;&#039;(float dampen); ====&lt;br /&gt;
&lt;br /&gt;
:Toggle whether the shattering sound is dampened on the window, e.g., when covered by moss.&lt;br /&gt;
::&#039;&#039;dampen&#039;&#039;: 1 = dampened, 0 = not dampened&lt;br /&gt;
&lt;br /&gt;
=== idCameraView ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idCameraAnim ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;start&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Starts a spline or anim camera moving.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stop&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Stops a spline or anim camera moving.&lt;br /&gt;
&lt;br /&gt;
=== idFuncEmitter ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;emitterAddModel&#039;&#039;&#039;(string modelName, vector modelOffset); ====&lt;br /&gt;
&lt;br /&gt;
:Adds a new particle (or regular, if you wish) model to the emitter, located at modelOffset units away from the emitter&#039;s origin.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;emitterGetNumModels&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of models/particles this emitter has. Always &amp;gt;= 1.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Off&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Switches the emitter off.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;On&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Switches the emitter on.&lt;br /&gt;
&lt;br /&gt;
=== idEntity ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activateContacts&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Activate objects sitting on this object.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activateTargets&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Causes this entity to activate all it&#039;s targets. Similar to how a trigger activates entities.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;addFrobPeer&#039;&#039;&#039;(entity peer); ====&lt;br /&gt;
&lt;br /&gt;
:Adds the passed entity as a frob peer.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;addInvItem&#039;&#039;&#039;(entity inv_item); ====&lt;br /&gt;
&lt;br /&gt;
:Adds the given item to the inventory. Depending on the type the passed entity will be removed from the game (as for loot items) or hidden.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;addItemToInv&#039;&#039;&#039;(entity target); ====&lt;br /&gt;
&lt;br /&gt;
:Adds the entity to the given entity&#039;s inventory. Depending on the type the entity will be removed from the game (as for loot items) or hidden. Example: $book-&amp;gt;addItemToInv($player1);&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;addTarget&#039;&#039;&#039;(entity target); ====&lt;br /&gt;
&lt;br /&gt;
:Add a target to this entity.&lt;br /&gt;
::&#039;&#039;target&#039;&#039;: the entity to add as target&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;applyImpulse&#039;&#039;&#039;(entity source, float bodyid, vector point, vector impulse); ====&lt;br /&gt;
&lt;br /&gt;
:Applies an impulse to the entity. Example: entity.applyImpulse($player1, 0, entity.getOrigin(), &#039;0 0 2&#039;);&lt;br /&gt;
::&#039;&#039;source&#039;&#039;: Pass $null_entity or the entity that applies the impulse&lt;br /&gt;
::&#039;&#039;bodyid&#039;&#039;: For articulated figures, ID of the body, 0 for the first (main) body. Otherwise use 0.&lt;br /&gt;
::&#039;&#039;point&#039;&#039;: Point on the body where the impulse is applied to&lt;br /&gt;
::&#039;&#039;impulse&#039;&#039;: Vector of the impulse&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;bind&#039;&#039;&#039;(entity master); ====&lt;br /&gt;
&lt;br /&gt;
:Fixes this entity&#039;s position and orientation relative to another entity, such that when the master entity moves, so does this entity.&lt;br /&gt;
::&#039;&#039;master&#039;&#039;: the entity to bind to&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;bindPosition&#039;&#039;&#039;(entity master); ====&lt;br /&gt;
&lt;br /&gt;
:Fixes this entity&#039;s position (but not orientation) relative to another entity, such that when the master entity moves, so does this entity.&lt;br /&gt;
::&#039;&#039;master&#039;&#039;: the entity to bind to&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;bindToBody&#039;&#039;&#039;(entity master, float bodyID, float orientated); ====&lt;br /&gt;
&lt;br /&gt;
:Bind to AF body&lt;br /&gt;
::&#039;&#039;master&#039;&#039;: entity to bind to&lt;br /&gt;
::&#039;&#039;bodyID&#039;&#039;: AF body ID to bind to&lt;br /&gt;
::&#039;&#039;orientated&#039;&#039;: binds the orientation as well as position, if set to 1&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;bindToJoint&#039;&#039;&#039;(entity master, string boneName, float rotateWithMaster); ====&lt;br /&gt;
&lt;br /&gt;
:Fixes this entity&#039;s position and orientation relative to a bone on another entity, such that when the master&#039;s bone moves, so does this entity.&lt;br /&gt;
::&#039;&#039;master&#039;&#039;: the entity to bind to&lt;br /&gt;
::&#039;&#039;boneName&#039;&#039;: the bone name&lt;br /&gt;
::&#039;&#039;rotateWithMaster&#039;&#039;: -&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;cacheSoundShader&#039;&#039;&#039;(string shaderName); ====&lt;br /&gt;
&lt;br /&gt;
:Ensure the specified sound shader is loaded by the system. Prevents cache misses when playing sound shaders.&lt;br /&gt;
::&#039;&#039;shaderName&#039;&#039;: the sound shader to cache&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;callFunction&#039;&#039;&#039;(string functionName); ====&lt;br /&gt;
&lt;br /&gt;
:Calls a function on an entity&#039;s script object. See also callGlobalFunction().&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;callGlobalFunction&#039;&#039;&#039;(string functionName, entity other); ====&lt;br /&gt;
&lt;br /&gt;
:calls a global function and passes the other entity along as the first argument calls the function in a new thread, so it continues executing in the current thread right away (unlike entity.callFunction( &amp;quot;blah&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;callGui&#039;&#039;&#039;(float handle, string namedEvent); ====&lt;br /&gt;
&lt;br /&gt;
:Calls a named event in a GUI.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canBeUsedBy&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the entity can be used by the argument entity&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canSeeEntity&#039;&#039;&#039;(entity target, float useLighting); ====&lt;br /&gt;
&lt;br /&gt;
:This is a general version of idAI::canSee, that can be used by all entities. It doesn&#039;t regard FOV, it just performs a trace to check whether the target is occluded by world geometry. Is probably useful for stim/response as well Pass useLighting = true to take the lighting of the target entity into account. Use &amp;quot;isEntityHidden&amp;quot; as a script event with a threshold. The constant threshold value for useLighting is defined within the SDK in game/entity.h.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;changeEntityRelation&#039;&#039;&#039;(entity ent, float relationChange); ====&lt;br /&gt;
&lt;br /&gt;
:This changes the current relation to an entity by adding the new amount.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;changeInvIcon&#039;&#039;&#039;(string name, string category, string icon); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the inventory icon of the given item in the given category to &amp;lt;icon&amp;gt;.&lt;br /&gt;
::&#039;&#039;name&#039;&#039;: name of the item&lt;br /&gt;
::&#039;&#039;category&#039;&#039;: the item&#039;s category&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;changeInvItemCount&#039;&#039;&#039;(string name, string category, float amount); ====&lt;br /&gt;
&lt;br /&gt;
:Decreases the inventory item stack count by amount. The item is addressed using the name and category of the item. These are usually defined on the inventory item entity (&amp;quot;inv_name&amp;quot;, &amp;quot;inv_category&amp;quot;)  Amount can be both negative and positive.&lt;br /&gt;
::&#039;&#039;name&#039;&#039;: name of the item&lt;br /&gt;
::&#039;&#039;category&#039;&#039;: the item&#039;s category&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;changeInvLightgemModifier&#039;&#039;&#039;(string name, string category, float amount); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the lightgem modifier value of the given item. Valid arguments are between 0 and 32 (which is the maximum lightgem value).&lt;br /&gt;
::&#039;&#039;name&#039;&#039;: name of the item&lt;br /&gt;
::&#039;&#039;category&#039;&#039;: the item&#039;s category&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;changeLootAmount&#039;&#039;&#039;(float type, float amount); ====&lt;br /&gt;
&lt;br /&gt;
:Changes the loot amount of the given Type (e.g. GOODS) by &amp;lt;amount&amp;gt;.  The mission statisic for loot found gets changed too.  The new value of the changed type is returned (e.g. the new GOODS value if this has been changed).  Note: The LOOT_TOTAL type can&#039;t be changed and 0 is returned.&lt;br /&gt;
::&#039;&#039;type&#039;&#039;: one of: LOOT_GOLD, LOOT_GOODS, LOOT_JEWELRY&lt;br /&gt;
::&#039;&#039;amount&#039;&#039;: can be negative&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;checkAbsence&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:description missing&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;copyBind&#039;&#039;&#039;(entity other); ====&lt;br /&gt;
&lt;br /&gt;
:copy bind information of other to this entity (i.e., bind this entity to the same entity that other is bound to)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;createOverlay&#039;&#039;&#039;(string guiFile, float layer); ====&lt;br /&gt;
&lt;br /&gt;
:Creates a GUI overlay. (must be used on the player)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;CreateTimer&#039;&#039;&#039;(float stimId, float hour, float minutes, float seconds, float milliseconds); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;createXrayOverlay&#039;&#039;&#039;(string guiFile); ====&lt;br /&gt;
&lt;br /&gt;
:Creates a GUI overlay with X-ray material. (must be used on the player)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;damage&#039;&#039;&#039;(entity inflictor, entity attacker, vector dir, string damageDefName, float damageScale); ====&lt;br /&gt;
&lt;br /&gt;
:Deals damage to this entity (gets translated into the idEntity::Damage() method within the SDK).&lt;br /&gt;
::&#039;&#039;inflictor&#039;&#039;: the entity causing the damage (maybe a projectile)&lt;br /&gt;
::&#039;&#039;attacker&#039;&#039;: the &amp;quot;parent&amp;quot; entity of the inflictor, the one that is responsible for the inflictor (can be the same)&lt;br /&gt;
::&#039;&#039;dir&#039;&#039;: the direction the attack is coming from.&lt;br /&gt;
::&#039;&#039;damageDefName&#039;&#039;: the name of the damage entityDef to know what damage is being dealt to &amp;lt;self&amp;gt; (e.g. &amp;quot;damage_lava&amp;quot;)&lt;br /&gt;
::&#039;&#039;damageScale&#039;&#039;: the scale of the damage (pass 1.0 as default, this should be ok).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;destroyOverlay&#039;&#039;&#039;(float handle); ====&lt;br /&gt;
&lt;br /&gt;
:Destroys a GUI overlay. (must be used on the player)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;distanceTo&#039;&#039;&#039;(entity other); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the distance of this entity to another entity.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;distanceToPoint&#039;&#039;&#039;(vector point); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the distance of this entity to a point.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;extinguishLights&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Extinguishes all lights (i.e. the &amp;lt;self&amp;gt; entity plus all bound lights)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;fadeSound&#039;&#039;&#039;(float channel, float newLevel, float fadeTime); ====&lt;br /&gt;
&lt;br /&gt;
:Fades the sound on this entity to a new level over a period of time.  Use SND_CHANNEL_ANY for all currently playing sounds.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;frob&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Frobs the entity (i.e. simulates a frob action performed by the player). Returns TRUE if the entity is frobable, FALSE otherwise.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;frobHilight&#039;&#039;&#039;(float state); ====&lt;br /&gt;
&lt;br /&gt;
:ishtvan: Tries to make the entity frobhilight or not&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getAngles&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current orientation of this entity (relative to bind parent if any).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getAngularVelocity&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the current angular velocity of this entity. The angular velocity of a physics object is a vector that passes through the center of mass. The direction of this vector defines the axis of rotation and the magnitude defines the rate of rotation about the axis in radians per second.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getBindChild&#039;&#039;&#039;(float ind); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the ind_th bind child of this entity or NULL if index is invalid. NOTE: indices start at zero&lt;br /&gt;
::&#039;&#039;ind&#039;&#039;: child index&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getBindMaster&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the entity&#039;s bindmaster&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getBoolKey&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Retrieves the boolean value of a specific spawn arg, defaulting to false.&lt;br /&gt;
::&#039;&#039;key&#039;&#039;: spawnarg name&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getClipMask&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the clipmask of the physics object.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getColor&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the color of this entity (shader parms Parm0, Parm1, Parm2).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getContents&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the contents of the physics object.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getCurInvCategory&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the name of the currently highlighted inventory category.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getCurInvIcon&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the icon of the currently highlighted inventory item.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getCurInvItemCount&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the item count of the currently highlighted inventory Item, if stackable.Returns - 1 if non - stackable&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getCurInvItemEntity&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the currently highlighted inventory item entity.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getCurInvItemId&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the name of the currently highlighted inventory item (the one defined in &amp;quot;inv_item_id&amp;quot;). Most items will return an empty string, unless the &amp;quot;inv_item_id&amp;quot; is set on purpose.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getCurInvItemName&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the name of the currently highlighted inventory item (the one defined in &amp;quot;inv_name&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getEntityFlag&#039;&#039;&#039;(string flagName); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the value of the specified entity flag.&lt;br /&gt;
::&#039;&#039;flagName&#039;&#039;: Can be one of (case insensitive): 	notarget: if true never attack or target this entity 	noknockback: if true no knockback from hits 	takedamage: if true this entity can be damaged 	hidden: if true this entity is not visible 	bindOrientated: if true both the master orientation is used for binding 	solidForTeam: if true this entity is considered solid when a physics team mate pushes entities 	forcePhysicsUpdate: if true always update from the physics whether the object moved or not 	selected: if true the entity is selected for editing 	neverDormant: if true the entity never goes dormant 	isDormant: if true the entity is dormant 	hasAwakened: before a monster has been awakened the first time, use full PVS for dormant instead of area-connected 	invisible: if true this entity cannot be seen 	inaudible: if true this entity cannot be heard &lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getEntityKey&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Retrieves the entity specified by the spawn arg.&lt;br /&gt;
::&#039;&#039;key&#039;&#039;: spawnarg name&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getFloatKey&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Retrieves the floating point value of a specific spawn arg, defaulting to 0.0f.&lt;br /&gt;
::&#039;&#039;key&#039;&#039;: spawnarg name&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getGui&#039;&#039;&#039;(float handle); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the file currently loaded by a GUI.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getGuiFloat&#039;&#039;&#039;(float handle, string key); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a GUI parameter.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getGuiInt&#039;&#039;&#039;(float handle, string key); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a GUI parameter.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getGuiString&#039;&#039;&#039;(float handle, string key); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a GUI parameter.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getHealth&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current health.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getIntKey&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Retrieves the integer value of a specific spawn arg, defaulting to 0.&lt;br /&gt;
::&#039;&#039;key&#039;&#039;: spawnarg name&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getKey&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Retrieves the value of a specific spawn arg, defaulting to &#039;&#039;.&lt;br /&gt;
::&#039;&#039;key&#039;&#039;: spawnarg name&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getLightInPVS&#039;&#039;&#039;(float falloff, float scaling); ====&lt;br /&gt;
&lt;br /&gt;
:Computes the sum of all light in the PVS of the entity you call this on, and returns a vector with the sum.&lt;br /&gt;
::&#039;&#039;falloff&#039;&#039;: 0: no falloff with distance  0.5: sqrt(linear) falloff	(dist 100 =&amp;gt; 1/10)  1: linear falloff			(dist 100 =&amp;gt; 1/100)  2: square falloff			(dist 100 =&amp;gt; 1/10000) &lt;br /&gt;
::&#039;&#039;scaling&#039;&#039;: factor to scale the distance, can be used to lower/raise distance factor  after the linear or square scaling has been used good looking values are approx: sqrt(linear): 0.01, linear: 0.1, square 1.0&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getLinearVelocity&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the current linear velocity of this entity. The linear velocity of a physics object is a vector that defines the translation of the center of mass in units per second.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getLocation&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the idLocation entity corresponding to the entity&#039;s current location. This was player-specific before, but is now available to all entities.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getLootAmount&#039;&#039;&#039;(float type); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the amount of loot for the given type (e.g. LOOT_GOODS). Pass LOOT_TOTAL to return the sum of all loot types.&lt;br /&gt;
::&#039;&#039;type&#039;&#039;: one of: LOOT_GOLD, LOOT_GOODS, LOOT_JEWELRY, LOOT_TOTAL&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMass&#039;&#039;&#039;(float body); ====&lt;br /&gt;
&lt;br /&gt;
:Gets mass of a body for an entity&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMaxHealth&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the max health of this entity.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getMaxs&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the maximum corner of this entity&#039;s bounding box.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getMins&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the minimum corner of this entity&#039;s bounding box.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getName&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the name of this entity.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getNextInvItem&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Cycles the standard cursor to the next inventory item. Returns the item entity pointed to after the operation is complete.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getNextKey&#039;&#039;&#039;(string prefix, string lastMatch); ====&lt;br /&gt;
&lt;br /&gt;
:Searches for the name of a spawn arg that matches the prefix.  For example, passing in &amp;quot;attack_target&amp;quot; matches &amp;quot;attack_target1&amp;quot;, &amp;quot;attack_targetx&amp;quot;, &amp;quot;attack_target_enemy&amp;quot;,  etc. The returned string is the name of the key which can then be passed into functions like getKey() to lookup the value of that spawn arg.  This is useful for when you have multiple values to look up, like when you target multiple objects.  To find the next matching key, pass in the previous result and the next key returned will be the first one that matches after the previous result. Pass in &amp;quot;&amp;quot; to get the first match. Passing in a non-existent key is the same as passing in &amp;quot;&amp;quot;. Returns &amp;quot;&amp;quot; when no  more keys match.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getOrigin&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current position of this entity (relative to bind parent if any).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getPrevInvItem&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Cycles the standard cursor to the previous inventory item. Returns the item entity pointed to after the operation is complete.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;GetResponseEntity&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the entity which should take the response. Some entities like AI heads are not responding themselves to stims, but relay it to another entity (i.e. the bodies they&#039;re attached to).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getShaderParm&#039;&#039;&#039;(float parm); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the value of the specified shader parm.&lt;br /&gt;
::&#039;&#039;parm&#039;&#039;: shader parm index&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getSize&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the size of this entity&#039;s bounding box.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getSoundVolume&#039;&#039;&#039;(string soundName); ====&lt;br /&gt;
&lt;br /&gt;
:Get the volume of the sound to play.&lt;br /&gt;
::&#039;&#039;soundName&#039;&#039;: the name of the sound&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getTarget&#039;&#039;&#039;(float num); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the requested target entity.&lt;br /&gt;
::&#039;&#039;num&#039;&#039;: The target number. Starts at 0.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getTeam&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current team number.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getVectorKey&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Retrieves the vector value of a specific spawn arg, defaulting to &#039;0 0 0&#039;.&lt;br /&gt;
::&#039;&#039;key&#039;&#039;: spawnarg name&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getVinePlantLoc&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Event important to the growing of vines from vine arrows&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getVinePlantNormal&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Event important to the growing of vines from vine arrows&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getWorldOrigin&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current world-space position of this entity (regardless of any bind parent).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;hasFunction&#039;&#039;&#039;(string functionName); ====&lt;br /&gt;
&lt;br /&gt;
:checks if an entity&#039;s script object has a specific function&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;hasInvItem&#039;&#039;&#039;(entity item); ====&lt;br /&gt;
&lt;br /&gt;
:Tests whether the player has the specified item entity in his inventory.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;heal&#039;&#039;&#039;(string healDefName, float healScale); ====&lt;br /&gt;
&lt;br /&gt;
:Heals the entity this is called on using the specified healing entityDef. Returns 1 if the entity could be healed, 0 otherwise (if the entity is already at full health, for ex.)&lt;br /&gt;
::&#039;&#039;healDefName&#039;&#039;: the name of the entityDef containing the healing information (e.g. &amp;quot;heal_potion&amp;quot;)&lt;br /&gt;
::&#039;&#039;healScale&#039;&#039;: the scaling value to be applied to the healAmount found in the healEntityDef&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;hide&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Makes this entity invisible.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;inPVS&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns non-zero if this entity is in PVS. For lights, it will return true when the light&#039;s bounding box is in PVS, even though the light may not actually be in PVS. (an unmoved shadowcasting light may not be visible to PVS areas its bounding box intersects with)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isDroppable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get whether an item may be dropped from the inventory&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isEnemy&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the given entity is an enemy.&lt;br /&gt;
::&#039;&#039;ent&#039;&#039;: The entity in question&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isFriend&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the given entity is a friend.&lt;br /&gt;
::&#039;&#039;ent&#039;&#039;: The entity in question&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isFrobable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get whether the entity is frobable&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isHidden&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:checks if the entity&#039;s model is invisible.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isHilighted&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if entity is currently frobhilighted.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isInLiquid&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns 1 if the entity is in or touching a liquid.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isLight&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isNeutral&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the given entity is neutral.&lt;br /&gt;
::&#039;&#039;ent&#039;&#039;: The entity in question&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isType&#039;&#039;&#039;(string spawnclass); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if this entity is of the given type.&lt;br /&gt;
::&#039;&#039;spawnclass&#039;&#039;: spawn class name&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;loadExternalData&#039;&#039;&#039;(string declFile, string prefix); ====&lt;br /&gt;
&lt;br /&gt;
:Load an external xdata declaration.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;noShadows&#039;&#039;&#039;(float noShadows); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the noShadow property on the entity to true/false, turning shadowcasting on or off for this entity.&lt;br /&gt;
::&#039;&#039;noShadows&#039;&#039;: 1 = disable shadows, 0 = enable shadows&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;noShadowsDelayed&#039;&#039;&#039;(float noShadows, float delay); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the noShadow property on the entity to true/false after delay in ms, turning shadows cast by this entity on or off.&lt;br /&gt;
::&#039;&#039;noShadows&#039;&#039;: 1 = disable shadows, 0 = enable shadows&lt;br /&gt;
::&#039;&#039;delay&#039;&#039;: delay in ms&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;numBindChildren&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of bound entities lower down in the bind chain than this entity, but be sure to give it the topmost bindmaster&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;numTargets&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of entities this entity has targeted.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;propagateSound&#039;&#039;&#039;(string soundName, float propVolMod, float msgTag); ====&lt;br /&gt;
&lt;br /&gt;
:Generates a propagated sound&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;propSound&#039;&#039;&#039;(string name); ====&lt;br /&gt;
&lt;br /&gt;
:Sound propagation scriptfunctions on all entities propagate a sound directly without playing an audible sound&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;propSoundMod&#039;&#039;&#039;(string name, float volMod); ====&lt;br /&gt;
&lt;br /&gt;
:propagate a sound directly with a volume modifier&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;randomTarget&#039;&#039;&#039;(string ignoreName); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a random targeted entity. Pass in an entity name to skip that entity.&lt;br /&gt;
::&#039;&#039;ignoreName&#039;&#039;: the name of an entity to ignore&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;rangedThreatTo&#039;&#039;&#039;(entity target); ====&lt;br /&gt;
&lt;br /&gt;
:Could this entity threaten the given (target) entity from a distance?&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;removeBinds&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Removes all attached entities from the game&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;removeFrobPeer&#039;&#039;&#039;(entity peer); ====&lt;br /&gt;
&lt;br /&gt;
:Removes the passed entity as a frob peer.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;removeKey&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Removes a key from an object&#039;s spawnargs, so things like getNextKey() don&#039;t retrieve it.&lt;br /&gt;
::&#039;&#039;key&#039;&#039;: the spawnarg to remove&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;removeTarget&#039;&#039;&#039;(entity target); ====&lt;br /&gt;
&lt;br /&gt;
:Remove a target from this entity.&lt;br /&gt;
::&#039;&#039;target&#039;&#039;: the entity to remove from the targets&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;replaceInvItem&#039;&#039;&#039;(entity oldItem, entity newItem); ====&lt;br /&gt;
&lt;br /&gt;
:Replaces the entity &amp;lt;oldItem&amp;gt; with &amp;lt;newItem&amp;gt; in the inventory, while keeping &amp;lt;oldItem&amp;gt;&#039;s inventory position intact.  Note: The position guarantee only applies if &amp;lt;oldItem&amp;gt; and newItem  share the same category. If the categories are different, the position of &amp;lt;newItem&amp;gt; is likely to be different than the one of &amp;lt;oldItem&amp;gt;.  Note that &amp;lt;oldItem&amp;gt; will be removed from the inventory.  If &amp;lt;newItem&amp;gt; is the $null_entity, &amp;lt;oldItem&amp;gt; is just removed and no replacement happens.  Returns 1 if the operation was successful, 0 otherwise.&lt;br /&gt;
::&#039;&#039;newItem&#039;&#039;: can be $null_entity&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ResetTimer&#039;&#039;&#039;(float stimId); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;reskinCollisionModel&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:For use after setSkin() on moveables and static models, if the CM needs to be refreshed to update surface properties after a skin change. CM will be regenerated from the original model file with the new skin.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ResponseAdd&#039;&#039;&#039;(float type); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ResponseAllow&#039;&#039;&#039;(float type, entity responder); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ResponseEnable&#039;&#039;&#039;(float type, float state); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
::&#039;&#039;state&#039;&#039;: 0 = disabled, 1 = enabled&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ResponseIgnore&#039;&#039;&#039;(float type, entity responder); ====&lt;br /&gt;
&lt;br /&gt;
:This functions must be called on the stim entity. It will add the response to the ignore list, so that subsequent stims, should not trigger the stim anymore.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ResponseRemove&#039;&#039;&#039;(float type); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ResponseSetAction&#039;&#039;&#039;(float type, string action); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ResponseTrigger&#039;&#039;&#039;(entity source, float stimType); ====&lt;br /&gt;
&lt;br /&gt;
:Fires a response on this entity, without a stim (a stand-alone response, so to say)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;RestartTimer&#039;&#039;&#039;(float stimId); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;restorePosition&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns this entity to the position stored in the &amp;quot;origin&amp;quot; spawn arg. This is the position the entity was spawned in unless the &amp;quot;origin&amp;quot; key is changed. Note that there is no guarantee that the entity won&#039;t be stuck in another entity when moved, so care should be taken to make sure that isn&#039;t possible.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAngles&#039;&#039;&#039;(vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the current orientation of this entity (relative to bind parent if any)&lt;br /&gt;
::&#039;&#039;angles&#039;&#039;: the new orientation&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAngularVelocity&#039;&#039;&#039;(vector velocity); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the current angular velocity of this entity. The angular velocity of a physics object is a vector that passes through the center of mass. The direction of this vector defines the axis of rotation and the magnitude defines the rate of rotation about the axis in radians per second.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setClipMask&#039;&#039;&#039;(float clipMask); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the clipmask of the physics object.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setColor&#039;&#039;&#039;(float parm0, float parm1, float parm2); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the RGB color of this entity (shader parms Parm0, Parm1, Parm2). See also setColorVec for a variant that accepts a vector instead.&lt;br /&gt;
::&#039;&#039;parm0&#039;&#039;: red&lt;br /&gt;
::&#039;&#039;parm1&#039;&#039;: green&lt;br /&gt;
::&#039;&#039;parm2&#039;&#039;: blue&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setColorVec&#039;&#039;&#039;(vector newColor); ====&lt;br /&gt;
&lt;br /&gt;
:Similar to setColor, but accepts the new RGB color as a vector instead of 3 different floats.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setContents&#039;&#039;&#039;(float contents); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the contents of the physics object.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;setCurInvCategory&#039;&#039;&#039;(string categoryName); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the inventory cursor to the first item of the named category. Returns 1 on success, 0 on failure (e.g. wrong category name)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;setCurInvItem&#039;&#039;&#039;(string itemName); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the inventory cursor to the named item. Returns: the item entity of the newly selected item (can be $null_entity).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setDroppable&#039;&#039;&#039;(float droppable); ====&lt;br /&gt;
&lt;br /&gt;
:Set whether an item may be dropped from the inventory. &lt;br /&gt;
::&#039;&#039;droppable&#039;&#039;: if non-zero the item becomes droppable, when called with 0 the item becomes non-droppable&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setEntityRelation&#039;&#039;&#039;(entity ent, float relation); ====&lt;br /&gt;
&lt;br /&gt;
:Set a relation to another entity, this can be friendly (&amp;gt;0), neutral(0) or hostile (&amp;lt;0)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setFrobable&#039;&#039;&#039;(float frobable); ====&lt;br /&gt;
&lt;br /&gt;
:Set whether the entity is frobable&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setFrobActionScript&#039;&#039;&#039;(string frobActionScript); ====&lt;br /&gt;
&lt;br /&gt;
:Changes the frob action script of this entity. Also updates the &#039;frob_action_script&#039; spawnarg.&lt;br /&gt;
::&#039;&#039;frobActionScript&#039;&#039;: the new script to call when the entity is frobbed&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setFrobMaster&#039;&#039;&#039;(entity master); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the passed entity as the frob master. Pass null_entity to remove the current frob master, if any.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setGravity&#039;&#039;&#039;(vector newGravity); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a new gravity vector for this entity. Note that non-upright vectors are poorly supported at present.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setGui&#039;&#039;&#039;(float handle, string guiFile); ====&lt;br /&gt;
&lt;br /&gt;
:Loads a new file into an existing GUI.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setGuiFloat&#039;&#039;&#039;(float handle, string key, float val); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a GUI parameter.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setGuiInt&#039;&#039;&#039;(float handle, string key, float val); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a GUI parameter.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setGuiString&#039;&#039;&#039;(float handle, string key, string val); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a GUI parameter.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setGuiStringFromKey&#039;&#039;&#039;(float handle, string key, entity src, string srcKey); ====&lt;br /&gt;
&lt;br /&gt;
:This is a kludge. It is equivelant to: setGuiString( handle, key, src.getKey(srcKey) ) However, it&#039;s used to bypass the 127 char size limit on script strings.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setHealth&#039;&#039;&#039;(float health); ====&lt;br /&gt;
&lt;br /&gt;
:Use these to set the health of AI or players (this also updates the AI_DEAD flag)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setKey&#039;&#039;&#039;(string key, string value); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a key on this entity&#039;s spawn args. Note that most spawn args are evaluated when this entity spawns in, so this will not change the entity&#039;s behavior in most cases. This is chiefly for saving data the script needs in an entity for later retrieval.&lt;br /&gt;
::&#039;&#039;key&#039;&#039;: the spawnarg to set&lt;br /&gt;
::&#039;&#039;value&#039;&#039;: the value to store&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setLinearVelocity&#039;&#039;&#039;(vector velocity); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the current linear velocity of this entity in units per second. The linear velocity of a physics object is a vector that defines the translation of the center of mass in units per second.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setMaxHealth&#039;&#039;&#039;(float maxHealth); ====&lt;br /&gt;
&lt;br /&gt;
:Use these to set the max health of AI or players. Note that the health bar GUI is limited to showing a max health of 100. If health exceeds max health after this, health will be set to be equal to max health (which would also update the AI_DEAD flag)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setModel&#039;&#039;&#039;(string modelName); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the model this entity uses&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setName&#039;&#039;&#039;(string name); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the name of this entity.&lt;br /&gt;
::&#039;&#039;name&#039;&#039;: the new name&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setNeverDormant&#039;&#039;&#039;(float enable); ====&lt;br /&gt;
&lt;br /&gt;
:enables or prevents an entity from going dormant&lt;br /&gt;
::&#039;&#039;enable&#039;&#039;: 1 = enable, 0 = disable&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setOrigin&#039;&#039;&#039;(vector origin); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the current position of this entity (relative to it&#039;s bind parent if any)&lt;br /&gt;
::&#039;&#039;origin&#039;&#039;: the new origin&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setOwner&#039;&#039;&#039;(entity owner); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the owner of this entity. Entities will never collide with their owner.&lt;br /&gt;
::&#039;&#039;owner&#039;&#039;: the entity which will be made owner of this entity&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setShaderParm&#039;&#039;&#039;(float parm, float value); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the value of the specified shader parm.&lt;br /&gt;
::&#039;&#039;parm&#039;&#039;: shader parm index&lt;br /&gt;
::&#039;&#039;value&#039;&#039;: new value&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setShaderParms&#039;&#039;&#039;(float parm0, float parm1, float parm2, float parm3); ====&lt;br /&gt;
&lt;br /&gt;
:Sets shader parms Parm0, Parm1, Parm2, and Parm3 (red, green, blue, and alpha respectively).&lt;br /&gt;
::&#039;&#039;parm0&#039;&#039;: red&lt;br /&gt;
::&#039;&#039;parm1&#039;&#039;: green&lt;br /&gt;
::&#039;&#039;parm2&#039;&#039;: blue&lt;br /&gt;
::&#039;&#039;parm3&#039;&#039;: alpha&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSize&#039;&#039;&#039;(vector min, vector max); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the size of this entity&#039;s bounding box.&lt;br /&gt;
::&#039;&#039;min&#039;&#039;: minimum corner coordinates&lt;br /&gt;
::&#039;&#039;max&#039;&#039;: maximum corner coordinates&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSkin&#039;&#039;&#039;(string skinName); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the skin this entity uses.  Set to &amp;quot;&amp;quot; to turn off the skin.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSolid&#039;&#039;&#039;(float solidity); ====&lt;br /&gt;
&lt;br /&gt;
:Set the solidity of the entity. If the entity has never been solid before it will be assigned solid and opaque contents/clip masks.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSoundVolume&#039;&#039;&#039;(float newLevel); ====&lt;br /&gt;
&lt;br /&gt;
:Set the volume of the sound to play, must be issued before startSoundShader.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setTeam&#039;&#039;&#039;(float newTeam); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the team number of this entity.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;SetTimerState&#039;&#039;&#039;(float stimId, float state); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setUsedBy&#039;&#039;&#039;(entity ent, float b_canUse); ====&lt;br /&gt;
&lt;br /&gt;
:Allows to change which entities can use this entity.&lt;br /&gt;
::&#039;&#039;ent&#039;&#039;: specify an entity here, like a key&lt;br /&gt;
::&#039;&#039;b_canUse&#039;&#039;: whether the specified entity can use this entity&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setWorldOrigin&#039;&#039;&#039;(vector origin); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the current position of this entity (regardless of any bind parent).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;show&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Makes this entity visible if it has a model.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;startFx&#039;&#039;&#039;(string fx); ====&lt;br /&gt;
&lt;br /&gt;
:Starts an FX on this entity.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;startSound&#039;&#039;&#039;(string sound, float channel, float netSync); ====&lt;br /&gt;
&lt;br /&gt;
:Plays the sound specified by the snd_* key/value pair on the channel and returns the length of the sound in seconds. This is the preferred method for playing sounds on an entity since it ensures that the sound is precached.&lt;br /&gt;
::&#039;&#039;sound&#039;&#039;: the spawnarg to reference, e.g. &#039;snd_move&#039;&lt;br /&gt;
::&#039;&#039;channel&#039;&#039;: the channel to play on&lt;br /&gt;
::&#039;&#039;netSync&#039;&#039;: -&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;startSoundShader&#039;&#039;&#039;(string shaderName, float channel); ====&lt;br /&gt;
&lt;br /&gt;
:Plays a specific sound shader on the channel and returns the length of the sound in seconds. This is not the preferred method of playing a sound since you must ensure that the sound is loaded.&lt;br /&gt;
::&#039;&#039;shaderName&#039;&#039;: the sound shader to play&lt;br /&gt;
::&#039;&#039;channel&#039;&#039;: the channel to play the sound on&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;StartTimer&#039;&#039;&#039;(float stimId); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;StimAdd&#039;&#039;&#039;(float type, float radius); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;StimClearIgnoreList&#039;&#039;&#039;(float type); ====&lt;br /&gt;
&lt;br /&gt;
:This clears the ignore list for the stim of the given type It can be used if an entity changes state in some way that it would no longer be ignored&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;StimEmit&#039;&#039;&#039;(float type, float radius, vector stimOrigin); ====&lt;br /&gt;
&lt;br /&gt;
:Emits a stim in a radius around the specified origin. The entity from which this event is called needs to have the corresponding stim setup on itself, it does not need to be active.&lt;br /&gt;
::&#039;&#039;type&#039;&#039;: Index ID of the stim to emit, i.e. 21 or STIM_TRIGGER for a trigger stim.&lt;br /&gt;
::&#039;&#039;radius&#039;&#039;: How far the stim will reach. Pass negative to use the radius settings on the entity.&lt;br /&gt;
::&#039;&#039;stimOrigin&#039;&#039;: Emit the stim from here.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;StimEnable&#039;&#039;&#039;(float type, float state); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
::&#039;&#039;state&#039;&#039;: 0 = disabled, 1 = enabled&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;StimRemove&#039;&#039;&#039;(float type); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;StimSetScriptBased&#039;&#039;&#039;(float type, float state); ====&lt;br /&gt;
&lt;br /&gt;
:Converts a stim to being script-based. It will only be emitted when a script calls StimEmit on the entity.&lt;br /&gt;
::&#039;&#039;type&#039;&#039;: Index ID of the stim to alter, i.e. 21 or STIM_TRIGGER for a trigger stim.&lt;br /&gt;
::&#039;&#039;state&#039;&#039;: New state.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopSound&#039;&#039;&#039;(float channel, float netSync); ====&lt;br /&gt;
&lt;br /&gt;
:Stops a specific sound shader on the channel.&lt;br /&gt;
::&#039;&#039;channel&#039;&#039;: the channel to stop playback on&lt;br /&gt;
::&#039;&#039;netSync&#039;&#039;: -&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;StopTimer&#039;&#039;&#039;(float stimId); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;teleportTo&#039;&#039;&#039;(entity other); ====&lt;br /&gt;
&lt;br /&gt;
:Teleports the entity to the position of the other entity, plus a possible offset and random offset (defined on the spawnargs of the entity to be teleported)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;touches&#039;&#039;&#039;(entity other); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if this entity touches the other entity.&lt;br /&gt;
::&#039;&#039;other&#039;&#039;: the entity to check against&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;unbind&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Detaches this entity from its master.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;wait&#039;&#039;&#039;(float time); ====&lt;br /&gt;
&lt;br /&gt;
:Suspends execution of the current thread for the given number of seconds.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;waitFrame&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Suspends execution of current thread for one game frame.&lt;br /&gt;
&lt;br /&gt;
=== idAnimatedEntity ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearAllJoints&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Removes any custom transforms on all joints.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearJoint&#039;&#039;&#039;(float jointnum); ====&lt;br /&gt;
&lt;br /&gt;
:Removes any custom transforms on the specified joint.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getJointAngle&#039;&#039;&#039;(float jointnum); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the angular orientation of the joint in world space.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getJointHandle&#039;&#039;&#039;(string jointname); ====&lt;br /&gt;
&lt;br /&gt;
:Looks up the number of the specified joint. Returns INVALID_JOINT if the joint is not found.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getJointPos&#039;&#039;&#039;(float jointnum); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the position of the joint in world space.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setJointAngle&#039;&#039;&#039;(float jointnum, float transform_type, vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Modifies the orientation of the joint based on the transform type.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setJointPos&#039;&#039;&#039;(float jointnum, float transform_type, vector pos); ====&lt;br /&gt;
&lt;br /&gt;
:Modifies the position of the joint based on the transform type.&lt;br /&gt;
&lt;br /&gt;
=== CFrobButton ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Operate&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Call this to operate this entity.&lt;br /&gt;
&lt;br /&gt;
=== CFrobDoor ===&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;GetDoorhandle&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the handle entity of this door. Can return NULL (== $null_entity)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;OpenDoor&#039;&#039;&#039;(float master); ====&lt;br /&gt;
&lt;br /&gt;
:The OpenDoor method is necessary to give the FrobDoorHandles a  &amp;quot;low level&amp;quot; open routine. The CFrobDoor::Open() call is re-routed to the FrobDoorHandle::Tap() method, so there must be a way to actually let the door open. Which is what this method does.  Note: Shouldn&#039;t be called directly by scripters, call handle-&amp;gt;Tap() instead. Unless you know what you&#039;re doing.&lt;br /&gt;
&lt;br /&gt;
=== CFrobDoorHandle ===&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;GetDoor&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the associated door entity for this handle.&lt;br /&gt;
&lt;br /&gt;
=== CFrobHandle ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Tap&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Operates this handle.&lt;br /&gt;
&lt;br /&gt;
=== CFrobLever ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Operate&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Call this to operate this entity.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Switch&#039;&#039;&#039;(float newState); ====&lt;br /&gt;
&lt;br /&gt;
:Move the lever to the on or off position (0 = off).&lt;br /&gt;
&lt;br /&gt;
=== CFrobLock ===&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;IsLocked&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true (nonzero) if the mover is currently locked.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;IsPickable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true (nonzero) if this frobmover is pickable.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Lock&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Locks the mover. Calls to Open() will not succeed after this call. &lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Open&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Opens the frobmover, regardless of its previous state. The mover will not move when it&#039;s locked. &lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;TDM_Lock_OnLockPicked&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:internal&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;TDM_Lock_StatusUpdate&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:internal&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ToggleLock&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Toggles the lock state. Unlocked movers will be locked and vice versa. The notes above concerning Unlock() still apply if this call unlocks the mover. &lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Unlock&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Unlocks the mover. Calls to Open() will succeed after this call. Depending on the value of the spawnarg &amp;quot;open_on_unlock&amp;quot; the mover might automatically open after this call. &lt;br /&gt;
&lt;br /&gt;
=== CFrobLockHandle ===&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;GetLock&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the associated lock of this handle.&lt;br /&gt;
&lt;br /&gt;
=== tdmFuncShooter ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;shooterFireProjectile&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Fires a projectile.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;shooterGetAmmo&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get the ammonition&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;shooterGetState&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current state of this shooter.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;shooterSetAmmo&#039;&#039;&#039;(float newAmmo); ====&lt;br /&gt;
&lt;br /&gt;
:Set the ammonition&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;shooterSetState&#039;&#039;&#039;(float state); ====&lt;br /&gt;
&lt;br /&gt;
:Activates / deactivates the shooter entity.&lt;br /&gt;
::&#039;&#039;state&#039;&#039;: 1 = active, 0 = inactive&lt;br /&gt;
&lt;br /&gt;
=== idEntityFx ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idItem ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;respawn&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Respawn&lt;br /&gt;
&lt;br /&gt;
=== idMoveableItem ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;gib&#039;&#039;&#039;(string damageDefName); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
=== idLight ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;fadeInLight&#039;&#039;&#039;(float time); ====&lt;br /&gt;
&lt;br /&gt;
:Turns the light on over the given time in seconds.&lt;br /&gt;
::&#039;&#039;time&#039;&#039;: in seconds&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;fadeOutLight&#039;&#039;&#039;(float time); ====&lt;br /&gt;
&lt;br /&gt;
:Turns the light out over the given time in seconds.&lt;br /&gt;
::&#039;&#039;time&#039;&#039;: in seconds&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;fadeToLight&#039;&#039;&#039;(vector color, float time); ====&lt;br /&gt;
&lt;br /&gt;
:Fades the light to the given color over a given time.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getLightLevel&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get level (intensity) of a light, &amp;lt;= 0.0 indicates it is off&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getLightOrigin&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get the light origin (independent of its visual model)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getLightParm&#039;&#039;&#039;(float parmNum); ====&lt;br /&gt;
&lt;br /&gt;
:Gets a shader parameter.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getRadius&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the light radius.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getShader&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the shader name used by the light.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Off&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Switches the emitter off.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;On&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Switches the emitter on.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setLightOrigin&#039;&#039;&#039;(vector pos); ====&lt;br /&gt;
&lt;br /&gt;
:Set origin of lights independent of model origin&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setLightParm&#039;&#039;&#039;(float parmNum, float value); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a shader parameter.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setLightParms&#039;&#039;&#039;(float parm0, float parm1, float parm2, float parm3); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the red/green/blue/alpha shader parms on the light and the model.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setRadius&#039;&#039;&#039;(float radius); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the size of the bounding box, x=y=z=radius.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setRadiusXYZ&#039;&#039;&#039;(float x, float y, float z); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the width/length/height of the light bounding box.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setShader&#039;&#039;&#039;(string shader); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the shader to be used for the light.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setStartedOff&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;smoking&#039;&#039;&#039;(float state); ====&lt;br /&gt;
&lt;br /&gt;
:flame is now smoking (1), or not (0)&lt;br /&gt;
::&#039;&#039;state&#039;&#039;: 1 = smoking, 0 = not smoking&lt;br /&gt;
&lt;br /&gt;
=== idListener ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idPlayerStart ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idActivator ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idPathCorner ===&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;randomPath&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
=== idDamagable ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idExplodable ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idForceField ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Toggle&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Turns the forcefield on and off.&lt;br /&gt;
&lt;br /&gt;
=== idAnimated ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;footstep&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Plays footstep sound.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;launchMissiles&#039;&#039;&#039;(string projectilename, string sound, string launchbone, string targetbone, float numshots, float framedelay); ====&lt;br /&gt;
&lt;br /&gt;
:Launches a projectile.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;leftFoot&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Changes to left foot and plays footstep sound.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;rightFoot&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Changes to right foot and plays footstep sound.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;startRagdoll&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Switches to a ragdoll taking over the animation.&lt;br /&gt;
&lt;br /&gt;
=== idStaticEntity ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idFuncSmoke ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSmoke&#039;&#039;&#039;(string particleDef); ====&lt;br /&gt;
&lt;br /&gt;
:Changes the smoke particle of a func_smoke.&lt;br /&gt;
&lt;br /&gt;
=== idVacuumSeparatorEntity ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idPortalEntity ===&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getPortalHandle&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the portal handle.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getSoundLoss&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the sound loss value (dB).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSoundLoss&#039;&#039;&#039;(float loss); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the sound loss value (dB).&lt;br /&gt;
&lt;br /&gt;
=== idBeam ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idShaking ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idEarthQuake ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idFuncPortal ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idFuncAASPortal ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idFuncAASObstacle ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idPhantomObjects ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idPortalSky ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== tdmVine ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;addDescendant&#039;&#039;&#039;(entity vine); ====&lt;br /&gt;
&lt;br /&gt;
:Event called using vine.*()&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canWater&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Event called using vine.*()&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearWatered&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Event called using vine.*()&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getPrime&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Event called using vine.*()&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;scaleVine&#039;&#039;&#039;(float factor); ====&lt;br /&gt;
&lt;br /&gt;
:Event called using vine.*()&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setPrime&#039;&#039;&#039;(entity vine); ====&lt;br /&gt;
&lt;br /&gt;
:Event called using vine.*()&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setWatered&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Event called using vine.*()&lt;br /&gt;
&lt;br /&gt;
=== idMoveable ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;becomeNonSolid&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Makes the moveable non-solid for other entities.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enableDamage&#039;&#039;&#039;(float enable); ====&lt;br /&gt;
&lt;br /&gt;
:enable/disable damage&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isAtRest&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if object is not moving&lt;br /&gt;
&lt;br /&gt;
=== idMover ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;accelSound&#039;&#039;&#039;(string sound); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the sound to be played when the mover accelerates.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;accelTime&#039;&#039;&#039;(float time); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the acceleration time. Set this acceleration time before initiating a new move.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;accelTo&#039;&#039;&#039;(float speed, float time); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates an acceleration to the given speed over the given time in seconds.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;bob&#039;&#039;&#039;(float speed, float phase, vector distance); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a translation back and forth along the given vector with the given speed and phase.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;closePortal&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Closes the renderer portal associated with this mover.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;decelSound&#039;&#039;&#039;(string sound); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the sound to be played when the mover decelerates.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;decelTime&#039;&#039;&#039;(float time); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the deceleration time. Set this deceleration time before initiating a new move.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;decelTo&#039;&#039;&#039;(float speed, float time); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a deceleration to the given speed over the given time in seconds.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disableSplineAngles&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Disables aligning the mover with the spline direction.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enableSplineAngles&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Enables aligning the mover with the spline direction.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMoveSpeed&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get the movement speed.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMoveTime&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the movement time.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isMoving&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if a mover is moving&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isRotating&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if a mover is rotating&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;move&#039;&#039;&#039;(float angle, float distance); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a translation with the given distance in the given yaw direction. Uses the current speed/time and acceleration and deceleration settings.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveSound&#039;&#039;&#039;(string sound); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the sound to be played when the moving.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveTo&#039;&#039;&#039;(entity targetEntity); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a translation to the position of an entity. Uses the current speed/time and acceleration and deceleration settings.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveToPos&#039;&#039;&#039;(vector pos); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a translation to an absolute position. Uses the current speed/time and acceleration and deceleration settings.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;openPortal&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Opens the renderer portal associated with this mover.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;removeInitialSplineAngles&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Subtracts the initial spline angles to maintain the initial orientation of the mover.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;rotate&#039;&#039;&#039;(vector angleSpeed); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a rotation with the given angular speed. Uses the current speed/time and acceleration and deceleration settings.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;rotateDownTo&#039;&#039;&#039;(float axis, float angle); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a rotation about the given axis by decreasing the current angle towards the given angle. Uses the current speed/time and acceleration and deceleration settings.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;rotateOnce&#039;&#039;&#039;(vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a rotation towards the current angles plus the given Euler angles. Uses the current speed/time and acceleration and deceleration settings.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;rotateTo&#039;&#039;&#039;(vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a rotation towards the given Euler angles. Uses the current speed/time and acceleration and deceleration settings.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;rotateUpTo&#039;&#039;&#039;(float axis, float angle); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a rotation about the given axis by increasing the current angle towards the given angle. Uses the current speed/time and acceleration and deceleration settings.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;speed&#039;&#039;&#039;(float speed); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the movement speed. Set this speed before initiating a new move.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;startSpline&#039;&#039;&#039;(entity spline); ====&lt;br /&gt;
&lt;br /&gt;
:Starts moving along a spline stored on the given entity.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopMoving&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Stops any translational movement.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopRotating&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Stops any rotational movement.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopSpline&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Stops moving along a spline.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;sway&#039;&#039;&#039;(float speed, float phase, vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a rotation back and forth along the given angles with the given speed and phase.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;time&#039;&#039;&#039;(float time); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the movement time. Set this time before initiating a new move.&lt;br /&gt;
&lt;br /&gt;
=== idMover_Binary ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;closePortal&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Closes the renderer portal associated with this mover.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Disables the mover/trigger&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Enables the mover/trigger&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;openPortal&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Opens the renderer portal associated with this mover.&lt;br /&gt;
&lt;br /&gt;
=== idRotater ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idRiser ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idPlayer ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;changeWeaponName&#039;&#039;&#039;(string weaponName, string displayName); ====&lt;br /&gt;
&lt;br /&gt;
:Changes the display name of the given weapon item to something different. Pass an empty string to reset the display name to the definition as found in the weaponDef.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;changeWeaponProjectile&#039;&#039;&#039;(string weaponName, string projectileDefName); ====&lt;br /&gt;
&lt;br /&gt;
:Changes the projectile entityDef name of the given weapon (e.g. &amp;quot;broadhead&amp;quot;) to the specified entityDef (e.g. &amp;quot;atdm:projectile_broadhead&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;checkAAS&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearActiveInventoryMap&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Clear the active inventory map entity&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearActiveInventoryMapEnt&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Clear the active inventory map entity&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearMouseDeadTime&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;customDeath&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;deathMenu&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disableWeapon&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Lowers and disables the player weapon.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enableWeapon&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Enables the player weapon.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;endZoom&#039;&#039;&#039;(float duration); ====&lt;br /&gt;
&lt;br /&gt;
:Starts the zoom out event, which performs a gradual transition back to the default FOV. May be called during a transition as well to intercept a pending zoom in transition.&lt;br /&gt;
::&#039;&#039;duration&#039;&#039;: duration of the transition in msec&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;exitTeleporter&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getButtons&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the button state from the current user command.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getCalibratedLightgemValue&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the calibrated light gem value.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getCurrentWeapon&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns weaponX where X is the number of the weapon the player is currently holding.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getCurWeaponName&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the name of the current weapon, as defined by &amp;quot;inv_weapon_name&amp;quot; in the weaponDef.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getDragged&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the currently dragged body. Returns $null_entity if the body is shouldered, the player has nothing in his hands, or he has a non-AF entity in his hands. See also getShouldered(), getGrabbed() and getFrobbed().&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getFov&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:This returns the current FOV of the player. You can modify the current FOV with startZoom() and endZoom().&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getFrobbed&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the currently frobhilighted entity. This includes entities the player has in his hands. Sets &amp;quot;frob only used by&amp;quot; mode&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getGrabbed&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the currently entity in the players hands. Returns $null_entity if the player has nothing in his hands Dragging or shouldering a body counts as grabbing it. See also getDragged(), getShouldered(), getFrobbed().&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getHinderance&#039;&#039;&#039;(string source); ====&lt;br /&gt;
&lt;br /&gt;
:Used to get hinderance from a source.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getImmobilization&#039;&#039;&#039;(string source); ====&lt;br /&gt;
&lt;br /&gt;
:Used to get immobilization from a source. Warning: Not a finalized version. It&#039;s subject to change, so use it at your own risk.)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getInventoryOverlay&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the default inventory overlay for the player. All other entities will return an invalid value.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getListenLoc&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Retrieves the location of the listener when leaning.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMouseGesture&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the results of the last mouse gesture in enum form. (see the definition for MOUSEDIR_* for which numbers correspond to which directions)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getMove&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the movement relative to the player&#039;s view angles from the current user command. vector_x = forward, vector_y = right, vector_z = up&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getNextHinderance&#039;&#039;&#039;(string prefix, string lastMatch); ====&lt;br /&gt;
&lt;br /&gt;
:Used to get the next hinderance from a source.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getNextImmobilization&#039;&#039;&#039;(string prefix, string lastMatch); ====&lt;br /&gt;
&lt;br /&gt;
:Used to get immobilization from a source. Warning: Not a finalized version. It&#039;s subject to change, so use it at your own risk.)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getNextTurnHinderance&#039;&#039;&#039;(string prefix, string lastMatch); ====&lt;br /&gt;
&lt;br /&gt;
:Get the next hinderance on the view turning from a source&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getObjectiveComp&#039;&#039;&#039;(float ObjNum, float CompNum); ====&lt;br /&gt;
&lt;br /&gt;
:Used to get the state of custom objective components&lt;br /&gt;
::&#039;&#039;ObjNum&#039;&#039;: Starts counting at 1&lt;br /&gt;
::&#039;&#039;CompNum&#039;&#039;: Starts counting at 1&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getObjectiveState&#039;&#039;&#039;(float ObjNum); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current state of the objective with the number ObjNum.  State is one of the following: OBJ_INCOMPLETE = 0, OBJ_COMPLETE = 1, OBJ_INVALID = 2, OBJ_FAILED = 3&lt;br /&gt;
::&#039;&#039;ObjNum&#039;&#039;: Starts counting at 1&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getObjectiveVisible&#039;&#039;&#039;(float ObjNum); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current visibility of the objective with the number ObjNum.&lt;br /&gt;
::&#039;&#039;ObjNum&#039;&#039;: Starts counting at 1&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getPreviousWeapon&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns weaponX where X is the number of the weapon the player was previously holding.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getShouldered&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the currently shouldered body, otherwise $null_entity. See also getDragged(), getGrabbed() and getFrobbed().&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getTurnHinderance&#039;&#039;&#039;(string source); ====&lt;br /&gt;
&lt;br /&gt;
:* Get the hinderance on the view turning from a source&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getViewAngles&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the player view angles.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getWeaponEntity&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the entity for the player&#039;s weapon&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;giveHealthPool&#039;&#039;&#039;(float amount); ====&lt;br /&gt;
&lt;br /&gt;
:This increases/decreases the healthpool of the player by the given amount. The healthpool is gradually decreased over time, healing (damaging?) the player.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;heldEntity&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the entity currently being held, or $null_entity if the player&#039;s hands are empty.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;holdEntity&#039;&#039;&#039;(entity entity); ====&lt;br /&gt;
&lt;br /&gt;
:Forces the player to hold an entity (e.g. puts it into the grabber). Drops whatever is in the player&#039;s hands if $null_entity is passed to it. Returns 1 if successful, 0 if not.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isAirborne&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Checks whether the player is in the air.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isLeaning&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get whether the player is leaning&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isPeekLeaning&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get whether the player is peek leaning (against a keyhole or crack)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;missionFailed&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;missionSuccess&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;mouseGestureFinished&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the player is not currently doing a mouse gesture.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;objectiveCompUnlatch&#039;&#039;&#039;(float ObjNum, float CompNum); ====&lt;br /&gt;
&lt;br /&gt;
:Unlatch an irreversible objective component that has latched into a state&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;objectiveUnlatch&#039;&#039;&#039;(float ObjNum); ====&lt;br /&gt;
&lt;br /&gt;
:Unlatch an irreversible objective that has latched into a state&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;pauseGame&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Pauses the game. This should only be called for threads that are explicitly maintained by a special SDK method, because ordinary threads won&#039;t get executed during g_stopTime == true. Note: This is used by the objective GUI threads. Note: Must be called on the player entity, not the sys entity.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;playStartSound&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;readLightgemModifierFromWorldspawn&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;resetWeaponProjectile&#039;&#039;&#039;(string weaponName); ====&lt;br /&gt;
&lt;br /&gt;
:Reloads the original projectile def name from the weaponDef. Used to revert a change made by the event changeWeaponProjectile().&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;resetZoom&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Cancels any pending zoom transitions and resets the FOV to normal.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ropeRemovalCleanup&#039;&#039;&#039;(entity ropeEnt); ====&lt;br /&gt;
&lt;br /&gt;
:Called when rope arrow ropes are removed, removes stale pointers on the player object.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;saveGame&#039;&#039;&#039;(string filename); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;selectWeapon&#039;&#039;&#039;(string weapon); ====&lt;br /&gt;
&lt;br /&gt;
:Selects the weapon the player is holding.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setActiveInventoryMapEnt&#039;&#039;&#039;(entity mapEnt); ====&lt;br /&gt;
&lt;br /&gt;
:Notify the player about a new active map entity. This clears out any previously active maps.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAirAccelerate&#039;&#039;&#039;(float newAccelerate); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a multiplier for the player&#039;s horizontal acceleration while airborne. Default is 1.0.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setFrobOnlyUsedByInv&#039;&#039;&#039;(float OnOff); ====&lt;br /&gt;
&lt;br /&gt;
:Engages or disengages a mode where we only frobhilight entities that can be used by our current inventory item. This also disables general frobactions and only allows &amp;quot;used by&amp;quot; frob actions.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setHinderance&#039;&#039;&#039;(string source, float mCap, float fCap); ====&lt;br /&gt;
&lt;br /&gt;
:Used to set hinderance from a source.&lt;br /&gt;
::&#039;&#039;mCap&#039;&#039;: mCap values from all sources are multiplied together to define a cap&lt;br /&gt;
::&#039;&#039;fCap&#039;&#039;: fCap values are not additive, the smallest one among all the sources is used&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setImmobilization&#039;&#039;&#039;(string source, float type); ====&lt;br /&gt;
&lt;br /&gt;
:Used to set immobilization from a source. Warning: Not a finalized version. It&#039;s subject to change, so use it at your own risk.)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setLightgemModifier&#039;&#039;&#039;(string modifierName, float value); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the named lightgem modifier to a certain value. An example would be the player lantern: setLightgemModifier(&amp;quot;lantern&amp;quot;, 32). This way multiple modifiers can be set by concurrent script threads.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setObjectiveComp&#039;&#039;&#039;(float ObjNum, float CompNum, float state); ====&lt;br /&gt;
&lt;br /&gt;
:Used to set the state of custom objective components&lt;br /&gt;
::&#039;&#039;ObjNum&#039;&#039;: objective number. Starts counting at 1&lt;br /&gt;
::&#039;&#039;CompNum&#039;&#039;: component number. Starts counting at 1&lt;br /&gt;
::&#039;&#039;state&#039;&#039;: 1 or 0 for true or false&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setObjectiveEnabling&#039;&#039;&#039;(float ObjNum, string strIn); ====&lt;br /&gt;
&lt;br /&gt;
:Set an objective&#039;s enabling objectives (objectives that must be completed before that objective may be completed).&lt;br /&gt;
::&#039;&#039;strIn&#039;&#039;: takes the form of a string that is a space-delimited list of integer objectives representing the new enabling objectives. E.g. : &#039;1 2 3 4&#039;&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setObjectiveNotification&#039;&#039;&#039;(float ObjNote); ====&lt;br /&gt;
&lt;br /&gt;
:Turns the notifications (sound ++ text) for objectives on/off.&lt;br /&gt;
::&#039;&#039;ObjNote&#039;&#039;: Turn notifications on/off&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setObjectiveOngoing&#039;&#039;&#039;(float ObjNum, float val); ====&lt;br /&gt;
&lt;br /&gt;
:Sets objective ongoing.&lt;br /&gt;
::&#039;&#039;val&#039;&#039;: 1 for true, 0 for false&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setObjectiveOptional&#039;&#039;&#039;(float ObjNum, float val); ====&lt;br /&gt;
&lt;br /&gt;
:Sets objective mandatory.&lt;br /&gt;
::&#039;&#039;val&#039;&#039;: 1 for true, 0 for false&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setObjectiveState&#039;&#039;&#039;(float ObjNum, float State); ====&lt;br /&gt;
&lt;br /&gt;
:Used to set the state of objectives from the script. For example, use this to invalidate an objective when something happens in your mission. The first argument is the numerical index of the objective (taking &#039;user&#039; objective indices, starting at 1). Choose from the following for the second argument: OBJ_INCOMPLETE, OBJ_COMPLETE, OBJ_INVALID, OBJ_FAILED. Use this on $player1 like $player1.setObjectiveState(1, OBJ_COMPLETE);&lt;br /&gt;
::&#039;&#039;ObjNum&#039;&#039;: Starts counting at 1&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setObjectiveText&#039;&#039;&#039;(float ObjNum, string newText); ====&lt;br /&gt;
&lt;br /&gt;
:Modify the displayed text for an objective. Can also be a string template like #str_20000&lt;br /&gt;
::&#039;&#039;ObjNum&#039;&#039;: Starts counting at 1&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setObjectiveVisible&#039;&#039;&#039;(float ObjNum, float val); ====&lt;br /&gt;
&lt;br /&gt;
:Sets objective visibility.&lt;br /&gt;
::&#039;&#039;val&#039;&#039;: 1 for true, 0 for false&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setPeekOverlayBackground&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the background overlay for peeking, depending on aspect ratio.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setPeekView&#039;&#039;&#039;(float OnOff, vector origin); ====&lt;br /&gt;
&lt;br /&gt;
:Toggle whether we should use a view from a peek entity as the player&#039;s view&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSavePermissions&#039;&#039;&#039;(float permission); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
::&#039;&#039;permission&#039;&#039;: 0&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSpyglassOverlayBackground&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the background overlay for the spyglass, depending on aspect ratio.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setTurnHinderance&#039;&#039;&#039;(string source, float mCap, float fCap); ====&lt;br /&gt;
&lt;br /&gt;
:Set the hinderance on the view turning from a source&lt;br /&gt;
::&#039;&#039;mCap&#039;&#039;: mCap values from all sources are multiplied together to define a cap&lt;br /&gt;
::&#039;&#039;fCap&#039;&#039;: fCap values are not additive, the smallest one among all the sources is used&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setViewAngles&#039;&#039;&#039;(vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the player view angles, e.g. make the player facing this direction. 0 0 0 is east (along the X axis in DR), 0 90 0 north (along the Y axis in DR) 0 180 0 west, 0 270 0 south.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;startGamePlayTimer&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Resets the game play timer to zero and (re)starts it.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;startMouseGesture&#039;&#039;&#039;(float key, float thresh, float test, float inverted, float turnHinderance, float decideTime, float deadTime); ====&lt;br /&gt;
&lt;br /&gt;
:Start tracking a mouse gesture that started when the key impulse was pressed. Discretizes analog mouse movement into a few different gesture possibilities. Impulse arg can also be a button, see the UB_* enum in usercmdgen.h. For now, only one mouse gesture check at a time.&lt;br /&gt;
::&#039;&#039;thresh&#039;&#039;: Waits until the threshold mouse input thresh is reached before deciding.&lt;br /&gt;
::&#039;&#039;test&#039;&#039;: determines which test to do (0 = up/down, 1 = left/right, 2 = 4 directions, 3 = 8 directions).&lt;br /&gt;
::&#039;&#039;inverted&#039;&#039;: inverts the movement if set to 1, does not if 0&lt;br /&gt;
::&#039;&#039;turnHinderance&#039;&#039;: Sets the max player view turn rate when checking this mouse gesture (0 =&amp;gt; player view locked, 1.0 =&amp;gt; no effect on view turning)&lt;br /&gt;
::&#039;&#039;decideTime&#039;&#039;: time in milliseconds after which the mouse gesture is auto-decided, in the event that the mouse movement threshold was not reached. A DecideTime of -1 means wait forever until the button is released.&lt;br /&gt;
::&#039;&#039;deadTime&#039;&#039;: how long after attack is pressed that mouse control remains dampened by the fraction turnHinderance.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;startZoom&#039;&#039;&#039;(float duration, float startFOV, float endFOV); ====&lt;br /&gt;
&lt;br /&gt;
:Call this to start the zoom in event. The player FOV is gradually zoomed in until over the given timespan.&lt;br /&gt;
::&#039;&#039;duration&#039;&#039;: duration of the transition in msec&lt;br /&gt;
::&#039;&#039;startFOV&#039;&#039;: The start FOV, this is clamped to [1..179]&lt;br /&gt;
::&#039;&#039;endFOV&#039;&#039;: The end FOV, this is clamped to [1..179]&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopFxFov&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopMouseGesture&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;testEvent1&#039;&#039;&#039;(float float_pi, float int_beef, float float_exp, string string_tdm, float float_exp10, float int_food); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;testEvent2&#039;&#039;&#039;(float int_prevres, vector vec_123, float int_food, entity ent_player, entity ent_null, float float_pi, float float_exp); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;testEvent3&#039;&#039;&#039;(entity ent_prevres, vector vec_123, float float_pi, entity ent_player); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;triggerMissionEnd&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;unpauseGame&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Unpauses the game. Most scripts are not executed during g_stopTime == true and won&#039;t get into the position of calling this.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;wasDamaged&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Check if the player was damaged this frame.&lt;br /&gt;
&lt;br /&gt;
=== idProjectile ===&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getProjectileState&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the current state of the projectile. States are defined in tdm_defs.script&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;launch&#039;&#039;&#039;(vector start, vector dir, vector velocity); ====&lt;br /&gt;
&lt;br /&gt;
:Launches the projectile from &amp;lt;start&amp;gt; in direction &amp;lt;dir&amp;gt; with the given &amp;lt;velocity&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;TDM_Lock_OnLockPicked&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:internal&lt;br /&gt;
&lt;br /&gt;
=== idGuidedProjectile ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;launchGuided&#039;&#039;&#039;(vector start, vector dir, vector velocity, entity target); ====&lt;br /&gt;
&lt;br /&gt;
:Launches the guided projectile from &amp;lt;start&amp;gt; in direction &amp;lt;dir&amp;gt; with the given &amp;lt;velocity&amp;gt; at &amp;lt;target entity&amp;gt;. Pass $null_entity to fire an unguided projectile.&lt;br /&gt;
&lt;br /&gt;
=== CProjectileResult ===&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getActualStruckEnt&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Getter for projectile result variable&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getAxialDir&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Getter for projectile result variable&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getFinalAngVel&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Getter for projectile result variable&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getFinalVel&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Getter for projectile result variable&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getIncidenceAngle&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Getter for projectile result variable&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getProjMass&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Getter for projectile result variable&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getStruckEnt&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Getter for projectile result variable&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getSurfNormal&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Getter for projectile result variable&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getSurfType&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Getter for projectile result variable&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isVineFriendly&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Vine-arrow event&lt;br /&gt;
&lt;br /&gt;
=== CTarget_SetRelations ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== CTarget_SetEntityRelation ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== CTarget_ChangeEntityRelation ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idThread ===&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;acos&#039;&#039;&#039;(float cosine); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the angle in degrees with the given cosine.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;angRotate&#039;&#039;&#039;(vector angles1, vector angles2); ====&lt;br /&gt;
&lt;br /&gt;
:Rotates the given Euler angles by each other.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;angToForward&#039;&#039;&#039;(vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a forward vector for the given Euler angles.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;angToRight&#039;&#039;&#039;(vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a right vector for the given Euler angles.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;angToUp&#039;&#039;&#039;(vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Returns an up vector for the given Euler angles.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;asin&#039;&#039;&#039;(float sine); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the angle in degrees with the given sine.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;assert&#039;&#039;&#039;(float condition); ====&lt;br /&gt;
&lt;br /&gt;
:Breaks if the condition is zero. (Only works in debug builds.)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;cacheSoundShader&#039;&#039;&#039;(string shaderName); ====&lt;br /&gt;
&lt;br /&gt;
:Ensure the specified sound shader is loaded by the system. Prevents cache misses when playing sound shaders.&lt;br /&gt;
::&#039;&#039;shaderName&#039;&#039;: the sound shader to cache&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;callFunctionsByWildcard&#039;&#039;&#039;(string functionName); ====&lt;br /&gt;
&lt;br /&gt;
:Calls global functions with names matching the specified wildcard in separate threads (in lexicographical order). INTERNAL: don&#039;t use in mission scripting!&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canPlant&#039;&#039;&#039;(vector traceStart, vector traceEnd, entity ignore, entity vine); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;ceil&#039;&#039;&#039;(float x); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the smallest integer that is greater than or equal to the given value.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearPersistentArgs&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Clears data that persists between maps.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearSignalThread&#039;&#039;&#039;(float signalNum, entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:Clears the script callback function set for when the given signal is raised on the given entity.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;copySpawnArgs&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:copies the spawn args from an entity&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;cos&#039;&#039;&#039;(float degrees); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the cosine of the given angle in degrees.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;CrossProduct&#039;&#039;&#039;(vector vec1, vector vec2); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the cross product of the two vectors.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;debugArrow&#039;&#039;&#039;(vector color, vector start, vector end, float size, float lifetime); ====&lt;br /&gt;
&lt;br /&gt;
:line drawing for debug visualization.  lifetime of 0 == 1 frame.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;debugBounds&#039;&#039;&#039;(vector color, vector mins, vector maxs, float lifetime); ====&lt;br /&gt;
&lt;br /&gt;
:line drawing for debug visualization.  lifetime of 0 == 1 frame.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;debugCircle&#039;&#039;&#039;(vector color, vector origin, vector dir, float radius, float numSteps, float lifetime); ====&lt;br /&gt;
&lt;br /&gt;
:line drawing for debug visualization.  lifetime of 0 == 1 frame.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;debugLine&#039;&#039;&#039;(vector color, vector start, vector end, float lifetime); ====&lt;br /&gt;
&lt;br /&gt;
:line drawing for debug visualization.  lifetime of 0 == 1 frame.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;DotProduct&#039;&#039;&#039;(vector vec1, vector vec2); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the dot product of the two vectors.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;drawText&#039;&#039;&#039;(string text, vector origin, float scale, vector color, float align, float lifetime); ====&lt;br /&gt;
&lt;br /&gt;
:text drawing for debugging. lifetime of 0 == 1 frame.&lt;br /&gt;
::&#039;&#039;align&#039;&#039;: 0 = left, 1 = center, 2 = right&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;emitParticle&#039;&#039;&#039;(string particle, float startTime, float diversity, vector origin, vector angle); ====&lt;br /&gt;
&lt;br /&gt;
:Start a particle effect in the world without using an entity emitter. Will emit one quad per particle stage when first called with sys.getTime() as the start time. Designed to be called once per frame with the same startTime each call to achieve a normal particle effect, or on demand with sys.getTime() as the startTime for finer grained control, 1 quad at a time. Returns True (1) if there are more particles to be emitted from the stage, False (0) if the stage has released all its quads.&lt;br /&gt;
::&#039;&#039;particle&#039;&#039;: String: name of particle effect.&lt;br /&gt;
::&#039;&#039;startTime&#039;&#039;: Game seconds since map start: use sys.getTime() for the first call unless you want to back-date the particle so that it starts part way through its cycle.&lt;br /&gt;
::&#039;&#039;diversity&#039;&#039;: Randomizer value between 0 and 1. All particles with the same diversity will have the same path and rotation. Use sys.random(1) for a random path.&lt;br /&gt;
::&#039;&#039;origin&#039;&#039;: Origin of the particle effect.&lt;br /&gt;
::&#039;&#039;angle&#039;&#039;: Axis for the particle effect. Use $&amp;lt;entityname&amp;gt;.getAngles() to align the particle to an entity. use &#039;0 0 0&#039; for an upright (world-aligned) particle effect.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;error&#039;&#039;&#039;(string text); ====&lt;br /&gt;
&lt;br /&gt;
:Issues an error.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;fadeIn&#039;&#039;&#039;(vector color, float time); ====&lt;br /&gt;
&lt;br /&gt;
:Fades towards the given color over the given time in seconds.&lt;br /&gt;
::&#039;&#039;time&#039;&#039;: in seconds&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;fadeOut&#039;&#039;&#039;(vector color, float time); ====&lt;br /&gt;
&lt;br /&gt;
:Fades from the given color over the given time in seconds.&lt;br /&gt;
::&#039;&#039;time&#039;&#039;: in seconds&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;fadeTo&#039;&#039;&#039;(vector color, float alpha, float time); ====&lt;br /&gt;
&lt;br /&gt;
:Fades to the given color up to the given alpha over the given time in seconds.&lt;br /&gt;
::&#039;&#039;time&#039;&#039;: in seconds&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;firstPerson&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns view control to the player entity.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;floor&#039;&#039;&#039;(float x); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the largest integer that is less than or equal to the given value.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getCurrentMissionNum&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of the current mission (0-based, the first mission has number 0).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getcvar&#039;&#039;&#039;(string name); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the string for a cvar.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getcvarf&#039;&#039;&#039;(string name); ====&lt;br /&gt;
&lt;br /&gt;
:Returns float value for a cvar.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getDifficultyLevel&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns 0 (Easy), 1 (Medium) or 2 (Hard), depending on the difficulty level of the current mission.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getDifficultyName&#039;&#039;&#039;(float difficultyLevel); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the (translated) name of the difficulty level passed as the argument.&lt;br /&gt;
::&#039;&#039;difficultyLevel&#039;&#039;: 0 (Easy), 1 (Medium), 2 (Hard)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getEntity&#039;&#039;&#039;(string name); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a reference to the entity with the specified name.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getFrameTime&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:returns the length of time between game frames.  this is not related to renderer frame rate.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getInterceptTime&#039;&#039;&#039;(vector velocityTarget, float speedInterceptor, vector positionTarget, vector positionInterceptor); ====&lt;br /&gt;
&lt;br /&gt;
:Returns how much time it will take for an interceptor like a projectile to intercept a moving target at the earliest possible opportunity. Returns 0 if an intercept is not possible or the speed of the target and interceptor are too similar.&lt;br /&gt;
::&#039;&#039;velocityTarget&#039;&#039;: current velocity of target&lt;br /&gt;
::&#039;&#039;speedInterceptor&#039;&#039;: speed of interceptor&lt;br /&gt;
::&#039;&#039;positionTarget&#039;&#039;: current position of target&lt;br /&gt;
::&#039;&#039;positionInterceptor&#039;&#039;: starting position of interceptor&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getLocationPoint&#039;&#039;&#039;(vector point); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the idLocation entity corresponding to the specified point&#039;s location.&lt;br /&gt;
::&#039;&#039;point&#039;&#039;: point whose location to check&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getMainAmbientLight&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the entity of the main ambient light.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMissionStatistic&#039;&#039;&#039;(string statisticName); ====&lt;br /&gt;
&lt;br /&gt;
:Returns current mission statistic.&lt;br /&gt;
::&#039;&#039;statisticName&#039;&#039;: Can be one of (case insensitive): 	gamePlayTime: gameplay time in seconds 	damageDealt: damage dealt to enemies 	damageReceived: damage received by player 	healthReceived: health received by player 	pocketsPicked: pockets picked by player 	foundLoot: loot found by player 	missionLoot: total loot available in mission 	totalTimePlayerSeen: total time the player was seen by enemies in seconds. Updates only when AI lose sight of player 	numberTimesPlayerSeen: number of times player was seen by enemies 	numberTimesAISuspicious: number of times AI was &#039;observant&#039; or &#039;suspicious&#039;. A single AI passing through both alert levels will add 2 to the score. 	numberTimesAISearched: number of times AI was &#039;investigating&#039; or &#039;searching&#039;. A single AI passing through both alert levels will add 2 to the score. 	sightingScore: sighting score (number of times player was seen * weight) 	stealthScore: stealth score (sighting score + alerts * weights) 	killedByPlayer: number of enemies killed by player 	knockedOutByPlayer: number of enemies knocked out by player 	bodiesFound: number of times enemies have spotted a body 	secretsFound: number of secrets found by the player 	secretsTotal: total number of secrets in the mission &lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getNextEntity&#039;&#039;&#039;(string key, string value, entity lastMatch); ====&lt;br /&gt;
&lt;br /&gt;
:Discover all entities in the map. Returns $null_entity when no more found.&lt;br /&gt;
::&#039;&#039;key&#039;&#039;: Optional string: prefix for spawnarg key match. E.g. &amp;quot;target&amp;quot; will match &amp;quot;target&amp;quot;, &amp;quot;target1&amp;quot; etc.&lt;br /&gt;
::&#039;&#039;value&#039;&#039;: Optional string: spawnarg value to match. Can be used independently of &#039;&#039;key&#039;&#039;. If &#039;&#039;key&#039;&#039; is not set, all spawnargs will be checked for the value.&lt;br /&gt;
::&#039;&#039;lastMatch&#039;&#039;: Last match: search will start after this entity. Use $null_entity or pass an uninitialized entity variable to start a new search.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getPersistentFloat&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the floating point value for the given persistent arg&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getPersistentString&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the string for the given persistent arg&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getPersistentVector&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the vector for the given persistent arg&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getPortAISoundLoss&#039;&#039;&#039;(float handle); ====&lt;br /&gt;
&lt;br /&gt;
:AI sound propagation scriptfunction on the sys object&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getPortPlayerSoundLoss&#039;&#039;&#039;(float handle); ====&lt;br /&gt;
&lt;br /&gt;
:Player sound loss  scriptfunction on the sys object&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getPortSoundLoss&#039;&#039;&#039;(float handle); ====&lt;br /&gt;
&lt;br /&gt;
:Sound propagation scriptfunction on the sys object&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getRelation&#039;&#039;&#039;(float team1, float team2); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getTDMVersion&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get the current TDM version as integer. The value will be 108 for v1.08, 109 for v1.09 and 200 for v2.00 etc.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getTicsPerSecond&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:returns the number of game frames per second.  this is not related to renderer frame rate.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getTime&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current game time in seconds.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getTraceBody&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of the body part of the entity which was hit during the last call to trace or tracePoint&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getTraceEndPos&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the position the trace stopped due to a collision with solid geometry during the last call to trace or tracePoint&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getTraceEntity&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a reference to the entity which was hit during the last call to trace or tracePoint&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getTraceFraction&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the fraction of movement completed during the last call to trace or tracePoint.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getTraceJoint&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of the skeletal joint closest to the location on the entity which was hit during the last call to trace or tracePoint&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getTraceNormal&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the normal of the hit plane during the last call to trace or tracePoint&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getTraceSurfType&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the type of the surface (i.e. metal, snow) which was hit during the last call to trace or tracePoint&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;handleMissionEvent&#039;&#039;&#039;(entity objEnt, float eventType, string argument); ====&lt;br /&gt;
&lt;br /&gt;
:Generic interface for passing on mission events from scripts to the SDK. Available since TDM 1.02&lt;br /&gt;
::&#039;&#039;objEnt&#039;&#039;: the entity that triggered this event (e.g. a readable)&lt;br /&gt;
::&#039;&#039;eventType&#039;&#039;: a numeric identifier (enumerated both in MissionData.h and tdm_defs.script) specifying the type of event&lt;br /&gt;
::&#039;&#039;argument&#039;&#039;: an optional string parameter, eventtype-specific.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;influenceActive&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Checks if an influence is active&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;killthread&#039;&#039;&#039;(string threadName); ====&lt;br /&gt;
&lt;br /&gt;
:Kills all threads with the specified name&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;log&#039;&#039;&#039;(float x); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the log of the given argument.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;logString&#039;&#039;&#039;(float logClass, float logType, string output); ====&lt;br /&gt;
&lt;br /&gt;
:This is the script counterpart to DM_LOG&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;max&#039;&#039;&#039;(float x, float y); ====&lt;br /&gt;
&lt;br /&gt;
:returns the larger of two provided float values.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;min&#039;&#039;&#039;(float x, float y); ====&lt;br /&gt;
&lt;br /&gt;
:returns the smaller of two provided float values.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;music&#039;&#039;&#039;(string shaderName); ====&lt;br /&gt;
&lt;br /&gt;
:Starts playing background music.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;offsetRelation&#039;&#039;&#039;(float team1, float team2, float val); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;onSignal&#039;&#039;&#039;(float signalNum, entity ent, string functionName); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a script callback function for when the given signal is raised on the given entity.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;pause&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Pauses the current thread.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;pointInLiquid&#039;&#039;&#039;(vector point, entity ignoreEntity); ====&lt;br /&gt;
&lt;br /&gt;
:Checks if a point is in a liquid, returns 1 if this is the case.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;pointIsInBounds&#039;&#039;&#039;(vector point, vector mins, vector maxs); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the point is within the bounds specified.&lt;br /&gt;
::&#039;&#039;point&#039;&#039;: test whether this point is in the bounds&lt;br /&gt;
::&#039;&#039;mins&#039;&#039;: minimal corner of the bounds&lt;br /&gt;
::&#039;&#039;maxs&#039;&#039;: maximal corner of the bounds&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;pow&#039;&#039;&#039;(float x, float y); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the power of x to y.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;print&#039;&#039;&#039;(string text); ====&lt;br /&gt;
&lt;br /&gt;
:Prints the given string to the console.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;println&#039;&#039;&#039;(string text); ====&lt;br /&gt;
&lt;br /&gt;
:Prints the given line to the console.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;projectDecal&#039;&#039;&#039;(vector traceOrigin, vector traceEnd, entity passEntity, string decal, float decalSize, float angle); ====&lt;br /&gt;
&lt;br /&gt;
:Performs a trace from the specified origin and end positions, then projects a decal in that direction.&lt;br /&gt;
::&#039;&#039;traceOrigin&#039;&#039;: Start of the trace.&lt;br /&gt;
::&#039;&#039;traceEnd&#039;&#039;: End of the trace.&lt;br /&gt;
::&#039;&#039;passEntity&#039;&#039;: This entity will be considered non-solid by the trace.&lt;br /&gt;
::&#039;&#039;decal&#039;&#039;: Decal to be projected.&lt;br /&gt;
::&#039;&#039;decalSize&#039;&#039;: Size of the decal quad.&lt;br /&gt;
::&#039;&#039;angle&#039;&#039;: Angle of the decal quad.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;radiusDamage&#039;&#039;&#039;(vector origin, entity inflictor, entity attacker, entity ignore, string damageDefName, float dmgPower); ====&lt;br /&gt;
&lt;br /&gt;
:damages entities within a radius defined by the damageDef.  inflictor is the entity  causing the damage and can be the same as the attacker (in the case   of projectiles, the projectile is the inflictor, while the attacker is the character  that fired the projectile).&lt;br /&gt;
::&#039;&#039;inflictor&#039;&#039;: the entity causing the damage&lt;br /&gt;
::&#039;&#039;ignore&#039;&#039;: an entity to not cause damage to&lt;br /&gt;
::&#039;&#039;dmgPower&#039;&#039;: scales the damage (for cases where damage is dependent on time)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;random&#039;&#039;&#039;(float range); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a random value X where 0 &amp;lt;= X &amp;lt; range.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;saveConDump&#039;&#039;&#039;(string cmd, string cmd); ====&lt;br /&gt;
&lt;br /&gt;
:Saves condump into FM directory; first argument is appended to dump filename, everything before last occurence of second argument is removed&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;say&#039;&#039;&#039;(string text); ====&lt;br /&gt;
&lt;br /&gt;
:Multiplayer - Print this line on the network&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;sessionCommand&#039;&#039;&#039;(string cmd); ====&lt;br /&gt;
&lt;br /&gt;
:Sends the sessioncommand to the game&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setCamera&#039;&#039;&#039;(entity cameraEnt); ====&lt;br /&gt;
&lt;br /&gt;
:Turns over view control to the given camera entity.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setcvar&#039;&#039;&#039;(string name, string value); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a cvar.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setPersistentArg&#039;&#039;&#039;(string key, string value); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a key/value pair that persists between maps&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setPortAISoundLoss&#039;&#039;&#039;(float handle, float value); ====&lt;br /&gt;
&lt;br /&gt;
:AI sound propagation scriptfunction on the sys object&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setPortPlayerSoundLoss&#039;&#039;&#039;(float handle, float value); ====&lt;br /&gt;
&lt;br /&gt;
:Player sound loss scriptfunction on the sys object&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setPortSoundLoss&#039;&#039;&#039;(float handle, float value); ====&lt;br /&gt;
&lt;br /&gt;
:Sound propagation scriptfunction on the sys object&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setRelation&#039;&#039;&#039;(float team1, float team2, float val); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSecretsFound&#039;&#039;&#039;(float secrets); ====&lt;br /&gt;
&lt;br /&gt;
:Set how many secrets the player has found. Use getMissionStatistic() for getting the current value.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSecretsTotal&#039;&#039;&#039;(float secrets); ====&lt;br /&gt;
&lt;br /&gt;
:Set how many secrets exist in the map in total. Use getMissionStatistic() for getting the current value.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setShaderParm&#039;&#039;&#039;(float parm, float value); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the value of the specified shader parm.&lt;br /&gt;
::&#039;&#039;parm&#039;&#039;: shader parm index&lt;br /&gt;
::&#039;&#039;value&#039;&#039;: new value&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSpawnArg&#039;&#039;&#039;(string key, string value); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a key/value pair to be used when a new entity is spawned.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;sin&#039;&#039;&#039;(float degrees); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the sine of the given angle in degrees.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;spawn&#039;&#039;&#039;(string classname); ====&lt;br /&gt;
&lt;br /&gt;
:Creates an entity of the specified classname and returns a reference to the entity.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;SpawnFloat&#039;&#039;&#039;(string key, float default); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the floating point value for the given spawn argument.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;SpawnString&#039;&#039;&#039;(string key, string default); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the string for the given spawn argument.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;SpawnVector&#039;&#039;&#039;(string key, vector default); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the vector for the given spawn argument.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;sqrt&#039;&#039;&#039;(float square); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the square root of the given number.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;strFind&#039;&#039;&#039;(string text, string find, float casesensitive, float start, float end); ====&lt;br /&gt;
&lt;br /&gt;
:Return the position of the given substring, counting from 0, or -1 if not found.&lt;br /&gt;
::&#039;&#039;casesensitive&#039;&#039;: 0&lt;br /&gt;
::&#039;&#039;start&#039;&#039;: 0&lt;br /&gt;
::&#039;&#039;end&#039;&#039;: -1&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;strLeft&#039;&#039;&#039;(string text, float num); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a string composed of the first num characters&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;strLength&#039;&#039;&#039;(string text); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of characters in the string&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;strMid&#039;&#039;&#039;(string text, float start, float num); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a string composed of the characters from start to start + num&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;strRemove&#039;&#039;&#039;(string text, string remove); ====&lt;br /&gt;
&lt;br /&gt;
:Replace all occurances of the given substring with &amp;quot;&amp;quot;. Example: StrRemove(&amp;quot;abba&amp;quot;,&amp;quot;bb&amp;quot;) results in &amp;quot;aa&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;strReplace&#039;&#039;&#039;(string text, string remove, string replace); ====&lt;br /&gt;
&lt;br /&gt;
:Replace all occurances of the given string with the replacement string. Example: StrRemove(&amp;quot;abba&amp;quot;,&amp;quot;bb&amp;quot;,&amp;quot;ccc&amp;quot;) results in &amp;quot;accca&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;strRight&#039;&#039;&#039;(string text, float num); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a string composed of the last num characters&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;strSkip&#039;&#039;&#039;(string text, float num); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the string following the first num characters&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;strToFloat&#039;&#039;&#039;(string text); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the numeric value of the given string.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;strToInt&#039;&#039;&#039;(string text); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the integer value of the given string.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;terminate&#039;&#039;&#039;(float threadNumber); ====&lt;br /&gt;
&lt;br /&gt;
:Terminates a thread.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;threadname&#039;&#039;&#039;(string name); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the name of the current thread.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;trace&#039;&#039;&#039;(vector start, vector end, vector mins, vector maxs, float contents_mask, entity passEntity); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the fraction of movement completed before the box from &#039;mins&#039; to &#039;maxs&#039; hits solid geometry when moving from &#039;start&#039; to &#039;end&#039;. The &#039;passEntity&#039; is considered non-solid during the move.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;tracePoint&#039;&#039;&#039;(vector start, vector end, float contents_mask, entity passEntity); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the fraction of movement completed before the trace hits solid geometry when moving from &#039;start&#039; to &#039;end&#039;. The &#039;passEntity&#039; is considered non-solid during the move.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;translate&#039;&#039;&#039;(string input); ====&lt;br /&gt;
&lt;br /&gt;
:Translates a string (like #str_12345) into the current language&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;trigger&#039;&#039;&#039;(entity entityToTrigger); ====&lt;br /&gt;
&lt;br /&gt;
:Triggers the given entity.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;vecLength&#039;&#039;&#039;(vector vec); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the length of the given vector.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;vecNormalize&#039;&#039;&#039;(vector vec); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the normalized version of the given vector.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;VecRotate&#039;&#039;&#039;(vector vector, vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Rotates a vector by the specified angles.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;VecToAngles&#039;&#039;&#039;(vector vec); ====&lt;br /&gt;
&lt;br /&gt;
:Returns Euler angles for the given direction.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;wait&#039;&#039;&#039;(float time); ====&lt;br /&gt;
&lt;br /&gt;
:Suspends execution of the current thread for the given number of seconds.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;waitFor&#039;&#039;&#039;(entity mover); ====&lt;br /&gt;
&lt;br /&gt;
:Waits for the given entity to complete its move.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;waitForRender&#039;&#039;&#039;(entity e); ====&lt;br /&gt;
&lt;br /&gt;
:Suspends the current thread until &#039;e&#039; might have been rendered. It&#039;s event based, so it doesn&#039;t waste CPU repeatedly checking inPVS(). e.inPVS() will very likely be true when the thread resumes. If e.inPVS() is true, calling waitForRender() will probably just wait a frame, unless D3 can figure out that the entity doesn&#039;t need to be rendered. Optimizations regarding shadowcasting lights may not apply to this function - it is based purely off whether or not the entity&#039;s bounding box is visible.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;waitForThread&#039;&#039;&#039;(float threadNumber); ====&lt;br /&gt;
&lt;br /&gt;
:Waits for the given thread to terminate.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;waitFrame&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Suspends execution of current thread for one game frame.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;warning&#039;&#039;&#039;(string text); ====&lt;br /&gt;
&lt;br /&gt;
:Issues a warning.&lt;br /&gt;
&lt;br /&gt;
=== idSecurityCamera ===&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canSee&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getEnemy&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getNextEnemy&#039;&#039;&#039;(entity lastMatch); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the next enemy that the security camera can see.&lt;br /&gt;
::&#039;&#039;lastMatch&#039;&#039;: search will start after this entity.Use $null_entity or pass an uninitialized entity variable to start a new search.The first result in a new search will be the player, if the camera can see him.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getSecurityCameraState&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the security camera&#039;s state. 1 = unalerted, 2 = suspicious, 3 = fully alerted, 4 = inactive, 5 = destroyed.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getSpotLight&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the spotlight used by the camera. Returns null_entity if none is used.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Off&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Switches the emitter off.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;On&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Switches the emitter on.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSightThreshold&#039;&#039;&#039;(float sightThreshold); ====&lt;br /&gt;
&lt;br /&gt;
:Set the sight threshold of the security camera: how lit up the player&#039;s lightgem needs to be in order to be seen. 0.0 to 1.0&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;state_light&#039;&#039;&#039;(float set); ====&lt;br /&gt;
&lt;br /&gt;
:Switches the spotlight on or off. Respects the security camera&#039;s power state.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;state_see_AI&#039;&#039;&#039;(float set); ====&lt;br /&gt;
&lt;br /&gt;
:Set whether the camera can see AIs.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;state_see_animals&#039;&#039;&#039;(float set); ====&lt;br /&gt;
&lt;br /&gt;
:Set whether the camera can see animals. Checked after seeAI or seeBodies.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;state_see_bodies&#039;&#039;&#039;(float set); ====&lt;br /&gt;
&lt;br /&gt;
:Set whether the camera can see bodies.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;state_see_player&#039;&#039;&#039;(float set); ====&lt;br /&gt;
&lt;br /&gt;
:Set whether the camera can see the player.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;state_sweep&#039;&#039;&#039;(float set); ====&lt;br /&gt;
&lt;br /&gt;
:Enables or disables the camera&#039;s sweeping.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;toggle_light&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Toggles the spotlight on/off.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;toggle_see_AI&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Toggles whether the camera can see AIs.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;toggle_see_animals&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Toggles whether the camera can see bodies. Checked after seeAI or seeBodies.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;toggle_see_bodies&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Toggles whether the camera can see bodies.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;toggle_see_player&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Toggles whether the camera can see the player.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;toggle_sweep&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Toggles the camera sweep.&lt;br /&gt;
&lt;br /&gt;
=== Seed ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;cullAll&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Cull (remove from world) all entities.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Disables the mover/trigger&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Enables the mover/trigger&lt;br /&gt;
&lt;br /&gt;
=== idSound ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Off&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Switches the emitter off.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;On&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Switches the emitter on.&lt;br /&gt;
&lt;br /&gt;
=== idTarget_Remove ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_Show ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_Damage ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_SessionCommand ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_EndLevel ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_WaitForButton ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_SetGlobalShaderTime ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_SetShaderParm ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_SetShaderTime ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_FadeEntity ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_LightFadeIn ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_LightFadeOut ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_Give ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_SetModel ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_SetInfluence ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_SetKeyVal ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_SetFov ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_CallObjectFunction ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_PostScriptEvent ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_EnableLevelWeapons ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_RemoveWeapons ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_FadeSoundClass ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== CTarget_AddObjectives ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== CTarget_SetObjectiveState ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== CTarget_SetObjectiveVisibility ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== CTarget_SetObjectiveComponentState ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== CTarget_StartConversation ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== CTarget_SetFrobable ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== CTarget_CallScriptFunction ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== CTarget_ChangeLockState ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== CTarget_ChangeTarget ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== CTarget_InterMissionTrigger ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== CTarget_SetTeam ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== CTarget_ItemRemove ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTrigger ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Disables the mover/trigger&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Enables the mover/trigger&lt;br /&gt;
&lt;br /&gt;
=== idTrigger_Multi ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTrigger_EntityName ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTrigger_Timer ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTrigger_Count ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTrigger_Hurt ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTrigger_Fade ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTrigger_Touch ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTurret ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;attack&#039;&#039;&#039;(entity enemy, float ignoreCollisions); ====&lt;br /&gt;
&lt;br /&gt;
:Direct the turret to manually attack the specified entity. Use disableManualAttack() to disable.&lt;br /&gt;
::&#039;&#039;enemy&#039;&#039;: enemy to attack&lt;br /&gt;
::&#039;&#039;ignoreCollisions&#039;&#039;: whether to ignore obstacles in the way to the enemy when planning to attack&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;attackPosition&#039;&#039;&#039;(vector targetPos, float ignoreCollisions); ====&lt;br /&gt;
&lt;br /&gt;
:Direct the turret to manually attack a position. Use disableManualAttack() to disable.&lt;br /&gt;
::&#039;&#039;targetPos&#039;&#039;: position to attack&lt;br /&gt;
::&#039;&#039;ignoreCollisions&#039;&#039;: whether to ignore obstacles in the way to the target position when planning to attack. Recommended true for this event.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disableManualAttack&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Stop attacking the manually specified enemy or position and return to automatic target acquisition mode.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getTurretState&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the turret&#039;s state.  0 = passive: no active security cameras connected. 1 = unalerted, 2 = suspicious, 3 = fully alerted, 4 = power off, 5 = destroyed.&lt;br /&gt;
&lt;br /&gt;
=== idWeapon ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;addToClip&#039;&#039;&#039;(float amount); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;allowDrop&#039;&#039;&#039;(float allow); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;ammoAvailable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Number of shots left in inventory&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;ammoInClip&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;animDone&#039;&#039;&#039;(float channel, float blendOutFrames); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the animation playing on the given channel is completed considering a number of blend frames.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;animIsPaused&#039;&#039;&#039;(float channel); ====&lt;br /&gt;
&lt;br /&gt;
:Return whether the given anim channel is paused&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;clipSize&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;createProjectile&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ejectBrass&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;flashlight&#039;&#039;&#039;(float enable); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getBlendFrames&#039;&#039;&#039;(float channel); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of frames to blend between animations on the given channel.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getLightParm&#039;&#039;&#039;(float parmNum); ====&lt;br /&gt;
&lt;br /&gt;
:Gets a shader parameter.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getOwner&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the owning entity&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getWorldModel&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the entity that controls the world model&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isInvisible&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;launchProjectiles&#039;&#039;&#039;(float num_projectiles, float spread, float fuseOffset, float launchPower, float dmgPower); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;melee&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;netEndReload&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;netReload&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;nextWeapon&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;pauseAnim&#039;&#039;&#039;(float channel, float bPause); ====&lt;br /&gt;
&lt;br /&gt;
:Pause all animations playing on the given channel. NOTE: Can also be used used by idWeapons&lt;br /&gt;
::&#039;&#039;bPause&#039;&#039;: true = pause, false = unpause&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;playAnim&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Do not use, this is part of TDM&#039;s internal mechanics. Use playCustomAnim() on AI.in scripts instead of this. Plays the given animation on the given channel. Returns false if anim doesn&#039;t exist.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;playCycle&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Continuously repeats the given animation on the given channel.  Returns false if anim doesn&#039;t exist.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setBlendFrames&#039;&#039;&#039;(float channel, float blendFrame); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the number of frames to blend between animations on the given channel.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setLightParm&#039;&#039;&#039;(float parmNum, float value); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a shader parameter.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setLightParms&#039;&#039;&#039;(float parm0, float parm1, float parm2, float parm3); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the red/green/blue/alpha shader parms on the light and the model.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;showAttachment&#039;&#039;&#039;(string attName, float show); ====&lt;br /&gt;
&lt;br /&gt;
:Show or hide an attachment.&lt;br /&gt;
::&#039;&#039;show&#039;&#039;: 1 shows attachment, 0 hides it.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;showAttachmentInd&#039;&#039;&#039;(float index, float show); ====&lt;br /&gt;
&lt;br /&gt;
:Show or hide an attachment by array index.&lt;br /&gt;
::&#039;&#039;index&#039;&#039;: starts at 0&lt;br /&gt;
::&#039;&#039;show&#039;&#039;: 1 shows attachment, 0 hides it.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;totalAmmoCount&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Amount of ammo in inventory. since each shot may use more than 1 ammo, this is different than ammoAvailable()&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;useAmmo&#039;&#039;&#039;(float amount); ====&lt;br /&gt;
&lt;br /&gt;
:Eats the specified amount of ammo&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;weaponHolstered&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;weaponLowering&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;weaponOutOfAmmo&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;weaponReady&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;weaponReloading&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;weaponRising&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;weaponState&#039;&#039;&#039;(string stateFunction, float blendFrames); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
[[Category:Scripting]]&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=Analyze_a_Memory_Dump&amp;diff=33965</id>
		<title>Analyze a Memory Dump</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=Analyze_a_Memory_Dump&amp;diff=33965"/>
		<updated>2025-04-26T21:01:32Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: Debug symbols exist for Linux builds too.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;You received a crash dump and don&#039;t know how to analyze it?&lt;br /&gt;
That&#039;s not a big deal, really.&lt;br /&gt;
Don&#039;t get scared by numerous references to WinDbg and CDB in relation to memory dumps!&lt;br /&gt;
You can open dumps directly in Visual Studio debugger.&lt;br /&gt;
&lt;br /&gt;
Before starting, you might want to read [https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/user-mode-dump-files Microsoft docs about memory dumps], so that understand what it is and what is included.&lt;br /&gt;
&lt;br /&gt;
===== Learn version =====&lt;br /&gt;
First of all, you need to know which exact version of program the memory dump was obtained from. You should learn the exact state of source code, and build platform + configuration.&lt;br /&gt;
&lt;br /&gt;
Here are some options:&lt;br /&gt;
* TheDarkMod final release: ask the TDM version, like 2.07.&lt;br /&gt;
* TheDarkMod beta release: ask when player has updated TDM last time. Or ask him to attach console dump. Or ask him to open game console and look at the revision number there.&lt;br /&gt;
* TheDarkMod developer build: ask developer about source code revision, platform and configuration.&lt;br /&gt;
&lt;br /&gt;
Bitness is not important: you will know it immediately when you open the dump.&lt;br /&gt;
&lt;br /&gt;
===== Get source code =====&lt;br /&gt;
Get the matching version of source code. In the case of TDM game or updater, you most likely need to switch to specific revision on the release branch/tag.&lt;br /&gt;
&lt;br /&gt;
===== Get debug symbols =====&lt;br /&gt;
This is the hardest part: you need the debug symbols (i.e. the PDB files) for the binaries from which the memory dump was saved.&lt;br /&gt;
&lt;br /&gt;
Here are some options:&lt;br /&gt;
* TheDarkMod final release: find PDBs in &amp;lt;tt&amp;gt;devel/release/debugging/X.YZ/&amp;lt;/tt&amp;gt; in assets SVN, and unpack them.&lt;br /&gt;
* TheDarkMod beta release: ask release manager to upload PDBs somewhere (he usually saves them).&lt;br /&gt;
* TheDarkMod developer build: ask developer to upload the matching PDB.&lt;br /&gt;
&lt;br /&gt;
The situation is the same for Linux builds as well.&lt;br /&gt;
All the Linux builds produce debug symbols in a separate file (e.g. &amp;lt;tt&amp;gt;thedarkmod.x64.debug&amp;lt;/tt&amp;gt;), and this file is treated just like PDB.&lt;br /&gt;
&lt;br /&gt;
On Windows, every PDB and DMP file contains checksum of executable, and normally you cannot use PDB for memory dump if the checksums don&#039;t match, just like you cannot use a PDB to debug a program if it does not match. Merely rebuilding the project is enough to break PDB compatibility. Not sure if the same problem exists for Linux + GDB.&lt;br /&gt;
&lt;br /&gt;
If you cannot get the original PDB but have the original executable, then you can also try to force-load freshly built PDBs. Here are the steps:&lt;br /&gt;
# Get exactly matching source code, compiler, target, configuration, whatever else.&lt;br /&gt;
# Build new binaries (fresh rebuild advised).&lt;br /&gt;
# Find the created PDB files and use [http://www.debuginfo.com/tools/chkmatch.html chkmatch -m] to substitute checksum inside PDB.&lt;br /&gt;
&lt;br /&gt;
Of course, using mismatched PDB can lead to all sort of issues during debugging.&lt;br /&gt;
&lt;br /&gt;
=== Action ===&lt;br /&gt;
&lt;br /&gt;
Open the solution in Visual Studio (instructions written against VS2017).&lt;br /&gt;
&lt;br /&gt;
In menu: &amp;quot;File -&amp;gt; Open -&amp;gt; File...&amp;quot;. Choose the memory dump file.&lt;br /&gt;
&lt;br /&gt;
[[File:crashdump_1_open.png|border|700px]]&lt;br /&gt;
&lt;br /&gt;
You will see some general info, most of which is useless. Click &amp;lt;u&amp;gt;Debug with Native Only&amp;lt;/u&amp;gt; link in the top-right corner.&lt;br /&gt;
&lt;br /&gt;
[[File:crashdump_2_pdb.png|border|700px]]&lt;br /&gt;
&lt;br /&gt;
Most likely you will see this screen about missing PDB. Click on &amp;lt;u&amp;gt;Browse and find xxx.pdb...&amp;lt;/u&amp;gt; link. Find the directory where the PDB file is located.&lt;br /&gt;
&lt;br /&gt;
Visual Studio will accept debug symbols immediately when you open the directory containing them. Make sure the PDB files are unpacked.&lt;br /&gt;
&lt;br /&gt;
[[File:crashdump_3_result.png|border|700px]]&lt;br /&gt;
&lt;br /&gt;
Now you should see where execution stopped, probably exception code also, You can navigate readable call stack, inspect global and local variables.&lt;br /&gt;
&lt;br /&gt;
Everything you can normally do in Visual Studio when program is paused, you can also do with memory dump.&lt;br /&gt;
&lt;br /&gt;
Happy debugging!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Linux core dumps ===&lt;br /&gt;
&lt;br /&gt;
In case of Linux core dump, the initial steps are mostly the same:&lt;br /&gt;
# Learn the exact version of TDM.&lt;br /&gt;
# Get the source code of this version.&lt;br /&gt;
# Get debug symbols for this version (named like &amp;lt;tt&amp;gt;thedarkmod.x64.debug&amp;lt;/tt&amp;gt;).&lt;br /&gt;
# Also obtain TDM executable of this version (e.g. &amp;lt;tt&amp;gt;thedarkmod.x64&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Put core dump, executable, debug symbols into current directory, then:&lt;br /&gt;
# Run gdb (without any program).&lt;br /&gt;
# Execute (within gdb): &amp;lt;tt&amp;gt;file thedarkmod.x64&amp;lt;/tt&amp;gt;&lt;br /&gt;
# Make sure gdb reads debug symbols successfully.&lt;br /&gt;
# Load core dump like this: &amp;lt;tt&amp;gt;core core.27372&amp;lt;/tt&amp;gt;&lt;br /&gt;
# Now you are ready to see stacktrace: &amp;lt;tt&amp;gt;bt&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is how it looks in action:&lt;br /&gt;
&lt;br /&gt;
[[File:Coredump 3 analyze.png|border|1000px]]&lt;br /&gt;
&lt;br /&gt;
You might also need to set source code path if gdb cannot display the source code.&lt;br /&gt;
I suppose it is done using &amp;lt;tt&amp;gt;directory&amp;lt;/tt&amp;gt; command... (can&#039;t test right now).&lt;br /&gt;
&lt;br /&gt;
===== System libraries issue =====&lt;br /&gt;
&lt;br /&gt;
In order to display stacktrace, GDB starts at the current stack position and moves towards less nested functions calls.&lt;br /&gt;
To achieve it, it needs to somehow detect a chunk of stack which corresponds to the current function call.&lt;br /&gt;
&lt;br /&gt;
Under normal circumstances, it is done using the standard structure of &amp;quot;frame pointers&amp;quot;.&lt;br /&gt;
But unfortunately, binaries in modern Linux distros are often built with &amp;quot;omit frame pointers&amp;quot; flag, because this way they run a tiny little bit faster.&lt;br /&gt;
An alternative way to stack unwinding is to use debug information, which is usually preserved in some capacity even for the system binaries deployed to our machines.&lt;br /&gt;
In case of TDM engine it resides in a separate file, but system libraries usually contain debug info within itself.&lt;br /&gt;
&lt;br /&gt;
When you analyze a core dump, it might happen that you don&#039;t see a complete backtrace, because GDB can&#039;t unwind beyond a function from some system library (usually libc or libpthread).&lt;br /&gt;
In order to unwind through such a library, you need to obtain its binary, exactly as it was on the machine when/where the core dump was recorded.&lt;br /&gt;
Note that your local binary most likely has different version and does not match!&lt;br /&gt;
And the core dump does not contain this info either, so you need to ask these binaries from the person who provided the core dump.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, loading these extra libraries into GDB is very painful!&lt;br /&gt;
Here is a list of GDB commands which I used the only time I had to do it:&lt;br /&gt;
&lt;br /&gt;
 # note: all the .so files obtained from user machine must be put into local directory.&lt;br /&gt;
 #&lt;br /&gt;
 # most importantly, the following files are necessary:&lt;br /&gt;
 #   1. libthread_db.so.1 and libpthread.so.0: required for thread debugging.&lt;br /&gt;
 #   2. other .so files are required if they occur in call stack.&lt;br /&gt;
 #&lt;br /&gt;
 # these files must also be renamed exactly as the symlinks&lt;br /&gt;
 # i.e. libpthread-2.28.so should be renamed to libpthread.so.0&lt;br /&gt;
 &lt;br /&gt;
 # load executable file&lt;br /&gt;
 file ./thedarkmod.x64&lt;br /&gt;
 &lt;br /&gt;
 # force gdb to forget about local system!&lt;br /&gt;
 # load all .so files using local directory as root&lt;br /&gt;
 set sysroot .&lt;br /&gt;
 &lt;br /&gt;
 # drop dump-recorded paths to .so files&lt;br /&gt;
 # i.e. load ./libpthread.so.0 instead of ./lib/x86_64-linux-gnu/libpthread.so.0&lt;br /&gt;
 set solib-search-path .&lt;br /&gt;
 # disable damn security protection&lt;br /&gt;
 set auto-load safe-path /&lt;br /&gt;
 &lt;br /&gt;
 # load core dump file&lt;br /&gt;
 core core.6487&lt;br /&gt;
 &lt;br /&gt;
 # print stacktrace&lt;br /&gt;
 bt&lt;br /&gt;
&lt;br /&gt;
You can see more information about that painful experience in the [https://forums.thedarkmod.com/index.php?/topic/21060-mission-downloader-issue/page/2/#findComment-465439 forum thread Mission downloader issue].&lt;br /&gt;
&lt;br /&gt;
[[Category:Coding]]&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=Analyze_a_Memory_Dump&amp;diff=33940</id>
		<title>Analyze a Memory Dump</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=Analyze_a_Memory_Dump&amp;diff=33940"/>
		<updated>2025-04-12T00:44:03Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: Added a section about analysing Linux core dumps&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;You received a crash dump and don&#039;t know how to analyze it?&lt;br /&gt;
That&#039;s not a big deal, really.&lt;br /&gt;
Don&#039;t get scared by numerous references to WinDbg and CDB in relation to memory dumps!&lt;br /&gt;
You can open dumps directly in Visual Studio debugger.&lt;br /&gt;
&lt;br /&gt;
Before starting, you might want to read [https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/user-mode-dump-files Microsoft docs about memory dumps], so that understand what it is and what is included.&lt;br /&gt;
&lt;br /&gt;
===== Learn version =====&lt;br /&gt;
First of all, you need to know which exact version of program the memory dump was obtained from. You should learn the exact state of source code, and build platform + configuration.&lt;br /&gt;
&lt;br /&gt;
Here are some options:&lt;br /&gt;
* TheDarkMod final release: ask the TDM version, like 2.07.&lt;br /&gt;
* TheDarkMod beta release: ask when player has updated TDM last time. Or ask him to attach console dump. Or ask him to open game console and look at the revision number there.&lt;br /&gt;
* TheDarkMod developer build: ask developer about source code revision, platform and configuration.&lt;br /&gt;
&lt;br /&gt;
Bitness is not important: you will know it immediately when you open the dump.&lt;br /&gt;
&lt;br /&gt;
===== Get source code =====&lt;br /&gt;
Get the matching version of source code. In the case of TDM game or updater, you most likely need to switch to specific revision on the release branch/tag.&lt;br /&gt;
&lt;br /&gt;
===== Get debug symbols =====&lt;br /&gt;
This is the hardest part: you need the debug symbols (i.e. the PDB files) for the binaries from which the memory dump was saved.&lt;br /&gt;
&lt;br /&gt;
Every PDB and DMP file contains checksum of executable, and normally you cannot use PDB for memory dump if the checksums don&#039;t match, just like you cannot use a PDB to debug a program if it does not match. Merely rebuilding the project is enough to break PDB compatibility.&lt;br /&gt;
&lt;br /&gt;
Here are some options:&lt;br /&gt;
* TheDarkMod final release: find PDBs in &amp;lt;tt&amp;gt;devel/release/debugging/X.YZ/&amp;lt;/tt&amp;gt; in assets SVN, and unpack them.&lt;br /&gt;
* TheDarkMod beta release: ask release manager to upload PDBs somewhere (he usually saves them).&lt;br /&gt;
* TheDarkMod developer build: ask developer to upload the matching PDB.&lt;br /&gt;
&lt;br /&gt;
If you cannot get the original PDB but have the original executable, then you can also try to force-load freshly built PDBs. Here are the steps:&lt;br /&gt;
# Get exactly matching source code, compiler, target, configuration, whatever else.&lt;br /&gt;
# Build new binaries (fresh rebuild advised).&lt;br /&gt;
# Find the created PDB files and use [http://www.debuginfo.com/tools/chkmatch.html chkmatch -m] to substitute checksum inside PDB.&lt;br /&gt;
&lt;br /&gt;
Of course, using mismatched PDB can lead to all sort of issues during debugging.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Action ===&lt;br /&gt;
&lt;br /&gt;
Open the solution in Visual Studio (instructions written against VS2017).&lt;br /&gt;
&lt;br /&gt;
In menu: &amp;quot;File -&amp;gt; Open -&amp;gt; File...&amp;quot;. Choose the memory dump file.&lt;br /&gt;
&lt;br /&gt;
[[File:crashdump_1_open.png|border|700px]]&lt;br /&gt;
&lt;br /&gt;
You will see some general info, most of which is useless. Click &amp;lt;u&amp;gt;Debug with Native Only&amp;lt;/u&amp;gt; link in the top-right corner.&lt;br /&gt;
&lt;br /&gt;
[[File:crashdump_2_pdb.png|border|700px]]&lt;br /&gt;
&lt;br /&gt;
Most likely you will see this screen about missing PDB. Click on &amp;lt;u&amp;gt;Browse and find xxx.pdb...&amp;lt;/u&amp;gt; link. Find the directory where the PDB file is located.&lt;br /&gt;
&lt;br /&gt;
Visual Studio will accept debug symbols immediately when you open the directory containing them. Make sure the PDB files are unpacked.&lt;br /&gt;
&lt;br /&gt;
[[File:crashdump_3_result.png|border|700px]]&lt;br /&gt;
&lt;br /&gt;
Now you should see where execution stopped, probably exception code also, You can navigate readable call stack, inspect global and local variables.&lt;br /&gt;
&lt;br /&gt;
Everything you can normally do in Visual Studio when program is paused, you can also do with memory dump.&lt;br /&gt;
&lt;br /&gt;
Happy debugging!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Linux core dumps ===&lt;br /&gt;
&lt;br /&gt;
In case of Linux core dump, the initial steps are mostly the same:&lt;br /&gt;
# Learn the exact version of TDM.&lt;br /&gt;
# Get the source code of this version.&lt;br /&gt;
# Get debug symbols for this version (named like &amp;lt;tt&amp;gt;thedarkmod.x64.debug&amp;lt;/tt&amp;gt;).&lt;br /&gt;
# Also obtain TDM executable of this version (e.g. &amp;lt;tt&amp;gt;thedarkmod.x64&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Put core dump, executable, debug symbols into current directory, then:&lt;br /&gt;
# Run gdb (without any program).&lt;br /&gt;
# Execute (within gdb): &amp;lt;tt&amp;gt;file thedarkmod.x64&amp;lt;/tt&amp;gt;&lt;br /&gt;
# Make sure gdb reads debug symbols successfully.&lt;br /&gt;
# Load core dump like this: &amp;lt;tt&amp;gt;core core.27372&amp;lt;/tt&amp;gt;&lt;br /&gt;
# Now you are ready to see stacktrace: &amp;lt;tt&amp;gt;bt&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is how it looks in action:&lt;br /&gt;
&lt;br /&gt;
[[File:Coredump 3 analyze.png|border|1000px]]&lt;br /&gt;
&lt;br /&gt;
You might also need to set source code path if gdb cannot display the source code.&lt;br /&gt;
I suppose it is done using &amp;lt;tt&amp;gt;directory&amp;lt;/tt&amp;gt; command... (can&#039;t test right now).&lt;br /&gt;
&lt;br /&gt;
===== System libraries issue =====&lt;br /&gt;
&lt;br /&gt;
In order to display stacktrace, GDB starts at the current stack position and moves towards less nested functions calls.&lt;br /&gt;
To achieve it, it needs to somehow detect a chunk of stack which corresponds to the current function call.&lt;br /&gt;
&lt;br /&gt;
Under normal circumstances, it is done using the standard structure of &amp;quot;frame pointers&amp;quot;.&lt;br /&gt;
But unfortunately, binaries in modern Linux distros are often built with &amp;quot;omit frame pointers&amp;quot; flag, because this way they run a tiny little bit faster.&lt;br /&gt;
An alternative way to stack unwinding is to use debug information, which is usually preserved in some capacity even for the system binaries deployed to our machines.&lt;br /&gt;
In case of TDM engine it resides in a separate file, but system libraries usually contain debug info within itself.&lt;br /&gt;
&lt;br /&gt;
When you analyze a core dump, it might happen that you don&#039;t see a complete backtrace, because GDB can&#039;t unwind beyond a function from some system library (usually libc or libpthread).&lt;br /&gt;
In order to unwind through such a library, you need to obtain its binary, exactly as it was on the machine when/where the core dump was recorded.&lt;br /&gt;
Note that your local binary most likely has different version and does not match!&lt;br /&gt;
And the core dump does not contain this info either, so you need to ask these binaries from the person who provided the core dump.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, loading these extra libraries into GDB is very painful!&lt;br /&gt;
Here is a list of GDB commands which I used the only time I had to do it:&lt;br /&gt;
&lt;br /&gt;
 # note: all the .so files obtained from user machine must be put into local directory.&lt;br /&gt;
 #&lt;br /&gt;
 # most importantly, the following files are necessary:&lt;br /&gt;
 #   1. libthread_db.so.1 and libpthread.so.0: required for thread debugging.&lt;br /&gt;
 #   2. other .so files are required if they occur in call stack.&lt;br /&gt;
 #&lt;br /&gt;
 # these files must also be renamed exactly as the symlinks&lt;br /&gt;
 # i.e. libpthread-2.28.so should be renamed to libpthread.so.0&lt;br /&gt;
 &lt;br /&gt;
 # load executable file&lt;br /&gt;
 file ./thedarkmod.x64&lt;br /&gt;
 &lt;br /&gt;
 # force gdb to forget about local system!&lt;br /&gt;
 # load all .so files using local directory as root&lt;br /&gt;
 set sysroot .&lt;br /&gt;
 &lt;br /&gt;
 # drop dump-recorded paths to .so files&lt;br /&gt;
 # i.e. load ./libpthread.so.0 instead of ./lib/x86_64-linux-gnu/libpthread.so.0&lt;br /&gt;
 set solib-search-path .&lt;br /&gt;
 # disable damn security protection&lt;br /&gt;
 set auto-load safe-path /&lt;br /&gt;
 &lt;br /&gt;
 # load core dump file&lt;br /&gt;
 core core.6487&lt;br /&gt;
 &lt;br /&gt;
 # print stacktrace&lt;br /&gt;
 bt&lt;br /&gt;
&lt;br /&gt;
You can see more information about that painful experience in the [https://forums.thedarkmod.com/index.php?/topic/21060-mission-downloader-issue/page/2/#findComment-465439 forum thread Mission downloader issue].&lt;br /&gt;
&lt;br /&gt;
[[Category:Coding]]&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=File:Coredump_3_analyze.png&amp;diff=33939</id>
		<title>File:Coredump 3 analyze.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=File:Coredump_3_analyze.png&amp;diff=33939"/>
		<updated>2025-04-12T00:22:20Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: Stgatilov uploaded a new version of File:Coredump 3 analyze.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=File:Coredump_3_analyze.png&amp;diff=33938</id>
		<title>File:Coredump 3 analyze.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=File:Coredump_3_analyze.png&amp;diff=33938"/>
		<updated>2025-04-12T00:15:52Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=Save_a_Memory_Dump_for_debugging_Crashes&amp;diff=33937</id>
		<title>Save a Memory Dump for debugging Crashes</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=Save_a_Memory_Dump_for_debugging_Crashes&amp;diff=33937"/>
		<updated>2025-04-12T00:00:39Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: Cleaning the GDB section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;DarkRadiant or TheDarkMod crashed? If you don&#039;t want that to happen again, you need to help the team to debug this malfunction &amp;lt;br&amp;gt;&lt;br /&gt;
You can do this by dumping process memory to a file, which can then be used by developers to debug and inspect the application&#039;s state at the point in time it crashed.&lt;br /&gt;
&lt;br /&gt;
If a crash is reproducible, it might be enough to describe the exact steps that lead up to the fault and file a bug report on the [http://bugs.thedarkmod.com bugtracker]. &amp;lt;br&amp;gt; &lt;br /&gt;
But more often than sometimes crashes occur out of seemingly nothing and are barely reproducible, and in this case a saved memory dump is even more valuable for debugging purposes.&lt;br /&gt;
&lt;br /&gt;
In principle, recording memory dumps is not limited to crashed applications.&amp;lt;br&amp;gt;&lt;br /&gt;
It is possible to record memory dump of alive process, although in most cases such dump would be useless.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Windows =&lt;br /&gt;
&lt;br /&gt;
== Enable Memory Dumps ==&lt;br /&gt;
When application crashes, it usually shows a dialog like this:&lt;br /&gt;
&lt;br /&gt;
[[File:Dr has stopped working.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
If you don&#039;t get that window showing up for you, please check the WER flag in registry editor:&lt;br /&gt;
* Run the Registry Editor&lt;br /&gt;
* Find path: &amp;lt;tt&amp;gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Create &amp;lt;tt&amp;gt;DWORD&amp;lt;/tt&amp;gt; (32bit) key with name &amp;lt;tt&amp;gt;DontShowUI&amp;lt;/tt&amp;gt; and value &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See alternative method here: https://superuser.com/a/1349113&lt;br /&gt;
&lt;br /&gt;
== Record Memory Dumps ==&lt;br /&gt;
&lt;br /&gt;
# When the dialog appears, keep that window open, &#039;&#039;&#039;don&#039;t close that dialog&#039;&#039;&#039;, instead open your Task Manager.&amp;lt;br&amp;gt; To open the Task Manager, press Ctrl + Shift + Escape.&amp;lt;br&amp;gt; Another way is to hit Windows + R and type &amp;quot;taskmgr&amp;quot; and click OK.&lt;br /&gt;
# In the Task Manager, switch to the Processes tab and locate the program which crashed (DarkRadiant.exe, TheDarkModx64.exe or tdm_installer.exe). &amp;lt;br&amp;gt; It should be in that list since you still have the &amp;quot;XXX has stopped working&amp;quot; dialog open in the background.&lt;br /&gt;
# Now right-click the line with the name of the crashed program and select &amp;quot;Create dump file&amp;quot;:&lt;br /&gt;
# It will work a bit and then show you something like this: &amp;quot;The file has been sucessfully created. The file is located at: location&amp;quot;&lt;br /&gt;
# Open Windows Explorer and head to the location indicated in the dialog. &amp;lt;br&amp;gt;&amp;lt;b&amp;gt;Note&amp;lt;/b&amp;gt; that you can mark and copy the location from that dialog using your mouse, so you don&#039;t have to type it in entirely.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Dr process in task manager.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Dr process create dump.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Dr dump created.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Compress and upload the dump ==&lt;br /&gt;
&lt;br /&gt;
Depending on what you had opened in DarkRadiant or what FM you loaded in the game itself, the .dmp file might end up very large,&amp;lt;br&amp;gt;&lt;br /&gt;
so it&#039;s best to compress it by right-clicking it and selecting &amp;quot;Send to...&amp;quot; &amp;gt; &amp;quot;Compressed (zip) folder&amp;quot;. &amp;lt;br&amp;gt;(Or use 7-zip to compress the file)&amp;lt;br&amp;gt; &lt;br /&gt;
Upload that folder to some place in the web, and please go to the forums to tell the devs about your crash dump.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Thanks for your time&#039;&#039;&#039;,&amp;lt;br&amp;gt;we know that recording and uploading crash dumps might be tedious, &amp;lt;br&amp;gt; but without we really can&#039;t do much about the crash, so your help is appreciated!&lt;br /&gt;
&lt;br /&gt;
== Debugging / Analysis ==&lt;br /&gt;
Coders might want to check out the article on [[Analyze_a_Memory_Dump|analyzing a memory dump.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Record Memory Dumps automatically (alternative approach) ==&lt;br /&gt;
&lt;br /&gt;
When the &amp;quot;darkradiant has stopped working&amp;quot; popup doesnt appear, when the program crashes,&amp;lt;br&amp;gt;&lt;br /&gt;
then is possible to enable automatic saving of crash dumps, &amp;lt;br&amp;gt;&lt;br /&gt;
This way is not recommended since it is more complicated to setup.&amp;lt;br&amp;gt;&lt;br /&gt;
It is also described in [https://docs.microsoft.com/en-us/windows/win32/wer/collecting-user-mode-dumps Windows User-Mode Dumps].&lt;br /&gt;
&lt;br /&gt;
# Press Windows-key + R, type in &amp;quot;cmd&amp;quot;, and press Ctrl+Shift+Enter to run it with admin rights.&lt;br /&gt;
# A black window of console will appear. Check the title bar and make sure it is running with administrator rights.&lt;br /&gt;
# Execute the following commands in the console (copy/paste them with Ctrl+C / Ctrl+V):&lt;br /&gt;
# &amp;lt;tt&amp;gt;reg add &amp;quot;HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\TheDarkModx64.exe&amp;quot; /t REG_SZ /v &amp;quot;DumpFolder&amp;quot; /d &amp;quot;c:\temp\CrashDumps&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
# &amp;lt;tt&amp;gt;reg add &amp;quot;HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\TheDarkModx64.exe&amp;quot; /t REG_DWORD /v &amp;quot;DumpCount&amp;quot; /d &amp;quot;0x1&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
# &amp;lt;tt&amp;gt;reg add &amp;quot;HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\TheDarkModx64.exe&amp;quot; /t REG_DWORD /v &amp;quot;DumpType&amp;quot; /d &amp;quot;0x2&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
# &amp;lt;tt&amp;gt;reg add &amp;quot;HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\TheDarkModx64.exe&amp;quot; /t REG_DWORD /v &amp;quot;CustomDumpFlags&amp;quot; /d &amp;quot;0&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
# &amp;lt;tt&amp;gt;net start WerSvc&amp;lt;/tt&amp;gt; &amp;lt;br&amp;gt;(if there is a windows service named &amp;quot;Windows Error Reporting Service&amp;quot;)&lt;br /&gt;
# Close the console, you don&#039;t need it anymore.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Now you can run TDM as usual (run executable TheDarkModx64.exe).&amp;lt;br&amp;gt;&lt;br /&gt;
If it crashes, a dump will be recorded and saved at &amp;lt;tt&amp;gt;C:\temp\CrashDumps&amp;lt;/tt&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
After this you need to disable automatic saving of memory dumps for TheDarkModx64.exe:&lt;br /&gt;
# Press Windows-key + R, type in &amp;quot;cmd&amp;quot;, and press Ctrl+Shift+Enter to run it with admin rights.&lt;br /&gt;
# A black window of console will appear. Check the title bar and make sure it is running with administrator rights.&lt;br /&gt;
# Execute the following commands in the console (copy/paste them with Ctrl+C / Ctrl+V):&lt;br /&gt;
# &amp;lt;tt&amp;gt;reg delete &amp;quot;HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\TheDarkModx64.exe&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Alternatively, you can add/remove registry keys directly in Registry Editor if you like.&lt;br /&gt;
In this case, restart Windows instead of starting WerSvc service.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Linux =&lt;br /&gt;
&lt;br /&gt;
== Record with GDB ==&lt;br /&gt;
&lt;br /&gt;
Make sure GDB is installed. Usually it is installed by default.&lt;br /&gt;
&lt;br /&gt;
[[File:Coredump-_start_gdb.png|thumb]]&lt;br /&gt;
[[File:Coredump-_save_core_dump.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
# Run the game under GDB: &amp;lt;tt&amp;gt;gdb ./thedarkmod.x64&amp;lt;/tt&amp;gt;&lt;br /&gt;
# Within GDB, type &amp;lt;tt&amp;gt;run&amp;lt;/tt&amp;gt; and hit Enter to start the program.&lt;br /&gt;
# When the game crashes, gdb will most likely break.&lt;br /&gt;
# Record core dump with a command: &amp;lt;tt&amp;gt;generate-core-file&amp;lt;/tt&amp;gt;&lt;br /&gt;
# The dump should be in the current directory, usually named like &amp;lt;tt&amp;gt;core.27372&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Note that core dumps are pretty large, but they compress well.&lt;br /&gt;
Make sure to put it into zip/gz/whatever before uploading.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, sometimes core dump alone is not enough to inspect the crash on the other machine.&lt;br /&gt;
A developer might need some system binaries in order to properly decipher stack trace.&lt;br /&gt;
The following libraries are known to be necessary sometimes:&lt;br /&gt;
* &amp;lt;tt&amp;gt;libc&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;libpthread&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;libthread_db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These files are usually named something like &amp;lt;tt&amp;gt;libpthread-2.26.so&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;libc-2.26.so&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;libthread_db.so.1&amp;lt;/tt&amp;gt; and are located in &amp;lt;tt&amp;gt;/lib/x86_64-linux-gnu&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Beware of symlinks! The developer needs the target file with real contents.&lt;br /&gt;
&lt;br /&gt;
See also: [https://forums.thedarkmod.com/index.php?/topic/21060-mission-downloader-issue &amp;quot;Mission downloader issue&amp;quot; on the forum]&lt;br /&gt;
&lt;br /&gt;
[[Category:DarkRadiant]]&lt;br /&gt;
[[Category:Coding]]&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=Save_a_Memory_Dump_for_debugging_Crashes&amp;diff=33936</id>
		<title>Save a Memory Dump for debugging Crashes</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=Save_a_Memory_Dump_for_debugging_Crashes&amp;diff=33936"/>
		<updated>2025-04-11T19:32:42Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: More info about Linux core dumps.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;DarkRadiant or TheDarkMod crashed? If you don&#039;t want that to happen again, you need to help the team to debug this malfunction &amp;lt;br&amp;gt;&lt;br /&gt;
You can do this by dumping process memory to a file, which can then be used by developers to debug and inspect the application&#039;s state at the point in time it crashed.&lt;br /&gt;
&lt;br /&gt;
If a crash is reproducible, it might be enough to describe the exact steps that lead up to the fault and file a bug report on the [http://bugs.thedarkmod.com bugtracker]. &amp;lt;br&amp;gt; &lt;br /&gt;
But more often than sometimes crashes occur out of seemingly nothing and are barely reproducible, and in this case a saved memory dump is even more valuable for debugging purposes.&lt;br /&gt;
&lt;br /&gt;
In principle, recording memory dumps is not limited to crashed applications.&amp;lt;br&amp;gt;&lt;br /&gt;
It is possible to record memory dump of alive process, although in most cases such dump would be useless.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Windows =&lt;br /&gt;
&lt;br /&gt;
== Enable Memory Dumps ==&lt;br /&gt;
When application crashes, it usually shows a dialog like this:&lt;br /&gt;
&lt;br /&gt;
[[File:Dr has stopped working.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
If you don&#039;t get that window showing up for you, please check the WER flag in registry editor:&lt;br /&gt;
* Run the Registry Editor&lt;br /&gt;
* Find path: &amp;lt;tt&amp;gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Create &amp;lt;tt&amp;gt;DWORD&amp;lt;/tt&amp;gt; (32bit) key with name &amp;lt;tt&amp;gt;DontShowUI&amp;lt;/tt&amp;gt; and value &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See alternative method here: https://superuser.com/a/1349113&lt;br /&gt;
&lt;br /&gt;
== Record Memory Dumps ==&lt;br /&gt;
&lt;br /&gt;
# When the dialog appears, keep that window open, &#039;&#039;&#039;don&#039;t close that dialog&#039;&#039;&#039;, instead open your Task Manager.&amp;lt;br&amp;gt; To open the Task Manager, press Ctrl + Shift + Escape.&amp;lt;br&amp;gt; Another way is to hit Windows + R and type &amp;quot;taskmgr&amp;quot; and click OK.&lt;br /&gt;
# In the Task Manager, switch to the Processes tab and locate the program which crashed (DarkRadiant.exe, TheDarkModx64.exe or tdm_installer.exe). &amp;lt;br&amp;gt; It should be in that list since you still have the &amp;quot;XXX has stopped working&amp;quot; dialog open in the background.&lt;br /&gt;
# Now right-click the line with the name of the crashed program and select &amp;quot;Create dump file&amp;quot;:&lt;br /&gt;
# It will work a bit and then show you something like this: &amp;quot;The file has been sucessfully created. The file is located at: location&amp;quot;&lt;br /&gt;
# Open Windows Explorer and head to the location indicated in the dialog. &amp;lt;br&amp;gt;&amp;lt;b&amp;gt;Note&amp;lt;/b&amp;gt; that you can mark and copy the location from that dialog using your mouse, so you don&#039;t have to type it in entirely.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Dr process in task manager.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Dr process create dump.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Dr dump created.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Compress and upload the dump ==&lt;br /&gt;
&lt;br /&gt;
Depending on what you had opened in DarkRadiant or what FM you loaded in the game itself, the .dmp file might end up very large,&amp;lt;br&amp;gt;&lt;br /&gt;
so it&#039;s best to compress it by right-clicking it and selecting &amp;quot;Send to...&amp;quot; &amp;gt; &amp;quot;Compressed (zip) folder&amp;quot;. &amp;lt;br&amp;gt;(Or use 7-zip to compress the file)&amp;lt;br&amp;gt; &lt;br /&gt;
Upload that folder to some place in the web, and please go to the forums to tell the devs about your crash dump.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Thanks for your time&#039;&#039;&#039;,&amp;lt;br&amp;gt;we know that recording and uploading crash dumps might be tedious, &amp;lt;br&amp;gt; but without we really can&#039;t do much about the crash, so your help is appreciated!&lt;br /&gt;
&lt;br /&gt;
== Debugging / Analysis ==&lt;br /&gt;
Coders might want to check out the article on [[Analyze_a_Memory_Dump|analyzing a memory dump.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Record Memory Dumps automatically (alternative approach) ==&lt;br /&gt;
&lt;br /&gt;
When the &amp;quot;darkradiant has stopped working&amp;quot; popup doesnt appear, when the program crashes,&amp;lt;br&amp;gt;&lt;br /&gt;
then is possible to enable automatic saving of crash dumps, &amp;lt;br&amp;gt;&lt;br /&gt;
This way is not recommended since it is more complicated to setup.&amp;lt;br&amp;gt;&lt;br /&gt;
It is also described in [https://docs.microsoft.com/en-us/windows/win32/wer/collecting-user-mode-dumps Windows User-Mode Dumps].&lt;br /&gt;
&lt;br /&gt;
# Press Windows-key + R, type in &amp;quot;cmd&amp;quot;, and press Ctrl+Shift+Enter to run it with admin rights.&lt;br /&gt;
# A black window of console will appear. Check the title bar and make sure it is running with administrator rights.&lt;br /&gt;
# Execute the following commands in the console (copy/paste them with Ctrl+C / Ctrl+V):&lt;br /&gt;
# &amp;lt;tt&amp;gt;reg add &amp;quot;HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\TheDarkModx64.exe&amp;quot; /t REG_SZ /v &amp;quot;DumpFolder&amp;quot; /d &amp;quot;c:\temp\CrashDumps&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
# &amp;lt;tt&amp;gt;reg add &amp;quot;HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\TheDarkModx64.exe&amp;quot; /t REG_DWORD /v &amp;quot;DumpCount&amp;quot; /d &amp;quot;0x1&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
# &amp;lt;tt&amp;gt;reg add &amp;quot;HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\TheDarkModx64.exe&amp;quot; /t REG_DWORD /v &amp;quot;DumpType&amp;quot; /d &amp;quot;0x2&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
# &amp;lt;tt&amp;gt;reg add &amp;quot;HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\TheDarkModx64.exe&amp;quot; /t REG_DWORD /v &amp;quot;CustomDumpFlags&amp;quot; /d &amp;quot;0&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
# &amp;lt;tt&amp;gt;net start WerSvc&amp;lt;/tt&amp;gt; &amp;lt;br&amp;gt;(if there is a windows service named &amp;quot;Windows Error Reporting Service&amp;quot;)&lt;br /&gt;
# Close the console, you don&#039;t need it anymore.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Now you can run TDM as usual (run executable TheDarkModx64.exe).&amp;lt;br&amp;gt;&lt;br /&gt;
If it crashes, a dump will be recorded and saved at &amp;lt;tt&amp;gt;C:\temp\CrashDumps&amp;lt;/tt&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
After this you need to disable automatic saving of memory dumps for TheDarkModx64.exe:&lt;br /&gt;
# Press Windows-key + R, type in &amp;quot;cmd&amp;quot;, and press Ctrl+Shift+Enter to run it with admin rights.&lt;br /&gt;
# A black window of console will appear. Check the title bar and make sure it is running with administrator rights.&lt;br /&gt;
# Execute the following commands in the console (copy/paste them with Ctrl+C / Ctrl+V):&lt;br /&gt;
# &amp;lt;tt&amp;gt;reg delete &amp;quot;HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\TheDarkModx64.exe&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Alternatively, you can add/remove registry keys directly in Registry Editor if you like.&lt;br /&gt;
In this case, restart Windows instead of starting WerSvc service.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Linux =&lt;br /&gt;
&lt;br /&gt;
== Record with GDB ==&lt;br /&gt;
&lt;br /&gt;
Make sure GDB is installed. Usually it is installed by default.&lt;br /&gt;
&lt;br /&gt;
[[File:Coredump-_start_gdb.png|thumb]]&lt;br /&gt;
[[File:Coredump-_save_core_dump.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
# Run the game under GDB: &amp;lt;tt&amp;gt;gdb ./thedarkmod.x64&amp;lt;/tt&amp;gt;&lt;br /&gt;
# Within GDB, type &amp;lt;tt&amp;gt;run&amp;lt;/tt&amp;gt; and hit Enter to start the program.&lt;br /&gt;
# When the game crashes, gdb will most likely break.&lt;br /&gt;
# Record core dump with a command: &amp;lt;tt&amp;gt;generate-core-file&amp;lt;/tt&amp;gt;&lt;br /&gt;
# The dump should be in the current directory, usually named like &amp;lt;tt&amp;gt;core.27372&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Note that core dumps are pretty large, but they compress well.&lt;br /&gt;
Make sure to put it into zip/gz/whatever before uploading.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, sometimes core dump alone is not enough to inspect the crash on the other machine.&lt;br /&gt;
Sometimes the system binaries are also necessary to properly decipher stack trace.&lt;br /&gt;
The following libraries are necessary sometimes:&lt;br /&gt;
* &amp;lt;tt&amp;gt;libc&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;libpthread&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;libthread_db&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These files can be named something like &amp;lt;tt&amp;gt;libthread_db.so.1&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;libc.so.6&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;libc-2.26.so&amp;lt;/tt&amp;gt; and be located in &amp;lt;tt&amp;gt;/lib/x86_64-linux-gnu&amp;lt;/tt&amp;gt;&lt;br /&gt;
Before of symlinks! The developer needs the target file with real contents.&lt;br /&gt;
&lt;br /&gt;
See also: [https://forums.thedarkmod.com/index.php?/topic/21060-mission-downloader-issue &amp;quot;Mission downloader issue&amp;quot; on the forum].&lt;br /&gt;
&lt;br /&gt;
[[Category:DarkRadiant]]&lt;br /&gt;
[[Category:Coding]]&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=File:Coredump-_save_core_dump.png&amp;diff=33935</id>
		<title>File:Coredump- save core dump.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=File:Coredump-_save_core_dump.png&amp;diff=33935"/>
		<updated>2025-04-11T19:19:34Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;TDM switches to gdb on crash, and we can record core dump.&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=File:Coredump-_start_gdb.png&amp;diff=33934</id>
		<title>File:Coredump- start gdb.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=File:Coredump-_start_gdb.png&amp;diff=33934"/>
		<updated>2025-04-11T19:18:30Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Example of starting TDM under gdb.&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=Save_a_Memory_Dump_for_debugging_Crashes&amp;diff=33932</id>
		<title>Save a Memory Dump for debugging Crashes</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=Save_a_Memory_Dump_for_debugging_Crashes&amp;diff=33932"/>
		<updated>2025-04-11T08:18:59Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;DarkRadiant or TheDarkMod crashed? If you don&#039;t want that to happen again, you need to help the team to debug this malfunction &amp;lt;br&amp;gt;&lt;br /&gt;
You can do this by dumping process memory to a file, which can then be used by developers to debug and inspect the application&#039;s state at the point in time it crashed.&lt;br /&gt;
&lt;br /&gt;
If a crash is reproducible, it might be enough to describe the exact steps that lead up to the fault and file a bug report on the [http://bugs.thedarkmod.com bugtracker]. &amp;lt;br&amp;gt; &lt;br /&gt;
But more often than sometimes crashes occur out of seemingly nothing and are barely reproducible, and in this case a saved memory dump is even more valuable for debugging purposes.&lt;br /&gt;
&lt;br /&gt;
In principle, recording memory dumps is not limited to crashed applications.&amp;lt;br&amp;gt;&lt;br /&gt;
It is possible to record memory dump of alive process, although in most cases such dump would be useless.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Windows =&lt;br /&gt;
&lt;br /&gt;
== Enable Memory Dumps ==&lt;br /&gt;
When application crashes, it usually shows a dialog like this:&lt;br /&gt;
&lt;br /&gt;
[[File:Dr has stopped working.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
If you don&#039;t get that window showing up for you, please check the WER flag in registry editor:&lt;br /&gt;
* Run the Registry Editor&lt;br /&gt;
* Find path: &amp;lt;tt&amp;gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Create &amp;lt;tt&amp;gt;DWORD&amp;lt;/tt&amp;gt; (32bit) key with name &amp;lt;tt&amp;gt;DontShowUI&amp;lt;/tt&amp;gt; and value &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See alternative method here: https://superuser.com/a/1349113&lt;br /&gt;
&lt;br /&gt;
== Record Memory Dumps ==&lt;br /&gt;
&lt;br /&gt;
# When the dialog appears, keep that window open, &#039;&#039;&#039;don&#039;t close that dialog&#039;&#039;&#039;, instead open your Task Manager.&amp;lt;br&amp;gt; To open the Task Manager, press Ctrl + Shift + Escape.&amp;lt;br&amp;gt; Another way is to hit Windows + R and type &amp;quot;taskmgr&amp;quot; and click OK.&lt;br /&gt;
# In the Task Manager, switch to the Processes tab and locate the program which crashed (DarkRadiant.exe, TheDarkModx64.exe or tdm_installer.exe). &amp;lt;br&amp;gt; It should be in that list since you still have the &amp;quot;XXX has stopped working&amp;quot; dialog open in the background.&lt;br /&gt;
# Now right-click the line with the name of the crashed program and select &amp;quot;Create dump file&amp;quot;:&lt;br /&gt;
# It will work a bit and then show you something like this: &amp;quot;The file has been sucessfully created. The file is located at: location&amp;quot;&lt;br /&gt;
# Open Windows Explorer and head to the location indicated in the dialog. &amp;lt;br&amp;gt;&amp;lt;b&amp;gt;Note&amp;lt;/b&amp;gt; that you can mark and copy the location from that dialog using your mouse, so you don&#039;t have to type it in entirely.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Dr process in task manager.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Dr process create dump.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Dr dump created.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Compress and upload the dump ==&lt;br /&gt;
&lt;br /&gt;
Depending on what you had opened in DarkRadiant or what FM you loaded in the game itself, the .dmp file might end up very large,&amp;lt;br&amp;gt;&lt;br /&gt;
so it&#039;s best to compress it by right-clicking it and selecting &amp;quot;Send to...&amp;quot; &amp;gt; &amp;quot;Compressed (zip) folder&amp;quot;. &amp;lt;br&amp;gt;(Or use 7-zip to compress the file)&amp;lt;br&amp;gt; &lt;br /&gt;
Upload that folder to some place in the web, and please go to the forums to tell the devs about your crash dump.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Thanks for your time&#039;&#039;&#039;,&amp;lt;br&amp;gt;we know that recording and uploading crash dumps might be tedious, &amp;lt;br&amp;gt; but without we really can&#039;t do much about the crash, so your help is appreciated!&lt;br /&gt;
&lt;br /&gt;
== Debugging / Analysis ==&lt;br /&gt;
Coders might want to check out the article on [[Analyze_a_Memory_Dump|analyzing a memory dump.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Record Memory Dumps automatically (alternative approach) ==&lt;br /&gt;
&lt;br /&gt;
When the &amp;quot;darkradiant has stopped working&amp;quot; popup doesnt appear, when the program crashes,&amp;lt;br&amp;gt;&lt;br /&gt;
then is possible to enable automatic saving of crash dumps, &amp;lt;br&amp;gt;&lt;br /&gt;
This way is not recommended since it is more complicated to setup.&amp;lt;br&amp;gt;&lt;br /&gt;
It is also described in [https://docs.microsoft.com/en-us/windows/win32/wer/collecting-user-mode-dumps Windows User-Mode Dumps].&lt;br /&gt;
&lt;br /&gt;
# Press Windows-key + R, type in &amp;quot;cmd&amp;quot;, and press Ctrl+Shift+Enter to run it with admin rights.&lt;br /&gt;
# A black window of console will appear. Check the title bar and make sure it is running with administrator rights.&lt;br /&gt;
# Execute the following commands in the console (copy/paste them with Ctrl+C / Ctrl+V):&lt;br /&gt;
# &amp;lt;tt&amp;gt;reg add &amp;quot;HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\TheDarkModx64.exe&amp;quot; /t REG_SZ /v &amp;quot;DumpFolder&amp;quot; /d &amp;quot;c:\temp\CrashDumps&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
# &amp;lt;tt&amp;gt;reg add &amp;quot;HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\TheDarkModx64.exe&amp;quot; /t REG_DWORD /v &amp;quot;DumpCount&amp;quot; /d &amp;quot;0x1&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
# &amp;lt;tt&amp;gt;reg add &amp;quot;HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\TheDarkModx64.exe&amp;quot; /t REG_DWORD /v &amp;quot;DumpType&amp;quot; /d &amp;quot;0x2&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
# &amp;lt;tt&amp;gt;reg add &amp;quot;HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\TheDarkModx64.exe&amp;quot; /t REG_DWORD /v &amp;quot;CustomDumpFlags&amp;quot; /d &amp;quot;0&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
# &amp;lt;tt&amp;gt;net start WerSvc&amp;lt;/tt&amp;gt; &amp;lt;br&amp;gt;(if there is a windows service named &amp;quot;Windows Error Reporting Service&amp;quot;)&lt;br /&gt;
# Close the console, you don&#039;t need it anymore.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Now you can run TDM as usual (run executable TheDarkModx64.exe).&amp;lt;br&amp;gt;&lt;br /&gt;
If it crashes, a dump will be recorded and saved at &amp;lt;tt&amp;gt;C:\temp\CrashDumps&amp;lt;/tt&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
After this you need to disable automatic saving of memory dumps for TheDarkModx64.exe:&lt;br /&gt;
# Press Windows-key + R, type in &amp;quot;cmd&amp;quot;, and press Ctrl+Shift+Enter to run it with admin rights.&lt;br /&gt;
# A black window of console will appear. Check the title bar and make sure it is running with administrator rights.&lt;br /&gt;
# Execute the following commands in the console (copy/paste them with Ctrl+C / Ctrl+V):&lt;br /&gt;
# &amp;lt;tt&amp;gt;reg delete &amp;quot;HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\TheDarkModx64.exe&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Alternatively, you can add/remove registry keys directly in Registry Editor if you like.&lt;br /&gt;
In this case, restart Windows instead of starting WerSvc service.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Linux =&lt;br /&gt;
&lt;br /&gt;
== Record with GDB ==&lt;br /&gt;
&lt;br /&gt;
Make sure GDB is installed. Usually it is installed by default.&lt;br /&gt;
&lt;br /&gt;
# Run the game under GDB: &amp;lt;tt&amp;gt;gdb ./thedarkmod.x64&amp;lt;/tt&amp;gt;&lt;br /&gt;
# Within GDB, type &amp;lt;tt&amp;gt;run&amp;lt;/tt&amp;gt; and hit Enter to start the program.&lt;br /&gt;
# When the game crashes, gdb will most likely break.&lt;br /&gt;
# Record core dump with a command: &amp;lt;tt&amp;gt;generate-core-file&amp;lt;/tt&amp;gt;&lt;br /&gt;
# TODO: where is the dump?&lt;br /&gt;
&lt;br /&gt;
TODO: issues with system libraries&lt;br /&gt;
&lt;br /&gt;
TODO: references&lt;br /&gt;
&lt;br /&gt;
[[Category:DarkRadiant]]&lt;br /&gt;
[[Category:Coding]]&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=What%27s_new_in_TDM_2.13&amp;diff=33912</id>
		<title>What&#039;s new in TDM 2.13</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=What%27s_new_in_TDM_2.13&amp;diff=33912"/>
		<updated>2025-03-24T09:47:08Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: Tonemapping changes were reverted at the start of beta phase.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- keywords whats new --&amp;gt;&lt;br /&gt;
{{released|2.13|2025-03-23}}&lt;br /&gt;
See the  [https://bugs.thedarkmod.com/changelog_page.php?version_id=111 changelog] on our bugtracker.&lt;br /&gt;
Source Revision 10946&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;font size=&amp;quot;5&amp;quot;&amp;gt;The Dark Mod 2.13 Enhanced AI and GUI Edition!&amp;lt;/font&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;3&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
A major focus for The Dark Mod 2.13 development cycle was improving how AI see bodies, loot, and other non-player objects.&lt;br /&gt;
&amp;lt;br&amp;gt;While our lightgem system is possibly one of the most effective ways to calculate player visibility, it would not be practical&lt;br /&gt;
&amp;lt;br&amp;gt;to give all in-game objects, ragdolls, etc their own lightgem calculations. As such, we have historically used a simplified and less&lt;br /&gt;
&amp;lt;br&amp;gt;accurate design to determine visibility of non-player items. With 2.13 we reach near parity to the accuracy of the lightgem due to&lt;br /&gt;
&amp;lt;br&amp;gt;an improved stochastic sampling system for all objects that an AI can possibly see. ( Thanks stgatilov )&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Now that the AI are more perceptive, why not dull them down again? That is exactly what Amadeus decided and he worked tirelessly on figuring&lt;br /&gt;
&amp;lt;br&amp;gt;how to make the &amp;quot;drunken&amp;quot; AI work more reliably and easier to implement for mission authors. Now we have both more and less perceptive AI!&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;The long requested Parallax Map feature is now available in TDM! While it was possible to offer this before Doom 3 source was released,&lt;br /&gt;
&amp;lt;br&amp;gt;it is quite an expensive effect. With POM integrated into TDM it is now optimized enough for production use. WellingtonCrab has already&lt;br /&gt;
&amp;lt;br&amp;gt;created a large set of POM textures ready for inclusion in TDM 2.13 missions!&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Finally, the TDM community restarted it&#039;s perennial debate about how mission names should be displayed and sorted in the mission list. &lt;br /&gt;
&amp;lt;br&amp;gt;Previously, there was a compromise where the missions would display naturally but would be sorted ignoring &amp;quot;the&amp;quot; and &amp;quot;a&amp;quot; in the title.&lt;br /&gt;
&amp;lt;br&amp;gt;This was the status quo for quite some time but players have emerged to request that we revert to &amp;quot;Mission Name, The&amp;quot; in the GUI.&lt;br /&gt;
&amp;lt;br&amp;gt;Daft Mugi solved this by creating a toggle that allows either sorting style. He also made the whole debate pretty much moot by implementing&lt;br /&gt;
&amp;lt;br&amp;gt;a search window so you can easily find the desired mission by typing all or part of it&#039;s name! Mission management is has never been smoother! &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;See our [https://forums.thedarkmod.com/index.php?/topic/22641-213-feature-discussion-threads/ Feature Discuss Threads] for more details about substantial changes.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;br&amp;gt;&amp;lt;br&amp;gt; &amp;lt;font size=&amp;quot;4&amp;quot;&amp;gt;&#039;&#039;&#039;Important CVARS&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font size=&amp;quot;4&amp;quot;&amp;gt;PLAYER&amp;lt;/font&amp;gt; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
g_lightQuotientAlgo 0 ( revert to the old AI vision system )&lt;br /&gt;
&lt;br /&gt;
g_showLightQuotient and g_les* --- can be used for debugging of the new system.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font size=&amp;quot;4&amp;quot;&amp;gt;TROUBLESHOOTING&amp;lt;/font&amp;gt; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jobs_numThreadsRealtime 2 ( force 2 threads )&lt;br /&gt;
&lt;br /&gt;
r_subviewMaxDepth 1 ( no subview recursion )&lt;br /&gt;
&lt;br /&gt;
r_skipParallax 1 ( disable POM effect )&lt;br /&gt;
&lt;br /&gt;
r_envmapBumpyBehavior 0 ( revert to old environment map behavior )&lt;br /&gt;
&lt;br /&gt;
s_overrideParmsMode --- selects the behavior of zero value in sound emitter parameters (0 for the old behavior, 1 for the new one). &lt;br /&gt;
&lt;br /&gt;
r_materialNewParse --- how are material stages grouped into interaction groups (0 for the old behavior, 1 for the new one). &lt;br /&gt;
&lt;br /&gt;
s_levelLoadParallel 0 --- disables parallel loading of sound samples.&lt;br /&gt;
&lt;br /&gt;
image_downSizeAll 0 --- Applies to all texture types ( diffuse, bump, specular ). 0 = Full texture quality, anything above 0 counts as the texture dimensions ( eg. 256 = 256-by-256 )&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Graphics&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
* Parallax Occlusion Mapping support ( See [https://forums.thedarkmod.com/index.php?/topic/22574-experimental-support-of-parallax-mapping-in-213/ thread] )&lt;br /&gt;
* Environment mapped textures with bumpmaps now properly respond to stage keywords ( See [https://forums.thedarkmod.com/index.php?/topic/22402-213-environment-mapping-bumpmap/ thread] )&lt;br /&gt;
* Nested subviews (mirrors, remotes, sky, etc.) now work properly (6434).&lt;br /&gt;
* Fixed rendering of volumetric light and particles in X-ray views and mirrors (6538).&lt;br /&gt;
* Shadow Map specific features are enabled by default in &amp;quot;Maps&amp;quot; mode ( alpha tested shadows, etc)&lt;br /&gt;
* Minor change in shadow map acne / blur radius computation (6571).&lt;br /&gt;
* Refactored the &amp;quot;HeatHaze&amp;quot; shaders so that one shader can produce multiple variations via parameters&lt;br /&gt;
* Disabled texture compression for light images: falloff and IBL cubemaps.&lt;br /&gt;
* Fixed light culling bug on elongated models with non-identity rotation (6557).&lt;br /&gt;
{{clear}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;AI&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
* AI now have a more accurate vision system ( see [https://forums.thedarkmod.com/index.php?/topic/22639-213-ai-vision-uses-different-light-estimate-system/ thread] )&lt;br /&gt;
* Major improvements in drunk AIs: setting &amp;quot;drunk&amp;quot; spawnarg is enough now; new sounds, animation improvements, greetings, etc. (6507). &lt;br /&gt;
* Fixed drunk women AI (5047).&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Mapping&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
* Added improved editor images for textures/darkmod/metal/detailed materials (6575)&lt;br /&gt;
* Added editor spawnarg for &amp;quot;parallelsky&amp;quot; (6496)&lt;br /&gt;
* Added &amp;quot;particle collision-ready&amp;quot; weather materials (6545)&lt;br /&gt;
* Added min/max builtin functions to game scripts.&lt;br /&gt;
* Added script events about gravity, health, in-air movement.&lt;br /&gt;
* Added script events setUserBy, setFrobActionScript. &lt;br /&gt;
* Added  &amp;quot;distance_follower_reached&amp;quot;, &amp;quot;distance_follower_catchup_distance&amp;quot; and &amp;quot;distance_follower_stop_running&amp;quot; spawnargs allowing mappers to customize AI follower distances (6552)&lt;br /&gt;
* Added &amp;quot;def_vocal_set_drunk&amp;quot; spawnarg to allow mappers to specify which drunk vocal set an AI should use (6507).&lt;br /&gt;
* Added &amp;quot;idle_bark_interval_max_drunk&amp;quot; &amp;quot;idle_bark_interval_min_drunk&amp;quot; spawnargs allowing mappers to customize drunk bark intervals (6507).&lt;br /&gt;
* Added &amp;quot;snd_greeting_generic_drunk&amp;quot; spawnarg for drunk AI (6507)&lt;br /&gt;
* Added cm_allocator debug cvar (6505).&lt;br /&gt;
* Added r_lockView debug rendering cvar ( [https://forums.thedarkmod.com/index.php?/topic/22388-r_lockview-debug-cvar/ thread] ).&lt;br /&gt;
* Added proper dmap error message if map file contains an entity before worldspawn.&lt;br /&gt;
* Fixed dmap making almost axis-aligned visportals buggy (6480)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Coding&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
* Auto-detect number of parallel threads to use in jobs system (6503)&lt;br /&gt;
* Vsync now properly works on Linux&lt;br /&gt;
* FPS limit code has been improved&lt;br /&gt;
* Level loading is further accelerated with better utilization of multicore CPUs and parallel loading of sound samples.&lt;br /&gt;
* CVAR system has been made fully thread safe&lt;br /&gt;
* Missions can now safely override CVAR values via config or script operations&lt;br /&gt;
* The system for third-party dependencies has been moved to Conan 2 and extended. Now the CI server regularly builds TDM and its dependencies completely from source code.&lt;br /&gt;
* Deleted a lot of old rendering code under useNewRenderPasses + some cleanup (6271).&lt;br /&gt;
* Core missions are now stored uncompressed in assets SVN (6498).&lt;br /&gt;
* Optimization: don&#039;t render interaction groups with black diffuse &amp;amp; specular.&lt;br /&gt;
{{clear}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Assets&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
* Added several parallax materials, as well as their non-parallax equivalents &lt;br /&gt;
* Added 17 modular industrial pipe models from Polyhaven&lt;br /&gt;
* Added combined lampion light entity&lt;br /&gt;
* Added several factory_machines models (6537)&lt;br /&gt;
* Added textures/darkmod/decals/distant_cityscape_01_tiling material (6487)&lt;br /&gt;
* Added missing normalmap to stainglass_saint_03 (6521)&lt;br /&gt;
* Added missing textures for rough_boards_scratched material (4157)&lt;br /&gt;
* Added [[Creating_textures_from_Ornate_Photos|ornate]] wood/panels/mary_panel texture&lt;br /&gt;
* Added [[Creating_textures_from_Ornate_Photos|ornate]] stone/sculpted/girard_relief texture&lt;br /&gt;
* Added colored versions of gen3 environment cubemaps for metallic materials.&lt;br /&gt;
* Added new environment cubemaps: sparkles, studio, blurry.&lt;br /&gt;
* Added skybox materials clouds3 and clouds_4_small + prefabs.&lt;br /&gt;
* Added new smoking animation.&lt;br /&gt;
* Added praying animation. &lt;br /&gt;
* Fixed several issues with largesquare01 window textures (6579)&lt;br /&gt;
* Fixed broken material for stove_open02.lwo (6580)&lt;br /&gt;
* Fixed floating decals for ext_timber01_window01.lwo (5782)&lt;br /&gt;
* Fixed gaps in mesh and UV for generator_big.lwo and warehouse_front_doorframe.lwo (6581)&lt;br /&gt;
* Fixed broken UV for longbanner_ragged.lwo (6573)&lt;br /&gt;
* Fixed issues with newspaper01.lwo (6568)&lt;br /&gt;
* Fixed normal map of ornament_relief_mold_eaglelshield (6585).&lt;br /&gt;
* Fixed handle_curved02_latch prefab, deleted pull_handle (6286).&lt;br /&gt;
* Improved &amp;quot;scepter&amp;quot; material ( [https://forums.thedarkmod.com/index.php?/topic/22586-better-looking-metals-in-darkmod/page/4/#comment-498297 thread] ).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Gameplay and Interaction&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
* Updated Training Mission with Vine Arrow tutorial, graphics enhancements, and EFX Reverb&lt;br /&gt;
* Added entityDef archery_target01 with hit detection, it is now used in Training Mission.&lt;br /&gt;
* Added gas mine playertool&lt;br /&gt;
* Added slowfall potion&lt;br /&gt;
* Added invisibility potion by Kingsal     &lt;br /&gt;
* Fixed frob interaction with candle holder that&#039;s initially extinguished (6577).&lt;br /&gt;
* Improved lightgem calculations while leaning ( [https://forums.thedarkmod.com/index.php?/topic/22587-bug-lean-light-calculation/#comment-498247 post] ).&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;GUIs&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
* Massive improvements in mission select &amp;amp; download menus, added search (6339 6570 6449).&lt;br /&gt;
* Loading progress bar has been re-implemented to reflect all the loading optimizations of the past years.&lt;br /&gt;
* Mission Notes ( readme data ) can now be scrolled&lt;br /&gt;
* Mission Debriefing feature ( See [https://forums.thedarkmod.com/index.php?/topic/21831-support-for-gui-based-debrief/ thread] )&lt;br /&gt;
* Stone font improvements, in spacing, stray mark elimination, and character set coverage&lt;br /&gt;
* Toughest-to-read characters in FM fonts Medusa, Treasure Map, Camberic improved&lt;br /&gt;
* Reduced font size of mission list, which allows to see more missions and longer names&lt;br /&gt;
* Texture Quality option for lowend players&lt;br /&gt;
* Added menu options to disable volumetric lights and parallax mapping.&lt;br /&gt;
* Added TDM version + engine revision in lower-left corner of main menu.&lt;br /&gt;
* Increased size of secret message overlay GUI.&lt;br /&gt;
* Fixed map immobilization not applied if opening map with inv use key.&lt;br /&gt;
* Forbid adding missions to download when download is in progress (6368).&lt;br /&gt;
* Changed install/uninstall mission to select/deselect in main menu.&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Sound&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
* EFX reverb presets can now be set on location entities using the &#039;&#039;&#039;efx_preset&#039;&#039;&#039; spawnarg, rather than requiring an .efx file (6273).&lt;br /&gt;
* Fixed sleeping sounds for drunk AIs (6539), and other sounds for them too (6507).&lt;br /&gt;
* Added improved footstep sounds for broken glass and ice material surfaces (6551).&lt;br /&gt;
* Fixed water_medium_running soundshader (5384)&lt;br /&gt;
* Subtitles volume estimation is much better now, subtitles for too quiet sounds are no longer shown.&lt;br /&gt;
* Visual appearance of the subtitles font has been greatly improved. &lt;br /&gt;
* Added two drunk AI vocalsets voiced by Goldwell and Bikerdude: Drunk Moor and Drunk Jack&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Translation&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
* Nolok added his Catalan translation to the menus&lt;br /&gt;
&lt;br /&gt;
{{whatsnew|sort=213}}&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=File_formats&amp;diff=33708</id>
		<title>File formats</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=File_formats&amp;diff=33708"/>
		<updated>2025-01-06T21:13:40Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: Out of compressed texture formats we support, only DXT3 supports transparency well enough&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A list of file formats usable in TDM:&lt;br /&gt;
&lt;br /&gt;
== Models ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LWO ===&lt;br /&gt;
&lt;br /&gt;
* somewhat default&lt;br /&gt;
* small uncompressed size since it is binary&lt;br /&gt;
* loading code can be slow and (some people have reported) it can sometimes break your model (smoothing groups might be a pain)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ASE ===&lt;br /&gt;
&lt;br /&gt;
* somewhat default&lt;br /&gt;
* larger uncompressed size since it is text&lt;br /&gt;
* loading code can be slow and (some people have reported) it can sometimes break your model (smoothing groups might be a pain)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== OBJ ===&lt;br /&gt;
&lt;br /&gt;
* the only format added specifically for TDM, so not very widespread&lt;br /&gt;
* uncompressed size is large because it is text (compressed size is smaller than ASE and LWO formats)&lt;br /&gt;
* loading is very fast and does not &amp;quot;fix&amp;quot;/break your model, you&#039;ll get exactly the topology &amp;amp; smoothing you exported&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ragdolls ==&lt;br /&gt;
&lt;br /&gt;
The only format is &#039;&#039;&#039;.af&#039;&#039;&#039; text format, which is handmade for Doom 3.&lt;br /&gt;
No changes here since Doom 3.&lt;br /&gt;
&lt;br /&gt;
It is notoriously hard to create/edit.&lt;br /&gt;
The only tool is the Windows-only builtin command editAFs, and this is the only in-game editor which has no outside alternatives. We wanted to port it to either DarkRadiant or at least better GUI framework, but it did not happen (yet).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Animation ==&lt;br /&gt;
&lt;br /&gt;
=== MD5 ===&lt;br /&gt;
* md5mesh --- Doom 3 custom text format which represents a mesh attached to skeleton (joints, weights, etc.)&lt;br /&gt;
* md5anim --- custom text format that represents an animation of a skeleton.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Blender exporter links? --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MD3 ===&lt;br /&gt;
This is Doom 3 custom text format which represents linear vertex morphing.&amp;lt;br&amp;gt;&lt;br /&gt;
It is rarely used, but it is a perfect fit in case animation is clearly not &amp;quot;skeletal&amp;quot; (e.g. animated grass or water).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- converters? --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Others ===&lt;br /&gt;
* Some hardcoded pieces of code which transform a mesh into something else, that are enabled via &amp;quot;deform&amp;quot; keyword in a material. The most known example is particles. All of this is very specific and uses custom formats.&lt;br /&gt;
* Maya ascii format (.ma, mb), currently no further known info on it.&lt;br /&gt;
* OpenFlight model (.flt), currently no further known info on it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Video ==&lt;br /&gt;
&lt;br /&gt;
* The mainstream format is mp4 + h264 + aac for FMV.&lt;br /&gt;
* There is also still legacy support for ROQ which is an old format used in Doom 3.&lt;br /&gt;
I think all the other formats are disabled in the FFmpeg build that we use.&lt;br /&gt;
&lt;br /&gt;
=== In-game videos ===&lt;br /&gt;
One specific case is animated textures (e.g. water), and they are usually implemented as a pack of copy/pasted if-s in a material file, which point to different frame images. Something like &amp;quot;Motion JPEG/TGA/PNG/DDS&amp;quot; 😃 Maybe one day we will make this approach easier to use...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Textures and images ==&lt;br /&gt;
&lt;br /&gt;
(Images inside guis (briefing, readables) use the same material loading system, so they should support all the same image formats.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TGA ===&lt;br /&gt;
The simplest uncompressed format, basically default in case compression is not used.&lt;br /&gt;
* Supports transparency.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PNG ===&lt;br /&gt;
* Lossless compression, but pretty slow to load.&lt;br /&gt;
* Supports transparency.&lt;br /&gt;
* Should therefore be OK for some GUI images for example, but not used on a large scale.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== JPG ===&lt;br /&gt;
Lossy format, pretty small and rather fast to load.&lt;br /&gt;
* &#039;&#039;&#039;Does not&#039;&#039;&#039; supports transparency.&lt;br /&gt;
I think it is usually used for screenshots and maybe GUI images, otherwise not popular.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DDS ===&lt;br /&gt;
This is container which can in principle store both compressed and uncompressed data, but I think we use it only for precompressed textures. TDM supports DXT1, DXT3, DXT5, RGTC compressed formats (each of these formats has a bunch of pseudonymes).&lt;br /&gt;
DXT3 supports transparency.&lt;br /&gt;
&lt;br /&gt;
If you use compressed DDS, then you can be sure it will be displayed as is, as no further processing it applied to it. Sometimes it is good, sometimes it is bad.&lt;br /&gt;
The engine has fast compressor/decompressed for all texture compression formats, so if you supply TGAs and they are compressed on load, you only lose in mission size.&lt;br /&gt;
&lt;br /&gt;
== Sound files ==&lt;br /&gt;
&lt;br /&gt;
=== OGG ===&lt;br /&gt;
* Relatively widespread open format with lossy compression.&lt;br /&gt;
* Default used format&lt;br /&gt;
* OGG files are loaded on level start, but decompressed on the fly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== WAV ===&lt;br /&gt;
* Simple uncompressed sound file.&lt;br /&gt;
* Larger than OGG. Potentially higher quality.&lt;br /&gt;
* The &amp;quot;shakes&amp;quot; feature of materials specifically asks for WAV.&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=Briefing&amp;diff=33707</id>
		<title>Briefing</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=Briefing&amp;diff=33707"/>
		<updated>2025-01-06T20:59:37Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: Controlling Where the Player Starts: renamed gui variable for 2.13&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Scribbled by Sotha&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
A briefing is a short introduction to your mission to brief the player about what he is supposed to do, and why. It gives purpose and meaning to the formal objectives. It is a very important part of every fan mission, because it tells the player what to expect.&lt;br /&gt;
&lt;br /&gt;
Briefings should:&lt;br /&gt;
&lt;br /&gt;
* introduce any important background information (where am I?)&lt;br /&gt;
* introduce any significant characters&lt;br /&gt;
* give the character valid motivations (why am I doing this?)&lt;br /&gt;
* set the tone of the upcoming mission (spooky, tense, comical, etc)&lt;br /&gt;
* give hints about what equipment the player might want to buy, if applicable&lt;br /&gt;
&lt;br /&gt;
Don&#039;t underestimate the importance of setting a tone.  If you want players to take your mission seriously, DON&#039;T make jokes in the briefing!  A poorly edited briefing with spelling errors will set a negative tone...if you&#039;re not a native English speaker, have someone else look over your text.&lt;br /&gt;
&lt;br /&gt;
==Which Briefing to Choose?==&lt;br /&gt;
Three ways the mapper can implement their briefings are covered here:&lt;br /&gt;
*Text-only Briefing&lt;br /&gt;
*Button Controlled Animated Briefing&lt;br /&gt;
*Timed Flowing Briefing&lt;br /&gt;
&lt;br /&gt;
In addition, [[Video Briefing]] is considered separately.&lt;br /&gt;
&lt;br /&gt;
Mappers can choose any briefing they prefer. Text-only Briefing is the most easy to implement technically, but offers no possibility for images. The briefing is operated by arrows which turn briefing pages. The Timed Flowing Briefing is the most difficult one to implement due to demanding trial and error process to get the timings right. The player cannot control this briefing as it flows like a movie based on timings set by the mapper. This briefing can show beautiful briefing pictures which build up atmosphere. The Button Controlled works between the Text-only Briefing and Timed Flowing Briefing, offering eye candy and easy control. The briefing can show text and images, but is controlled by next/previous page buttons like the Text-only Briefing. No timings need to be set with Button Controlled Animated Briefing.&lt;br /&gt;
&lt;br /&gt;
==Text-only Briefing==&lt;br /&gt;
To create a Text-only Briefing for your mission, create a plain text file suffixed .xd (not .txt) and put it in the xdata folder, for example briefing.xd. In the file type your briefing. It must be in the following format in this example:&lt;br /&gt;
&amp;lt;mapname&amp;gt; must be replaced with the exact name of your map.&lt;br /&gt;
&lt;br /&gt;
 maps/&amp;lt;mapname&amp;gt;/mission_briefing&lt;br /&gt;
 {&lt;br /&gt;
  &amp;quot;num_pages&amp;quot;: &amp;quot;1&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  &amp;quot;page1_body&amp;quot; :&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;  TITLE (if wanted.)&amp;quot;&lt;br /&gt;
    &amp;quot;&amp;quot;&lt;br /&gt;
    &amp;quot;I got a tip last night from...&amp;quot;&lt;br /&gt;
    &amp;quot;&amp;quot;&lt;br /&gt;
    &amp;quot;I found a map...&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
  &amp;quot;page2_body&amp;quot; :&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;extra pages do the same way as page 1 above but then change the value in num_pages above&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
If your page text is too long then it will truncate on the display, so test it out and see if you need to go to multiple pages. If you have multiple pages then up/down scroll arrows will automagically appear. &lt;br /&gt;
&lt;br /&gt;
It doesn&#039;t matter which .xd file this xdata entry goes into, as long as the xdata entry&#039;s name matches the format specified above (&amp;quot;maps/&amp;lt;mapname&amp;gt;/mission_briefing&amp;quot;). See [[XData File Creation]] for details on .xd files.&lt;br /&gt;
&lt;br /&gt;
==Button Controlled Animated Briefing==&lt;br /&gt;
To set up the Button Controlled Animated Briefing, please download this package, which contains basic .gui file and placeholder images which the mapper edits to create their own briefing. You can get the package from&lt;br /&gt;
&lt;br /&gt;
*[https://forums.thedarkmod.com/index.php?/topic/12083-briefing-wiki/#comment-494652 The Dark Mod forum]&lt;br /&gt;
&lt;br /&gt;
Extract the files into your FM folder (ie. doom3/your-near-ready-FM-folder/guis). The &amp;quot;guis&amp;quot;-folder should now contain &amp;quot;mainmenu_briefing.gui&amp;quot;-file and a folder &amp;quot;assets&amp;quot; which contains tga-image files.&lt;br /&gt;
&lt;br /&gt;
Now when you install you mission in TDM and run it, you will see a placeholder briefing. In simplest form, you now need to edit the mainmenu_briefing.gui and replace the tga briefing images.&lt;br /&gt;
===Editing mainmenu_briefing.gui for the Button Controlled Briefing===&lt;br /&gt;
Add your own briefing text in the section windowDef BriefingText1, etc. Simply replace the text with your own.&lt;br /&gt;
&lt;br /&gt;
By default, this briefing goes to sixth screenful of text. It is possible the mappers briefing requires only four or five pages, so it would look bad if there was an empty page. To shorten the briefing to, for example to the fifth screen (stage), do the following:&lt;br /&gt;
Find the previous section to the one you want to be the last. If you want the 5th stage to be the last one, go for stage 4 (find &amp;quot;stage 4&amp;quot; with your text editor search function). Find the &amp;quot;windowDef NextButton4&amp;quot; and prevent the system from revealing the stage 5 nextbutton. &lt;br /&gt;
Simply do the following change: set &amp;quot;NextButton5::visible&amp;quot; &amp;quot;1&amp;quot;; -&amp;gt; set &amp;quot;NextButton5::visible&amp;quot; &amp;quot;0&amp;quot;;&lt;br /&gt;
If you want 3rd screenful to be the last one, find stage 2 and edit Nextbutton2 and prevent it from showing NextButton3. &lt;br /&gt;
&lt;br /&gt;
===Editing the Briefing Images===&lt;br /&gt;
Simply replace the /assets/briefingX images with our own images. I recommend that the images are 512x512 resolution, since the briefing shows&lt;br /&gt;
all images in 1x1 ratio. It might be a good idea to pack your .tga files into .dds to save disk space, but it is not mandatory. Going DDS provides significant reduction in file size!&lt;br /&gt;
Simply convert you .tga:s with The Compressonator or GIMP/photoshop plugins. See [[DDS creation]] for instructions.&lt;br /&gt;
&lt;br /&gt;
You can easily create nice briefing images by building the scene you want to show in the briefing using DR and taking in-game screenshots. Edit your screenshots into a nice 512x512 image. And now comes an important part. See the placeholder briefing again. Look at images 1 and 2. See how image 2 fits better in the scene? Image 1 seems blocky. You can make this nice blending using alpha gradient in your image. Basically you want you image to fade into transparency from the middle. Here is how to do it:&lt;br /&gt;
&lt;br /&gt;
1) get GIMP (a image processor)&lt;br /&gt;
2) open your image&lt;br /&gt;
3) layer-&amp;gt;transparency-&amp;gt;add alpha channel&lt;br /&gt;
4) Go to Layer&amp;gt;Mask&amp;gt;Add Layer mask&lt;br /&gt;
5) when prompted to select a type, select &amp;quot;Layer&#039;s Alpha channel&amp;quot;&lt;br /&gt;
6) check to make sure you&#039;re set to edit the layer mask (it should default to this)&lt;br /&gt;
NOTE: What&#039;s going on is the &amp;quot;White&amp;quot; of your mask is the &amp;quot;visible&amp;quot;, the &amp;quot;black&amp;quot; is the &amp;quot;invisible&amp;quot;, and of course the greys are in between.&lt;br /&gt;
7) Set your foreground color to White and your Background color to Black.&lt;br /&gt;
8) Choose the gradient tool.&lt;br /&gt;
9) Set your Gradient to &amp;quot;FG to BG (RGB)&amp;quot;&lt;br /&gt;
10) Your White-to-black gradient is now the visible-to-invisible alpha channel gradient. You&#039;ll have to work with that to get the effect you desire. It helps if you set the gradient tool shape into radial and then play around with transition. Check the toolbox for these parameters.&lt;br /&gt;
&lt;br /&gt;
==Timed Flowing Briefing==&lt;br /&gt;
To set up this kind of briefing, please download this package, which contains basic .gui file and placeholder images which the mapper edits to create their own briefing. You can get the package from&lt;br /&gt;
&lt;br /&gt;
*[https://forums.thedarkmod.com/index.php?/topic/12083-briefing-wiki/#comment-494652 The Dark Mod forum]&lt;br /&gt;
&lt;br /&gt;
Extract the files into your FM folder (ie. doom3/your-near-ready-FM-folder/guis). The &amp;quot;guis&amp;quot;-folder should now contain &amp;quot;mainmenu_briefing.gui&amp;quot;-file and a folder &amp;quot;assets&amp;quot; which contains tga-image files.&lt;br /&gt;
&lt;br /&gt;
Now when you install you mission in TDM and run it, you will see a placeholder briefing. In simplest form, you now need to edit the mainmenu_briefing.gui and replace the tga briefing images.&lt;br /&gt;
===Editing mainmenu_briefing.gui for the Timed Flowing Briefing===&lt;br /&gt;
Replace &amp;quot;windowDef BriefingText1&amp;quot; -&amp;gt; &amp;quot;windowDef BriefingText5&amp;quot; with your own text.&lt;br /&gt;
Find windowDef BriefingAnimation in your .gui file. Under this part there are many entries &amp;quot;onTime X&amp;quot;. Basically you need to alter the X in each segments so that your text and images are shown in the order and timings you prefer. X is the time in milliseconds.&lt;br /&gt;
&lt;br /&gt;
===Editing the Briefing Images===&lt;br /&gt;
Everything said in the Button Controlled Briefing image editing applies here.&lt;br /&gt;
&lt;br /&gt;
==Advanced Briefing Editing==&lt;br /&gt;
It is quite possible you are not happy with the way the images move in both Button Controlled and Timed Flowing Briefings. This section tells you how you change the way images move around the screen.&lt;br /&gt;
&lt;br /&gt;
===Advanced Editing for Button Controlled Briefing===&lt;br /&gt;
Briefing text position and other properties can be changed in sections &amp;quot;windowDef BriefingText1&amp;quot; - &amp;quot;WindowDef BriefingText6.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Changing image movements: In your .gui file find the different stages which control the images and text. It is easy to find them by searching the word &amp;quot;stage&amp;quot;. Close to this entry there should be commented parts which say &amp;quot;put image x in motion.&amp;quot; Near this text there should be something like: &lt;br /&gt;
 //put image2 in motion&lt;br /&gt;
 set &amp;quot;BriefingMovingPicture2::rect&amp;quot; &amp;quot;440 -200 400 400&amp;quot;;&lt;br /&gt;
 transition &amp;quot;BriefingMovingPicture2::matcolor&amp;quot; &amp;quot;1 1 1 0&amp;quot; &amp;quot;1 1 1 .4&amp;quot; &amp;quot;4000&amp;quot;;&lt;br /&gt;
 transition &amp;quot;BriefingMovingPicture2::rect&amp;quot; &amp;quot;440 -200 400 400&amp;quot; &amp;quot;5 160 200 200&amp;quot; &amp;quot;27000&amp;quot;;&lt;br /&gt;
 set &amp;quot;BriefingMovingPicture2::visible&amp;quot; &amp;quot;1&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
The first part sets the briefing picture 2 in coordinates 440, -200 (x,y) (outside the right boundary of the screen, high) and makes it into size 400x400pixels.&lt;br /&gt;
The second part makes the image slowly change transparency towards solid (0.4) during 4000 milliseconds.&lt;br /&gt;
The third part puts the image in the same coordinates as in the first part and then moves it towards coordinates (5, 160) and makes it shrink into 200x200 pixels and this all occurs softly during 27000 milliseconds.&lt;br /&gt;
The fourth part makes the image visible.&lt;br /&gt;
&lt;br /&gt;
Change all these sections to values you like.&lt;br /&gt;
&lt;br /&gt;
Please note that the first image is put in motion in the section &amp;quot;windowDef BriefingStateInit&amp;quot; section when the briefing is intialized.&lt;br /&gt;
&lt;br /&gt;
===Advanced Editing for Timed Flow Briefing===&lt;br /&gt;
Briefing text position and other properties can be changed in sections &amp;quot;windowDef BriefingText1&amp;quot; - &amp;quot;WindowDef BriefingText6.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In the &amp;quot;windowDef BriefingAnimation&amp;quot; change the transition values to your liking. Here&#039;s an example.&lt;br /&gt;
 // Show Picture 1&lt;br /&gt;
 onTime 1000&lt;br /&gt;
 {&lt;br /&gt;
 transition &amp;quot;BriefingMovingPicture1::matcolor&amp;quot; &amp;quot;1 1 1 0&amp;quot; &amp;quot;1 1 1 .4&amp;quot; &amp;quot;4000&amp;quot;;&lt;br /&gt;
 transition &amp;quot;BriefingMovingPicture1::rect&amp;quot; &amp;quot;0 -200 300 300&amp;quot; &amp;quot;430 500 20 20&amp;quot; &amp;quot;27000&amp;quot;;&lt;br /&gt;
 transition &amp;quot;BriefingMovingPicture1::rotate&amp;quot; &amp;quot;5&amp;quot; &amp;quot;-60&amp;quot; &amp;quot;33000&amp;quot;;&lt;br /&gt;
 set &amp;quot;BriefingMovingPicture1::visible&amp;quot; &amp;quot;1&amp;quot;;&lt;br /&gt;
 } &lt;br /&gt;
&lt;br /&gt;
After 1000 milliseconds.&lt;br /&gt;
First part tells the image to sink into visibility from alpha 0-&amp;gt;0.4 during 4000 milliseconds.&lt;br /&gt;
Second part puts the image from coords (0,-200) in size (300x300 pixels) and then moves it to 430,500 and shrinks it into 20x20 pixels during 27000 milliseconds.&lt;br /&gt;
Third parts puts the image rotating a bit.&lt;br /&gt;
&lt;br /&gt;
===General Tips for Advanced Briefing Editing===&lt;br /&gt;
When playing with transition values, it might be helpful to know that the whole screen is 640x480. Note that the coordinates are always the left top corner of the image. To get a feeling for what coordinates are where on screen: open gimp, create new 640x480 image and draw a box there with the rectangle select tool where you would like to see your images. Pay attention to the location mentioned in the toolbox for the rectangle x,y coords and size. Then enter these values in your gui file and the image should appear at the same area on screen.&lt;br /&gt;
&lt;br /&gt;
==Controlling Where the Player Starts==&lt;br /&gt;
&lt;br /&gt;
{{infobox|text= The &amp;quot;Controlling Where the Player Starts&amp;quot; functionality was broken in TDM 2.10 and 2.11 and was fixed in 2.12, but then changed again in 2.13.&lt;br /&gt;
The example gui file was missing, but a new version is made. Documentation currently might be partly outdated. This will be updated at a later stage. }}&lt;br /&gt;
&lt;br /&gt;
Beginning with TDM 1.08, map authors can offer more than one start point to players. This could increase re-playability of a map, allowing the player to replay the map with a different starting point.&lt;br /&gt;
&lt;br /&gt;
This is an extension to the Button-Controlled Menu Briefing, so you should first obtain and install that package (see above) and become familiar with how it works.&lt;br /&gt;
&lt;br /&gt;
===mainmenu_briefing.gui===&lt;br /&gt;
Obtain a new version of mainmenu_briefing.gui from this location:&lt;br /&gt;
*[https://forums.thedarkmod.com/index.php?/topic/13210-controlling-where-the-player-starts-a-mission/&amp;amp;do=findComment&amp;amp;comment=485997 Forum post with attached file]&lt;br /&gt;
&lt;br /&gt;
This version of mainmenu_briefing.gui adds new definitions to the final briefing screen (screen 6), two for each optional start point.&lt;br /&gt;
&lt;br /&gt;
In the sample gui, you&#039;ll see these new definitions:&lt;br /&gt;
&lt;br /&gt;
*windowDef StartPointBox1&lt;br /&gt;
*windowDef StartPointBox2&lt;br /&gt;
*windowDef StartPointBox3&lt;br /&gt;
*windowDef StartPointText1&lt;br /&gt;
*windowDef StartPointText2&lt;br /&gt;
*windowDef StartPointText3&lt;br /&gt;
&lt;br /&gt;
StartPointTextN defines the starting point text for point N and handles highlighting and mouse events.&lt;br /&gt;
&lt;br /&gt;
StartPointBoxN defines a checkbox to the left of the text describing starting point N.&lt;br /&gt;
&lt;br /&gt;
Though the template provides three starting points, you can change it to offer any number you wish. They don&#039;t need to appear on the last briefing screen, either, though you may find that&#039;s the most logical place to offer them.&lt;br /&gt;
&lt;br /&gt;
===What the Player Sees===&lt;br /&gt;
When the player hovers the mouse over either the checkbox or text for a starting point, the text highlights.&lt;br /&gt;
&lt;br /&gt;
When the player clicks on either the checkbox or text, a checkmark appears in the box and the text remains highlighted. Selecting a different starting position will unhighlight the previous selection and highlight the new one.&lt;br /&gt;
&lt;br /&gt;
When the player starts the mission, he&#039;ll start at the selected location.&lt;br /&gt;
&lt;br /&gt;
If the player makes no selection, he&#039;ll start at the info_player_start in the map that has the lowest entity number.&lt;br /&gt;
&lt;br /&gt;
===Making It Your Own===&lt;br /&gt;
Three sample starting point descriptions are provided. Change these to match the briefing and starting points for your map. Look for and change these lines:&lt;br /&gt;
 text &amp;quot;Start next to the sack with grain coming out.&amp;quot;&lt;br /&gt;
 .&lt;br /&gt;
 .&lt;br /&gt;
 .&lt;br /&gt;
 text &amp;quot;Start next to the empty bucket.&amp;quot;&lt;br /&gt;
 .&lt;br /&gt;
 .&lt;br /&gt;
 .&lt;br /&gt;
 text &amp;quot;Start next to the wine barrel.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Each selection is tied to a specific info_player_start in your map. Look for these lines and change them to match the names of your info_player_starts:&lt;br /&gt;
 set &amp;quot;gui::persistent_builtin_playerStartEntity&amp;quot; &amp;quot;startpos1&amp;quot;;&lt;br /&gt;
 .&lt;br /&gt;
 .&lt;br /&gt;
 .&lt;br /&gt;
 set &amp;quot;gui::persistent_builtin_playerStartEntity&amp;quot; &amp;quot;startpos2&amp;quot;;&lt;br /&gt;
 .&lt;br /&gt;
 .&lt;br /&gt;
 .&lt;br /&gt;
 set &amp;quot;gui::persistent_builtin_playerStartEntity&amp;quot; &amp;quot;startpos3&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
That&#039;s all you need to do to offer three starting points.&lt;br /&gt;
&lt;br /&gt;
If you want to offer only two starting points, comment out the third checkbox and text windowDef definitions, as well as any other lines that reference those definitions.&lt;br /&gt;
&lt;br /&gt;
If you want to offer four starting points, copy/paste the StartPointBox3 and StartPointText3 definitions, rename the copies as StartPointBox4 and StartPointText4, adjust (x,y) locations on the screen, and extend the first three box/text definitions so they know about the new definitions.&lt;br /&gt;
&lt;br /&gt;
Make similar changes where needed by searching the file for StartPointBox3 and StartPointText3 to find all the places where box/text definitions are referenced.&lt;br /&gt;
&lt;br /&gt;
If you have questions, you can contact datiswous on the TDM forums by either sending a PM or posting to this thread: [http://forums.thedarkmod.com/topic/13210-controlling-where-the-player-starts-a-mission/ Controlling where the player starts a mission]&lt;br /&gt;
&lt;br /&gt;
==Video Briefing==&lt;br /&gt;
This is explained in [[Video Briefing]].&lt;br /&gt;
&lt;br /&gt;
==Conclusion==&lt;br /&gt;
With these instructions new mappers can really easily create any kind of briefing they prefer by downloading the basic briefing creation package and editing the files to suit their needs. If you have difficulties do not hesitate to ask in our friendly forums, preferably in this thread http://forums.thedarkmod.com/topic/12083-briefing-wiki/&lt;br /&gt;
&lt;br /&gt;
{{GUI}}&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=Setting_up_Campaigns&amp;diff=33680</id>
		<title>Setting up Campaigns</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=Setting_up_Campaigns&amp;diff=33680"/>
		<updated>2025-01-05T18:58:15Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: Game &amp;amp; gui: Added link to bugtracker.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article is an attempt to describe the various options mappers need to consider when setting up campaigns or multi-mission packages (I&#039;ll refer to campaigns for both of these for the sake of simplicity). Campaign support has been added in TDM 1.06. &lt;br /&gt;
&lt;br /&gt;
= Map Files =&lt;br /&gt;
Regular, single-map TDM missions are packed in PK4 files, campaigns are no different. If your campaign consists of three missions (&amp;quot;red.map&amp;quot;, &amp;quot;blue.map&amp;quot; and &amp;quot;green.map&amp;quot;), all three of them still go into the same maps folder in your PK4 file.&lt;br /&gt;
&lt;br /&gt;
The actual order in which the missions are to be played is defined through the &amp;lt;tt&amp;gt;tdm_mapsequence.txt&amp;lt;/tt&amp;gt; file, which should be added to the PK4 (just next to the readme.txt). Following the example of the &amp;quot;red&amp;quot;, &amp;quot;blue&amp;quot; and &amp;quot;green&amp;quot; maps above the map sequence file would look like this:&lt;br /&gt;
&lt;br /&gt;
 Mission 1: red&lt;br /&gt;
 Mission 2: blue&lt;br /&gt;
 Mission 3: green&lt;br /&gt;
&lt;br /&gt;
Looking at that, the syntax of the file is pretty much self-explanatory. The first mission has the number one, the map file is mentioned after the colon and the following space. You don&#039;t need to specify the &amp;quot;.map&amp;quot; extension of the map file that is handled automatically. See the main [[tdm_mapsequence.txt]] article for further reference, for this article it&#039;s enough to have the above lines I suppose.&lt;br /&gt;
&lt;br /&gt;
= Briefings =&lt;br /&gt;
Once the map sequence is defined one needs to take care of the briefing. If you like to keep it simple, just refer to the Briefing article in the [[Briefing#Text-only_Briefing|Text-only Briefing]] section. Each map needs its own xdata block with the briefing and you&#039;ll be done.&lt;br /&gt;
&lt;br /&gt;
For advanced setups like the &amp;quot;Timed Flowing Briefing&amp;quot; mentioned in the [[Briefing]] article there are a few modifications to be made to your GUI code. As the mainmenu_briefing.gui file is the same for the whole campaign your GUI needs to know which map the player is about to play next. For this purpose a new GUI variable &amp;lt;tt&amp;gt;gui::CurrentMission&amp;lt;/tt&amp;gt; has been introduced which can be used in if-else GUI code blocks in the BriefingStateInit windowDef. For single-missions, mappers just called the GUI animation block like this:&lt;br /&gt;
&lt;br /&gt;
 windowDef BriefingStateInit&lt;br /&gt;
 {&lt;br /&gt;
 	noTime 1&lt;br /&gt;
 &lt;br /&gt;
 	// Init methods have onTime 10 instead of onTime 0.&lt;br /&gt;
 	onTime 10&lt;br /&gt;
 	{&lt;br /&gt;
 		// ... stuff&lt;br /&gt;
 &lt;br /&gt;
 		set &amp;quot;BriefingAnimation::visible&amp;quot; &amp;quot;1&amp;quot;;&lt;br /&gt;
 		resetTime &amp;quot;BriefingAnimation&amp;quot; 0;&lt;br /&gt;
 &lt;br /&gt;
 		// ... stuff&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
For multi-mission setups an if-else block should be added to switch to the correct briefing animation for the current map:&lt;br /&gt;
 windowDef BriefingStateInit&lt;br /&gt;
 {&lt;br /&gt;
 	noTime 1&lt;br /&gt;
 &lt;br /&gt;
 	// Init methods have onTime 10 instead of onTime 0.&lt;br /&gt;
 	onTime 10&lt;br /&gt;
 	{&lt;br /&gt;
 		// ... stuff&lt;br /&gt;
 &lt;br /&gt;
 		if (&amp;quot;gui::CurrentMission&amp;quot; == 1)&lt;br /&gt;
 		{&lt;br /&gt;
 			set &amp;quot;BriefingMission1Animation::visible&amp;quot; &amp;quot;1&amp;quot;;&lt;br /&gt;
 			resetTime &amp;quot;BriefingMission1Animation&amp;quot; 0;&lt;br /&gt;
 		}&lt;br /&gt;
 		else if (&amp;quot;gui::CurrentMission&amp;quot; == 2)&lt;br /&gt;
 		{&lt;br /&gt;
 			set &amp;quot;BriefingMission2Animation::visible&amp;quot; &amp;quot;1&amp;quot;;&lt;br /&gt;
 			resetTime &amp;quot;BriefingMission2Animation&amp;quot; 0;&lt;br /&gt;
 		}&lt;br /&gt;
 &lt;br /&gt;
 		// ... stuff&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Of course you&#039;ll need to define a &amp;lt;tt&amp;gt;BriefingMissionXAnimation&amp;lt;/tt&amp;gt; block for each mission. You can use the instructions in the [[Briefing]] article to learn how to do that, just keep in mind to change the windowDef&#039;s name such that you don&#039;t end up with duplicate names for your windowDefs (this will lead to warnings in the console at game startup at best).&lt;br /&gt;
&lt;br /&gt;
Starting the correct mission briefing animation is only half the rent, you&#039;ll need to stop the correct animation as well when the player proceeds to the objectives screen:&lt;br /&gt;
 windowDef BriefingStateEnd&lt;br /&gt;
 {&lt;br /&gt;
 	noTime 1&lt;br /&gt;
 &lt;br /&gt;
 	onTime 0&lt;br /&gt;
 	{&lt;br /&gt;
 		// ... stuff&lt;br /&gt;
 &lt;br /&gt;
 		if (&amp;quot;gui::CurrentMission&amp;quot; == 1)&lt;br /&gt;
 		{&lt;br /&gt;
 			set &amp;quot;BriefingMission1Animation::visible&amp;quot; &amp;quot;0&amp;quot;;&lt;br /&gt;
 			set &amp;quot;BriefingMission1Animation::notime&amp;quot; &amp;quot;1&amp;quot;;&lt;br /&gt;
 		}&lt;br /&gt;
 		else if (&amp;quot;gui::CurrentMission&amp;quot; == 2)&lt;br /&gt;
 		{&lt;br /&gt;
 			set &amp;quot;BriefingMission2Animation::visible&amp;quot; &amp;quot;0&amp;quot;;&lt;br /&gt;
 			set &amp;quot;BriefingMission2Animation::notime&amp;quot; &amp;quot;1&amp;quot;;&lt;br /&gt;
 		}&lt;br /&gt;
 &lt;br /&gt;
 		// ... stuff&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
If you don&#039;t do that the player might see remnants of the previous mission&#039;s briefing when proceeding to the next map briefing.&lt;br /&gt;
&lt;br /&gt;
The same holds analogously for the BriefingSkip windowDef which is used to skip the briefing on mouse clicks:&lt;br /&gt;
&lt;br /&gt;
 windowDef BriefingSkip&lt;br /&gt;
 {&lt;br /&gt;
 	notime 1&lt;br /&gt;
 &lt;br /&gt;
 	onTime 0&lt;br /&gt;
 	{&lt;br /&gt;
 		// ... stuff&lt;br /&gt;
 &lt;br /&gt;
 		// Stop the animation&lt;br /&gt;
 		if (&amp;quot;gui::CurrentMission&amp;quot; == 1)&lt;br /&gt;
 		{&lt;br /&gt;
 			resetTime &amp;quot;BriefingMission1Animation&amp;quot; 0;&lt;br /&gt;
 			set &amp;quot;BriefingMission1Animation::notime&amp;quot; &amp;quot;1&amp;quot;;&lt;br /&gt;
 		}&lt;br /&gt;
 		else if (&amp;quot;gui::CurrentMission&amp;quot; == 2)&lt;br /&gt;
 		{&lt;br /&gt;
 			set &amp;quot;BriefingMission2Animation::visible&amp;quot; &amp;quot;1&amp;quot;;&lt;br /&gt;
 			resetTime &amp;quot;BriefingMission2Animation&amp;quot; 0;&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= Briefing Videos =&lt;br /&gt;
It&#039;s possible to define briefing/intro videos for each mission in a campaign. To enable videos mappers need to include a mainmenu_custom_defs.gui file in their PK4 and define a few variables in there. You can look at the default file in the TDM PK4s to get more info and read some comments. I&#039;ll include the most important settings briefly here:&lt;br /&gt;
&lt;br /&gt;
Enable SDK-controlled briefing videos by adding this line to your mainmenu_custom_defs.gui file (or uncomment the line if it is present already but commented out):&lt;br /&gt;
 #define BRIEFING_VIDEO_CONTROLLED_BY_SDK 1&lt;br /&gt;
&lt;br /&gt;
Next you&#039;ll need to specify which video to be played for each mission. These are bit more complex:&lt;br /&gt;
&lt;br /&gt;
 #define MM_BRIEFING_1_VIDEO_MATERIALS &amp;quot;video/tdm_briefing_video;guis/video/credits/typing_sequence01;&amp;quot;&lt;br /&gt;
 #define MM_BRIEFING_1_VIDEO_LENGTHS &amp;quot;4000;5000&amp;quot;&lt;br /&gt;
 #define MM_BRIEFING_1_VIDEO_SOUND_CMD &amp;quot;music video/tdm_briefing_video_sound;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Easy to see, these three definitions refer to the first mission in the campaign, the prefix is &amp;quot;MM_BRIEFING_1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The MM_BRIEFING_1_VIDEO_MATERIALS line specifies the various ROQ materials that should be played (in this order). ROQ files have a maximum length of 60 seconds, so TDM added support to a sequence of ROQs to allow for longer videos. The materials should be separated by semicolons. Be sure to define the playback duration of each clip in the VIDEO_LENGTHS line.&lt;br /&gt;
&lt;br /&gt;
The next line MM_BRIEFING_1_VIDEO_LENGTHS corresponds to the MATERIALS line above and contains the playback duration of each ROQ clip. The time is specified in milliseconds, multiple times are separated by semicolons.&lt;br /&gt;
&lt;br /&gt;
The last line in this triple is defining the sound to be played along the video: MM_BRIEFING_1_VIDEO_SOUND_CMD. Sounds don&#039;t have a length limit, so there is no need to define multiple sounds like with the ROQ clips. Be sure to include the &amp;quot;music&amp;quot; command in the string and to refer to a valid sound shader.&lt;br /&gt;
&lt;br /&gt;
The original TDM mainmenu_custom_defs.gui file contains a lot of comments about these defs, please take a look there to learn more.&lt;br /&gt;
&lt;br /&gt;
Side note: the SDK-controlled video is also available in ordinary (single) mission packs. You don&#039;t need to build a full-blown campaign (with tdm_mapsequence.txt, etc.) to use this option, it&#039;s enough to make the correct #DEFINE statements above.&lt;br /&gt;
&lt;br /&gt;
= De-Briefing Videos =&lt;br /&gt;
With TDM 1.06 and upwards it&#039;s possible to have a video played back immediately after &amp;quot;Mission Complete&amp;quot;, so-called de-briefings.&lt;br /&gt;
&lt;br /&gt;
The mechanism to set these up is very similar to the above &amp;quot;SDK-controlled&amp;quot; briefing videos, all you need is to add the correct #DEFINE lines in your mainmenu_custom_defs.gui file:&lt;br /&gt;
&lt;br /&gt;
 #define MM_DEBRIEFING_1_VIDEO_MATERIALS &amp;quot;guis/video/credits/typing_sequence01;&amp;quot;&lt;br /&gt;
 #define MM_DEBRIEFING_1_VIDEO_LENGTHS &amp;quot;2000;&amp;quot;&lt;br /&gt;
 #define MM_DEBRIEFING_1_VIDEO_SOUND_CMD &amp;quot;music tdm_mainmenu_background_music;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
This example will play a credits video after &amp;quot;Mission Complete&amp;quot; for 2 seconds (= 2000 milliseconds). Please refer to the above &amp;quot;Briefings&amp;quot; section to learn about the precise meaning of these lines, they are pretty much analogous.&lt;br /&gt;
&lt;br /&gt;
Side note: this option is not exclusive to campaigns, you can have a de-briefing video in single-mission setups just as well.&lt;br /&gt;
&lt;br /&gt;
= Conditional Objectives =&lt;br /&gt;
You can have your mission objectives depend on the state of objectives in previous missions. It&#039;s possible to set an objective in the second mission to &amp;quot;COMPLETE&amp;quot; if the player managed to fulfill an objective in the first mission.&lt;br /&gt;
&lt;br /&gt;
[[Image:Objective conditions editor.png|400px|right]]&lt;br /&gt;
&lt;br /&gt;
Consider a campaign consisting of two maps: red.map and blue.map, played in this order. You have an optional objective in red.map telling the player to find 50 loot in gold. If the player manages to complete that objective the mandatory objective in mission 2 &#039;&#039;&amp;quot;Find enough gold for your rent&amp;quot;&#039;&#039; should already be marked as &#039;&#039;&amp;quot;Completed&amp;quot;&#039;&#039;. Such a thing can be achieved through a set of spawnargs that have been introduced in TDM 1.06 (see the [[Objectives#Objective_Conditions|Objectives]] article for reference), but you can do it through the Objectives Editor just as fine.&lt;br /&gt;
&lt;br /&gt;
I&#039;ll assume the use of the Conditions editor is fairly straightforward, but feel free to ask specific questions in our forums.&lt;br /&gt;
&lt;br /&gt;
= Scripting =&lt;br /&gt;
There are a few script methods which are specifically designed to be used in maps. See the file tdm_events.script for more details about them.&lt;br /&gt;
&lt;br /&gt;
===== mission number =====&lt;br /&gt;
Use the getCurrentMission() method on the sys entity to retrieve the current mission number. Note that the mission numbers are 0-based in the code, the function will return 0 for the first mission in a campaign. The following snippet will print the number to the console:&lt;br /&gt;
 sys.println(&amp;quot;Current Mission: &amp;quot; + sys.getCurrentMissionNum());&lt;br /&gt;
&lt;br /&gt;
===== persistent info =====&lt;br /&gt;
There are a couple of script events that can be used to store data in between missions. This data is stored in the so-called &amp;quot;persistent level info&amp;quot;, which is designed to store key/value pairs.&lt;br /&gt;
See &amp;lt;tt&amp;gt;tdm_events.script&amp;lt;/tt&amp;gt; file for further reference:&lt;br /&gt;
&lt;br /&gt;
 void   setPersistentArg( string key, string value );&lt;br /&gt;
 string getPersistentString( string key );&lt;br /&gt;
 float  getPersistentFloat( string key );&lt;br /&gt;
 vector getPersistentVector( string key );&lt;br /&gt;
&lt;br /&gt;
For example, you can store a number value like this (all values are stored as strings):&lt;br /&gt;
 sys.setPersistentArg(&amp;quot;dummyvar&amp;quot;, &amp;quot;20&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Later on you receive the number value like this:&lt;br /&gt;
 float testvar = sys.getPersistentFloat(&amp;quot;dummyvar&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
If you ever need to clear out the entire level info there&#039;s a separate routine for that:&lt;br /&gt;
 sys.clearPersistentArgs();&lt;br /&gt;
&lt;br /&gt;
===== game &amp;amp; gui =====&lt;br /&gt;
&lt;br /&gt;
Starting with &#039;&#039;&#039;TDM 2.13&#039;&#039;&#039;, persistent information is also provided as GUI variables ([https://bugs.thedarkmod.com/view.php?id=6509 #6509]).&lt;br /&gt;
The information is automatically synchronized between game script variables and GUI variables.&lt;br /&gt;
&lt;br /&gt;
For example, here is how you access &amp;quot;killed_berny&amp;quot; persistent argument in game script:&lt;br /&gt;
 sys.setPersistentArg(&amp;quot;killed_berny&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
 float value = sys.getPersistentFloat(&amp;quot;killed_berny&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
And here is how you access it in GUI script:&lt;br /&gt;
 set &amp;quot;gui::persistent_killed_berny&amp;quot; &amp;quot;1&amp;quot;;&lt;br /&gt;
 if (&amp;quot;gui::persistent_killed_berny&amp;quot; == 0) { ... }&lt;br /&gt;
&lt;br /&gt;
You can add a custom checkbox in GUI briefing, and then customize the game depending on whether the player enabled it or not.&lt;br /&gt;
Or you can implement game script functions &amp;lt;tt&amp;gt;on_mission_complete&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;on_mission_failed&amp;lt;/tt&amp;gt; and save some info about game state in order to customize debriefing.&lt;br /&gt;
This feature can be useful for single missions as well.&lt;br /&gt;
&lt;br /&gt;
= Inventory Items =&lt;br /&gt;
The player&#039;s inventory contains all the keys, tools, lockpicks, lantern as well as all the weapons. The mapper can define which of these should be kept when proceeding to the next mission. Items that are allowed to be kept are called &amp;quot;persistent&amp;quot;, and the corresponding spawnarg controlling that property is called &amp;quot;inv_persistent&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Tools &amp;amp; Items ==&lt;br /&gt;
By default regular inventory items are not marked as persistent, i.e. the inv_persistent key is set to &amp;quot;0&amp;quot;. Once the mapper flips that spawnarg to &amp;quot;1&amp;quot; the item will be kept throughout the following missions. The item will be kept until the end of the whole campaign, unless:&lt;br /&gt;
* the player drops the item&lt;br /&gt;
* it is removed from the inventory by script or other events&lt;br /&gt;
* a rule on the atdm:campaign_info entity is forcing the item to be removed after &amp;quot;Mission Complete&amp;quot; (see below).&lt;br /&gt;
&lt;br /&gt;
Even though TDM 2.02+ will resolve naming conflicts across maps, map authors should try to make sure that persistent items have unique names. For example, if the first map has a persistent item named &amp;quot;My Water Bottle&amp;quot;, none of the subsequent maps should have an item named &amp;quot;My Water Bottle&amp;quot;. If you must have a second water bottle, name it &amp;quot;My Second Water Bottle&amp;quot;, or something along those lines.&lt;br /&gt;
&lt;br /&gt;
If you have a persistent stackable item in map N, and you don&#039;t consume it in that map, and you have another instance of the same stackable item in map N+1 (whether it&#039;s marked &#039;persistent&#039; or not), when you pick it up, it will be added to the stack count of map N&#039;s item and become persistent.&lt;br /&gt;
&lt;br /&gt;
== Weapons &amp;amp; Arrows ==&lt;br /&gt;
All weapon inventory items are persistent by default including their ammo, so without further action the player will keep all his weapons and all the arrows when proceeding to the next mission. However it&#039;s possible to define ammo limits on the atdm:campaign_info entity, which is described below.&lt;br /&gt;
&lt;br /&gt;
Important: it&#039;s not advisable to mess with the inv_persistent spawnarg on weapon items - it&#039;s recommended to leave that spawnarg at the default value and control the carry-over by the rules on the campaign info entity.&lt;br /&gt;
&lt;br /&gt;
== Inventory Item and Weapon Limits ==&lt;br /&gt;
An [[atdm:campaign_info]] entity can be placed in a map to control which items make it to the next mission (and their amount) - and which should be dropped. The rules defined on the [[atdm:campaign_info]] entity will be enforced after the &amp;quot;Mission Complete&amp;quot; event, when the map is still active, i.e. it&#039;s &amp;quot;filtering&amp;quot; outgoing items. Each map can have its own campaign info entity to define its own set of rules.&lt;br /&gt;
&lt;br /&gt;
Please refer to the main [[atdm:campaign_info]] article to get precise info on how to set up these rules.&lt;br /&gt;
&lt;br /&gt;
= Loot Limits =&lt;br /&gt;
Special handling is possible for the amount of loot that is carried over and usable in the shop of the next mission. These so-called &amp;quot;loot carry-over&amp;quot; rules are defined on the shop entity of the respective map, e.g. the shop entity in Mission B will define the loot carry-over roles applicable to the loot collected in Mission A.&lt;br /&gt;
&lt;br /&gt;
Refer to the [[Shop#Limiting_the_Loot_from_previous_Missions|Shop]] article for further reference.&lt;br /&gt;
&lt;br /&gt;
{{editing}}&lt;br /&gt;
[[Category:Campaigns]]&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=Setting_up_Campaigns&amp;diff=33679</id>
		<title>Setting up Campaigns</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=Setting_up_Campaigns&amp;diff=33679"/>
		<updated>2025-01-05T18:56:07Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: Refined section about persistent info and added a subsection about passing information between game and GUI.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article is an attempt to describe the various options mappers need to consider when setting up campaigns or multi-mission packages (I&#039;ll refer to campaigns for both of these for the sake of simplicity). Campaign support has been added in TDM 1.06. &lt;br /&gt;
&lt;br /&gt;
= Map Files =&lt;br /&gt;
Regular, single-map TDM missions are packed in PK4 files, campaigns are no different. If your campaign consists of three missions (&amp;quot;red.map&amp;quot;, &amp;quot;blue.map&amp;quot; and &amp;quot;green.map&amp;quot;), all three of them still go into the same maps folder in your PK4 file.&lt;br /&gt;
&lt;br /&gt;
The actual order in which the missions are to be played is defined through the &amp;lt;tt&amp;gt;tdm_mapsequence.txt&amp;lt;/tt&amp;gt; file, which should be added to the PK4 (just next to the readme.txt). Following the example of the &amp;quot;red&amp;quot;, &amp;quot;blue&amp;quot; and &amp;quot;green&amp;quot; maps above the map sequence file would look like this:&lt;br /&gt;
&lt;br /&gt;
 Mission 1: red&lt;br /&gt;
 Mission 2: blue&lt;br /&gt;
 Mission 3: green&lt;br /&gt;
&lt;br /&gt;
Looking at that, the syntax of the file is pretty much self-explanatory. The first mission has the number one, the map file is mentioned after the colon and the following space. You don&#039;t need to specify the &amp;quot;.map&amp;quot; extension of the map file that is handled automatically. See the main [[tdm_mapsequence.txt]] article for further reference, for this article it&#039;s enough to have the above lines I suppose.&lt;br /&gt;
&lt;br /&gt;
= Briefings =&lt;br /&gt;
Once the map sequence is defined one needs to take care of the briefing. If you like to keep it simple, just refer to the Briefing article in the [[Briefing#Text-only_Briefing|Text-only Briefing]] section. Each map needs its own xdata block with the briefing and you&#039;ll be done.&lt;br /&gt;
&lt;br /&gt;
For advanced setups like the &amp;quot;Timed Flowing Briefing&amp;quot; mentioned in the [[Briefing]] article there are a few modifications to be made to your GUI code. As the mainmenu_briefing.gui file is the same for the whole campaign your GUI needs to know which map the player is about to play next. For this purpose a new GUI variable &amp;lt;tt&amp;gt;gui::CurrentMission&amp;lt;/tt&amp;gt; has been introduced which can be used in if-else GUI code blocks in the BriefingStateInit windowDef. For single-missions, mappers just called the GUI animation block like this:&lt;br /&gt;
&lt;br /&gt;
 windowDef BriefingStateInit&lt;br /&gt;
 {&lt;br /&gt;
 	noTime 1&lt;br /&gt;
 &lt;br /&gt;
 	// Init methods have onTime 10 instead of onTime 0.&lt;br /&gt;
 	onTime 10&lt;br /&gt;
 	{&lt;br /&gt;
 		// ... stuff&lt;br /&gt;
 &lt;br /&gt;
 		set &amp;quot;BriefingAnimation::visible&amp;quot; &amp;quot;1&amp;quot;;&lt;br /&gt;
 		resetTime &amp;quot;BriefingAnimation&amp;quot; 0;&lt;br /&gt;
 &lt;br /&gt;
 		// ... stuff&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
For multi-mission setups an if-else block should be added to switch to the correct briefing animation for the current map:&lt;br /&gt;
 windowDef BriefingStateInit&lt;br /&gt;
 {&lt;br /&gt;
 	noTime 1&lt;br /&gt;
 &lt;br /&gt;
 	// Init methods have onTime 10 instead of onTime 0.&lt;br /&gt;
 	onTime 10&lt;br /&gt;
 	{&lt;br /&gt;
 		// ... stuff&lt;br /&gt;
 &lt;br /&gt;
 		if (&amp;quot;gui::CurrentMission&amp;quot; == 1)&lt;br /&gt;
 		{&lt;br /&gt;
 			set &amp;quot;BriefingMission1Animation::visible&amp;quot; &amp;quot;1&amp;quot;;&lt;br /&gt;
 			resetTime &amp;quot;BriefingMission1Animation&amp;quot; 0;&lt;br /&gt;
 		}&lt;br /&gt;
 		else if (&amp;quot;gui::CurrentMission&amp;quot; == 2)&lt;br /&gt;
 		{&lt;br /&gt;
 			set &amp;quot;BriefingMission2Animation::visible&amp;quot; &amp;quot;1&amp;quot;;&lt;br /&gt;
 			resetTime &amp;quot;BriefingMission2Animation&amp;quot; 0;&lt;br /&gt;
 		}&lt;br /&gt;
 &lt;br /&gt;
 		// ... stuff&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Of course you&#039;ll need to define a &amp;lt;tt&amp;gt;BriefingMissionXAnimation&amp;lt;/tt&amp;gt; block for each mission. You can use the instructions in the [[Briefing]] article to learn how to do that, just keep in mind to change the windowDef&#039;s name such that you don&#039;t end up with duplicate names for your windowDefs (this will lead to warnings in the console at game startup at best).&lt;br /&gt;
&lt;br /&gt;
Starting the correct mission briefing animation is only half the rent, you&#039;ll need to stop the correct animation as well when the player proceeds to the objectives screen:&lt;br /&gt;
 windowDef BriefingStateEnd&lt;br /&gt;
 {&lt;br /&gt;
 	noTime 1&lt;br /&gt;
 &lt;br /&gt;
 	onTime 0&lt;br /&gt;
 	{&lt;br /&gt;
 		// ... stuff&lt;br /&gt;
 &lt;br /&gt;
 		if (&amp;quot;gui::CurrentMission&amp;quot; == 1)&lt;br /&gt;
 		{&lt;br /&gt;
 			set &amp;quot;BriefingMission1Animation::visible&amp;quot; &amp;quot;0&amp;quot;;&lt;br /&gt;
 			set &amp;quot;BriefingMission1Animation::notime&amp;quot; &amp;quot;1&amp;quot;;&lt;br /&gt;
 		}&lt;br /&gt;
 		else if (&amp;quot;gui::CurrentMission&amp;quot; == 2)&lt;br /&gt;
 		{&lt;br /&gt;
 			set &amp;quot;BriefingMission2Animation::visible&amp;quot; &amp;quot;0&amp;quot;;&lt;br /&gt;
 			set &amp;quot;BriefingMission2Animation::notime&amp;quot; &amp;quot;1&amp;quot;;&lt;br /&gt;
 		}&lt;br /&gt;
 &lt;br /&gt;
 		// ... stuff&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
If you don&#039;t do that the player might see remnants of the previous mission&#039;s briefing when proceeding to the next map briefing.&lt;br /&gt;
&lt;br /&gt;
The same holds analogously for the BriefingSkip windowDef which is used to skip the briefing on mouse clicks:&lt;br /&gt;
&lt;br /&gt;
 windowDef BriefingSkip&lt;br /&gt;
 {&lt;br /&gt;
 	notime 1&lt;br /&gt;
 &lt;br /&gt;
 	onTime 0&lt;br /&gt;
 	{&lt;br /&gt;
 		// ... stuff&lt;br /&gt;
 &lt;br /&gt;
 		// Stop the animation&lt;br /&gt;
 		if (&amp;quot;gui::CurrentMission&amp;quot; == 1)&lt;br /&gt;
 		{&lt;br /&gt;
 			resetTime &amp;quot;BriefingMission1Animation&amp;quot; 0;&lt;br /&gt;
 			set &amp;quot;BriefingMission1Animation::notime&amp;quot; &amp;quot;1&amp;quot;;&lt;br /&gt;
 		}&lt;br /&gt;
 		else if (&amp;quot;gui::CurrentMission&amp;quot; == 2)&lt;br /&gt;
 		{&lt;br /&gt;
 			set &amp;quot;BriefingMission2Animation::visible&amp;quot; &amp;quot;1&amp;quot;;&lt;br /&gt;
 			resetTime &amp;quot;BriefingMission2Animation&amp;quot; 0;&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= Briefing Videos =&lt;br /&gt;
It&#039;s possible to define briefing/intro videos for each mission in a campaign. To enable videos mappers need to include a mainmenu_custom_defs.gui file in their PK4 and define a few variables in there. You can look at the default file in the TDM PK4s to get more info and read some comments. I&#039;ll include the most important settings briefly here:&lt;br /&gt;
&lt;br /&gt;
Enable SDK-controlled briefing videos by adding this line to your mainmenu_custom_defs.gui file (or uncomment the line if it is present already but commented out):&lt;br /&gt;
 #define BRIEFING_VIDEO_CONTROLLED_BY_SDK 1&lt;br /&gt;
&lt;br /&gt;
Next you&#039;ll need to specify which video to be played for each mission. These are bit more complex:&lt;br /&gt;
&lt;br /&gt;
 #define MM_BRIEFING_1_VIDEO_MATERIALS &amp;quot;video/tdm_briefing_video;guis/video/credits/typing_sequence01;&amp;quot;&lt;br /&gt;
 #define MM_BRIEFING_1_VIDEO_LENGTHS &amp;quot;4000;5000&amp;quot;&lt;br /&gt;
 #define MM_BRIEFING_1_VIDEO_SOUND_CMD &amp;quot;music video/tdm_briefing_video_sound;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Easy to see, these three definitions refer to the first mission in the campaign, the prefix is &amp;quot;MM_BRIEFING_1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The MM_BRIEFING_1_VIDEO_MATERIALS line specifies the various ROQ materials that should be played (in this order). ROQ files have a maximum length of 60 seconds, so TDM added support to a sequence of ROQs to allow for longer videos. The materials should be separated by semicolons. Be sure to define the playback duration of each clip in the VIDEO_LENGTHS line.&lt;br /&gt;
&lt;br /&gt;
The next line MM_BRIEFING_1_VIDEO_LENGTHS corresponds to the MATERIALS line above and contains the playback duration of each ROQ clip. The time is specified in milliseconds, multiple times are separated by semicolons.&lt;br /&gt;
&lt;br /&gt;
The last line in this triple is defining the sound to be played along the video: MM_BRIEFING_1_VIDEO_SOUND_CMD. Sounds don&#039;t have a length limit, so there is no need to define multiple sounds like with the ROQ clips. Be sure to include the &amp;quot;music&amp;quot; command in the string and to refer to a valid sound shader.&lt;br /&gt;
&lt;br /&gt;
The original TDM mainmenu_custom_defs.gui file contains a lot of comments about these defs, please take a look there to learn more.&lt;br /&gt;
&lt;br /&gt;
Side note: the SDK-controlled video is also available in ordinary (single) mission packs. You don&#039;t need to build a full-blown campaign (with tdm_mapsequence.txt, etc.) to use this option, it&#039;s enough to make the correct #DEFINE statements above.&lt;br /&gt;
&lt;br /&gt;
= De-Briefing Videos =&lt;br /&gt;
With TDM 1.06 and upwards it&#039;s possible to have a video played back immediately after &amp;quot;Mission Complete&amp;quot;, so-called de-briefings.&lt;br /&gt;
&lt;br /&gt;
The mechanism to set these up is very similar to the above &amp;quot;SDK-controlled&amp;quot; briefing videos, all you need is to add the correct #DEFINE lines in your mainmenu_custom_defs.gui file:&lt;br /&gt;
&lt;br /&gt;
 #define MM_DEBRIEFING_1_VIDEO_MATERIALS &amp;quot;guis/video/credits/typing_sequence01;&amp;quot;&lt;br /&gt;
 #define MM_DEBRIEFING_1_VIDEO_LENGTHS &amp;quot;2000;&amp;quot;&lt;br /&gt;
 #define MM_DEBRIEFING_1_VIDEO_SOUND_CMD &amp;quot;music tdm_mainmenu_background_music;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
This example will play a credits video after &amp;quot;Mission Complete&amp;quot; for 2 seconds (= 2000 milliseconds). Please refer to the above &amp;quot;Briefings&amp;quot; section to learn about the precise meaning of these lines, they are pretty much analogous.&lt;br /&gt;
&lt;br /&gt;
Side note: this option is not exclusive to campaigns, you can have a de-briefing video in single-mission setups just as well.&lt;br /&gt;
&lt;br /&gt;
= Conditional Objectives =&lt;br /&gt;
You can have your mission objectives depend on the state of objectives in previous missions. It&#039;s possible to set an objective in the second mission to &amp;quot;COMPLETE&amp;quot; if the player managed to fulfill an objective in the first mission.&lt;br /&gt;
&lt;br /&gt;
[[Image:Objective conditions editor.png|400px|right]]&lt;br /&gt;
&lt;br /&gt;
Consider a campaign consisting of two maps: red.map and blue.map, played in this order. You have an optional objective in red.map telling the player to find 50 loot in gold. If the player manages to complete that objective the mandatory objective in mission 2 &#039;&#039;&amp;quot;Find enough gold for your rent&amp;quot;&#039;&#039; should already be marked as &#039;&#039;&amp;quot;Completed&amp;quot;&#039;&#039;. Such a thing can be achieved through a set of spawnargs that have been introduced in TDM 1.06 (see the [[Objectives#Objective_Conditions|Objectives]] article for reference), but you can do it through the Objectives Editor just as fine.&lt;br /&gt;
&lt;br /&gt;
I&#039;ll assume the use of the Conditions editor is fairly straightforward, but feel free to ask specific questions in our forums.&lt;br /&gt;
&lt;br /&gt;
= Scripting =&lt;br /&gt;
There are a few script methods which are specifically designed to be used in maps. See the file tdm_events.script for more details about them.&lt;br /&gt;
&lt;br /&gt;
===== mission number =====&lt;br /&gt;
Use the getCurrentMission() method on the sys entity to retrieve the current mission number. Note that the mission numbers are 0-based in the code, the function will return 0 for the first mission in a campaign. The following snippet will print the number to the console:&lt;br /&gt;
 sys.println(&amp;quot;Current Mission: &amp;quot; + sys.getCurrentMissionNum());&lt;br /&gt;
&lt;br /&gt;
===== persistent info =====&lt;br /&gt;
There are a couple of script events that can be used to store data in between missions. This data is stored in the so-called &amp;quot;persistent level info&amp;quot;, which is designed to store key/value pairs.&lt;br /&gt;
See &amp;lt;tt&amp;gt;tdm_events.script&amp;lt;/tt&amp;gt; file for further reference:&lt;br /&gt;
&lt;br /&gt;
 void   setPersistentArg( string key, string value );&lt;br /&gt;
 string getPersistentString( string key );&lt;br /&gt;
 float  getPersistentFloat( string key );&lt;br /&gt;
 vector getPersistentVector( string key );&lt;br /&gt;
&lt;br /&gt;
For example, you can store a number value like this (all values are stored as strings):&lt;br /&gt;
 sys.setPersistentArg(&amp;quot;dummyvar&amp;quot;, &amp;quot;20&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Later on you receive the number value like this:&lt;br /&gt;
 float testvar = sys.getPersistentFloat(&amp;quot;dummyvar&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
If you ever need to clear out the entire level info there&#039;s a separate routine for that:&lt;br /&gt;
 sys.clearPersistentArgs();&lt;br /&gt;
&lt;br /&gt;
===== game &amp;amp; gui =====&lt;br /&gt;
&lt;br /&gt;
Starting with &#039;&#039;&#039;TDM 2.13&#039;&#039;&#039;, persistent information is also provided as GUI variables.&lt;br /&gt;
The information is automatically synchronized between game script variables and GUI variables.&lt;br /&gt;
&lt;br /&gt;
For example, here is how you access &amp;quot;killed_berny&amp;quot; persistent argument in game script:&lt;br /&gt;
 sys.setPersistentArg(&amp;quot;killed_berny&amp;quot;, &amp;quot;1&amp;quot;);&lt;br /&gt;
 float value = sys.getPersistentFloat(&amp;quot;killed_berny&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
And here is how you access it in GUI script:&lt;br /&gt;
 set &amp;quot;gui::persistent_killed_berny&amp;quot; &amp;quot;1&amp;quot;;&lt;br /&gt;
 if (&amp;quot;gui::persistent_killed_berny&amp;quot; == 0) { ... }&lt;br /&gt;
&lt;br /&gt;
You can add a custom checkbox in GUI briefing, and then customize the game depending on whether the player enabled it or not.&lt;br /&gt;
Or you can implement game script functions &amp;lt;tt&amp;gt;on_mission_complete&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;on_mission_failed&amp;lt;/tt&amp;gt; and save some info about game state in order to customize debriefing.&lt;br /&gt;
This feature can be useful for single missions as well.&lt;br /&gt;
&lt;br /&gt;
= Inventory Items =&lt;br /&gt;
The player&#039;s inventory contains all the keys, tools, lockpicks, lantern as well as all the weapons. The mapper can define which of these should be kept when proceeding to the next mission. Items that are allowed to be kept are called &amp;quot;persistent&amp;quot;, and the corresponding spawnarg controlling that property is called &amp;quot;inv_persistent&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Tools &amp;amp; Items ==&lt;br /&gt;
By default regular inventory items are not marked as persistent, i.e. the inv_persistent key is set to &amp;quot;0&amp;quot;. Once the mapper flips that spawnarg to &amp;quot;1&amp;quot; the item will be kept throughout the following missions. The item will be kept until the end of the whole campaign, unless:&lt;br /&gt;
* the player drops the item&lt;br /&gt;
* it is removed from the inventory by script or other events&lt;br /&gt;
* a rule on the atdm:campaign_info entity is forcing the item to be removed after &amp;quot;Mission Complete&amp;quot; (see below).&lt;br /&gt;
&lt;br /&gt;
Even though TDM 2.02+ will resolve naming conflicts across maps, map authors should try to make sure that persistent items have unique names. For example, if the first map has a persistent item named &amp;quot;My Water Bottle&amp;quot;, none of the subsequent maps should have an item named &amp;quot;My Water Bottle&amp;quot;. If you must have a second water bottle, name it &amp;quot;My Second Water Bottle&amp;quot;, or something along those lines.&lt;br /&gt;
&lt;br /&gt;
If you have a persistent stackable item in map N, and you don&#039;t consume it in that map, and you have another instance of the same stackable item in map N+1 (whether it&#039;s marked &#039;persistent&#039; or not), when you pick it up, it will be added to the stack count of map N&#039;s item and become persistent.&lt;br /&gt;
&lt;br /&gt;
== Weapons &amp;amp; Arrows ==&lt;br /&gt;
All weapon inventory items are persistent by default including their ammo, so without further action the player will keep all his weapons and all the arrows when proceeding to the next mission. However it&#039;s possible to define ammo limits on the atdm:campaign_info entity, which is described below.&lt;br /&gt;
&lt;br /&gt;
Important: it&#039;s not advisable to mess with the inv_persistent spawnarg on weapon items - it&#039;s recommended to leave that spawnarg at the default value and control the carry-over by the rules on the campaign info entity.&lt;br /&gt;
&lt;br /&gt;
== Inventory Item and Weapon Limits ==&lt;br /&gt;
An [[atdm:campaign_info]] entity can be placed in a map to control which items make it to the next mission (and their amount) - and which should be dropped. The rules defined on the [[atdm:campaign_info]] entity will be enforced after the &amp;quot;Mission Complete&amp;quot; event, when the map is still active, i.e. it&#039;s &amp;quot;filtering&amp;quot; outgoing items. Each map can have its own campaign info entity to define its own set of rules.&lt;br /&gt;
&lt;br /&gt;
Please refer to the main [[atdm:campaign_info]] article to get precise info on how to set up these rules.&lt;br /&gt;
&lt;br /&gt;
= Loot Limits =&lt;br /&gt;
Special handling is possible for the amount of loot that is carried over and usable in the shop of the next mission. These so-called &amp;quot;loot carry-over&amp;quot; rules are defined on the shop entity of the respective map, e.g. the shop entity in Mission B will define the loot carry-over roles applicable to the loot collected in Mission A.&lt;br /&gt;
&lt;br /&gt;
Refer to the [[Shop#Limiting_the_Loot_from_previous_Missions|Shop]] article for further reference.&lt;br /&gt;
&lt;br /&gt;
{{editing}}&lt;br /&gt;
[[Category:Campaigns]]&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=Adding_new_Cvars&amp;diff=33678</id>
		<title>Adding new Cvars</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=Adding_new_Cvars&amp;diff=33678"/>
		<updated>2025-01-05T17:37:19Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Original_Reference|Ishtvan &amp;amp; Domarius|2600}}&lt;br /&gt;
&lt;br /&gt;
To add a new console variable (cvar) the files that must be changed are /game/gamesys/syscvar.*&lt;br /&gt;
&lt;br /&gt;
Let&#039;s use the example of adding a cvar to globally lower the volume of sounds that AI hear. We want to add a cvar called dm_ai_sndvol so we can adjust the volume of sounds that AI hear in realtime in the console.&lt;br /&gt;
&lt;br /&gt;
= Add a declaration of the cvar in game/gamesys/syscvar.cpp =&lt;br /&gt;
&lt;br /&gt;
 idCVar cv_tdm_ai_sndvol( &amp;quot;tdm_ai_sndvol&amp;quot;, &amp;quot;0.0&amp;quot;, CVAR_GAME | CVAR_ARCHIVE | CVAR_FLOAT, &lt;br /&gt;
           &amp;quot;Modifier to the volume of suspcious sounds that AI&#039;s hear. Defaults to 0.0 dB&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
The syntax is:&lt;br /&gt;
&lt;br /&gt;
 idCVar &amp;lt;SDK variable name&amp;gt;( &amp;quot;&amp;lt;variable name ingame&amp;gt;&amp;quot;, &amp;quot;&amp;lt;default value&amp;gt;&amp;quot;, &amp;lt;FLAGS&amp;gt;, &lt;br /&gt;
           &amp;quot;&amp;lt;Brief description of the variable&amp;gt;&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
Our naming convention for the SDK variable name is &amp;quot;cv_*&amp;quot;, where the cv indicates it&#039;s a cvar. This should be followed. The name ingame can be whatever you want but it has to include the tdm_ prefix at least. I&#039;ve been using the format tdm_ai_ .. for stuff having to do with the AI, etc.&lt;br /&gt;
&lt;br /&gt;
Note that the default value is stored as a string. These things are parsed just like key/value pairs, so the name and default value are both strings.&lt;br /&gt;
&lt;br /&gt;
== Type Flags ==&lt;br /&gt;
These flags define the Cvar type. If one of them is not set on your cvar, it will default to type string.&lt;br /&gt;
&lt;br /&gt;
* CVAR_BOOL&lt;br /&gt;
* CVAR_INTEGER&lt;br /&gt;
* CVAR_FLOAT&lt;br /&gt;
* CVAR_ROM (not sure what this is used for)&lt;br /&gt;
&lt;br /&gt;
== Other Flags ==&lt;br /&gt;
* CVAR_GAME, CVAR_RENDERER : Identifies the CVar as having to do with the game, or having to do with the renderer. Since we can&#039;t add anything to the renderer, I&#039;m guessing we&#039;ll always ue CVAR_GAME.&lt;br /&gt;
* CVAR_GUI : Used by the GUI (the difference to &amp;quot;CVAR_GAME&amp;quot; is unclear)&lt;br /&gt;
* CVAR_ARCHIVE : If set, the value of this CVAR will be stored to your Darkmod.cfg file, and saved. When you next start the game, the CVAR will have the same value, it will NOT go back to the default. (You can see what the default value was and set it back yourself by using listcvars &amp;lt;the cvar&amp;gt;).&lt;br /&gt;
* CVAR_NETWORKSYNC : Probably means that in multiplayer games, this is read from the server, so individuals cannot change it to a different setting on their client. Examples include jump height, walking speed, etc.&lt;br /&gt;
* CVAR_SERVERINFO : Server settings&lt;br /&gt;
* CVAR_USERINFO : User settings&lt;br /&gt;
* CVAR_INIT : ???&lt;br /&gt;
* CVAR_NOCHEAT : ??? It&#039;s set on password and g_fov. Maybe if cheats are enabled, it still doesn&#039;t let people change it?&lt;br /&gt;
&lt;br /&gt;
This is from the Id documentation on the matter:&lt;br /&gt;
 CVars are always considered cheats except when CVAR_NOCHEAT, CVAR_INIT, CVAR_ROM, &lt;br /&gt;
 CVAR_ARCHIVE, CVAR_USERINFO, CVAR_SERVERINFO, CVAR_NETWORKSYNC is set.&lt;br /&gt;
&lt;br /&gt;
= Adding extern declaration in game/gamesys/syscvar.h =&lt;br /&gt;
&lt;br /&gt;
 extern idCVar cv_tdm_ai_sndvol;&lt;br /&gt;
&lt;br /&gt;
This step is pretty self explanatory, just add the extern declaration in syscvar.h. (Unfortunately, changing syscvar.h requires a recompile of all the src, since it is included in game_local.h, and that is included in pretty much everything.)&lt;br /&gt;
&lt;br /&gt;
= Step 3. Using the CVar in the SDK =&lt;br /&gt;
To set and read the variable: use the appropriate idCvar::Set* and idCVar::Get* functions, where the * is replaced with the CVar type that you declared before.&lt;br /&gt;
&lt;br /&gt;
For example, suppose we want to use our cv_tdm_ai_sndvol in the code. Suppose we want to subtract it from some value InitialVolume.&lt;br /&gt;
&lt;br /&gt;
 float AdjustedVolume = InitialVolume - cv_tdm_ai_sndvol.GetFloat();&lt;br /&gt;
&lt;br /&gt;
Similarly, to set it in the SDK;&lt;br /&gt;
&lt;br /&gt;
 cv_tdm_ai_sndvol.SetFloat( 5.0f );&lt;br /&gt;
&lt;br /&gt;
== Side note: Manipulating cvars ingame in the console ==&lt;br /&gt;
* To see a list of cvars ingame, use &amp;quot;listcvars &amp;lt;your search string&amp;gt;&amp;quot;&lt;br /&gt;
* To see a description of a cvar, use &amp;quot;listcvars -help &amp;lt;your search string&amp;gt;&amp;quot;&lt;br /&gt;
* To see the current and default value of the cvar, just type the cvar name in the console.&lt;br /&gt;
* To set the value of a cvar, use &amp;quot;set &amp;lt;cvar name&amp;gt; &amp;lt;value&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
I believe you can also omit the &amp;quot;set&amp;quot; and just type &amp;quot;&amp;lt;cvar name&amp;gt; &amp;lt;value&amp;gt;&amp;quot; to set the value.&lt;br /&gt;
&lt;br /&gt;
More info can be found in: &#039;&#039;&#039;framework/cvarsystem.h&#039;&#039;&#039;. This file actually contains a lot of documentation in the form of comments.&lt;br /&gt;
&lt;br /&gt;
= Create or override CVAR using game script =&lt;br /&gt;
&lt;br /&gt;
If you want to create a new cvar for use with game script, you can do it dynamically during gameplay.&lt;br /&gt;
This command will create a new cvar or modify the value of existing cvar:&lt;br /&gt;
&lt;br /&gt;
 sys.setcvar(&amp;quot;name&amp;quot;, value);&lt;br /&gt;
&lt;br /&gt;
where &#039;name&#039; is the actual name of the cvar that the user will type in the console, and &#039;value&#039; is the string you want to assign.&lt;br /&gt;
&lt;br /&gt;
User will see this cvar and will be able to modify its value.&lt;br /&gt;
You can read the current effective value of the cvar by executing:&lt;br /&gt;
&lt;br /&gt;
 string value = sys.getcvar(&amp;quot;name&amp;quot;);&lt;br /&gt;
 float value = sys.getcvarf(&amp;quot;name&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Starting from TDM 2.13, &amp;lt;tt&amp;gt;sys.setcvar&amp;lt;/tt&amp;gt; sets &#039;&#039;&#039;mission override&#039;&#039;&#039; for a cvar but does not modify the user-specified value.&lt;br /&gt;
&lt;br /&gt;
Mission override has special behavior and is considered to be part of gameplay state: it is saved/restored in savefiles, cleared on game start/end, and never saved into darkmod.cfg even for archived cvars.&lt;br /&gt;
This is not important for cvars that you create dynamically, but very important if you modify the existing predefined cvars. See also [https://bugs.thedarkmod.com/view.php?id=5453 #5453].&lt;br /&gt;
&lt;br /&gt;
= CVARs and the GUI =&lt;br /&gt;
&lt;br /&gt;
It is possible to bind an input field directly to a CVAR via:&lt;br /&gt;
&lt;br /&gt;
 choices         &amp;quot;#str_07213&amp;quot;            // Aspect ratio&lt;br /&gt;
 values          &amp;quot;0;1;4;2;3&amp;quot;&lt;br /&gt;
 cvar            &amp;quot;r_aspectRatio&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The user is presented with the list of choices from &amp;quot;choices&amp;quot;, and for each of these, the appropriate value from &amp;quot;values&amp;quot; is set into &amp;quot;r_aspectRatio&amp;quot;. So when this field is changed, the value of r_aspectRatio is automatically changed, too.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{infobox|&#039;&#039;&#039;Note: Choices are limited to ASCII strings and the values are limited to valid choices for this CVAR. See [[I18N]] for details and how to work around that limitation.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
{{sdk}} [[Category:CVARS]]&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=Setting_up_Campaigns&amp;diff=33677</id>
		<title>Setting up Campaigns</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=Setting_up_Campaigns&amp;diff=33677"/>
		<updated>2025-01-05T17:32:09Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: TDM 2.13: &amp;quot;persistant&amp;quot; is renamed to &amp;quot;persistent&amp;quot; in script function names&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article is an attempt to describe the various options mappers need to consider when setting up campaigns or multi-mission packages (I&#039;ll refer to campaigns for both of these for the sake of simplicity). Campaign support has been added in TDM 1.06. &lt;br /&gt;
&lt;br /&gt;
= Map Files =&lt;br /&gt;
Regular, single-map TDM missions are packed in PK4 files, campaigns are no different. If your campaign consists of three missions (&amp;quot;red.map&amp;quot;, &amp;quot;blue.map&amp;quot; and &amp;quot;green.map&amp;quot;), all three of them still go into the same maps folder in your PK4 file.&lt;br /&gt;
&lt;br /&gt;
The actual order in which the missions are to be played is defined through the &amp;lt;tt&amp;gt;tdm_mapsequence.txt&amp;lt;/tt&amp;gt; file, which should be added to the PK4 (just next to the readme.txt). Following the example of the &amp;quot;red&amp;quot;, &amp;quot;blue&amp;quot; and &amp;quot;green&amp;quot; maps above the map sequence file would look like this:&lt;br /&gt;
&lt;br /&gt;
 Mission 1: red&lt;br /&gt;
 Mission 2: blue&lt;br /&gt;
 Mission 3: green&lt;br /&gt;
&lt;br /&gt;
Looking at that, the syntax of the file is pretty much self-explanatory. The first mission has the number one, the map file is mentioned after the colon and the following space. You don&#039;t need to specify the &amp;quot;.map&amp;quot; extension of the map file that is handled automatically. See the main [[tdm_mapsequence.txt]] article for further reference, for this article it&#039;s enough to have the above lines I suppose.&lt;br /&gt;
&lt;br /&gt;
= Briefings =&lt;br /&gt;
Once the map sequence is defined one needs to take care of the briefing. If you like to keep it simple, just refer to the Briefing article in the [[Briefing#Text-only_Briefing|Text-only Briefing]] section. Each map needs its own xdata block with the briefing and you&#039;ll be done.&lt;br /&gt;
&lt;br /&gt;
For advanced setups like the &amp;quot;Timed Flowing Briefing&amp;quot; mentioned in the [[Briefing]] article there are a few modifications to be made to your GUI code. As the mainmenu_briefing.gui file is the same for the whole campaign your GUI needs to know which map the player is about to play next. For this purpose a new GUI variable &amp;lt;tt&amp;gt;gui::CurrentMission&amp;lt;/tt&amp;gt; has been introduced which can be used in if-else GUI code blocks in the BriefingStateInit windowDef. For single-missions, mappers just called the GUI animation block like this:&lt;br /&gt;
&lt;br /&gt;
 windowDef BriefingStateInit&lt;br /&gt;
 {&lt;br /&gt;
 	noTime 1&lt;br /&gt;
 &lt;br /&gt;
 	// Init methods have onTime 10 instead of onTime 0.&lt;br /&gt;
 	onTime 10&lt;br /&gt;
 	{&lt;br /&gt;
 		// ... stuff&lt;br /&gt;
 &lt;br /&gt;
 		set &amp;quot;BriefingAnimation::visible&amp;quot; &amp;quot;1&amp;quot;;&lt;br /&gt;
 		resetTime &amp;quot;BriefingAnimation&amp;quot; 0;&lt;br /&gt;
 &lt;br /&gt;
 		// ... stuff&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
For multi-mission setups an if-else block should be added to switch to the correct briefing animation for the current map:&lt;br /&gt;
 windowDef BriefingStateInit&lt;br /&gt;
 {&lt;br /&gt;
 	noTime 1&lt;br /&gt;
 &lt;br /&gt;
 	// Init methods have onTime 10 instead of onTime 0.&lt;br /&gt;
 	onTime 10&lt;br /&gt;
 	{&lt;br /&gt;
 		// ... stuff&lt;br /&gt;
 &lt;br /&gt;
 		if (&amp;quot;gui::CurrentMission&amp;quot; == 1)&lt;br /&gt;
 		{&lt;br /&gt;
 			set &amp;quot;BriefingMission1Animation::visible&amp;quot; &amp;quot;1&amp;quot;;&lt;br /&gt;
 			resetTime &amp;quot;BriefingMission1Animation&amp;quot; 0;&lt;br /&gt;
 		}&lt;br /&gt;
 		else if (&amp;quot;gui::CurrentMission&amp;quot; == 2)&lt;br /&gt;
 		{&lt;br /&gt;
 			set &amp;quot;BriefingMission2Animation::visible&amp;quot; &amp;quot;1&amp;quot;;&lt;br /&gt;
 			resetTime &amp;quot;BriefingMission2Animation&amp;quot; 0;&lt;br /&gt;
 		}&lt;br /&gt;
 &lt;br /&gt;
 		// ... stuff&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Of course you&#039;ll need to define a &amp;lt;tt&amp;gt;BriefingMissionXAnimation&amp;lt;/tt&amp;gt; block for each mission. You can use the instructions in the [[Briefing]] article to learn how to do that, just keep in mind to change the windowDef&#039;s name such that you don&#039;t end up with duplicate names for your windowDefs (this will lead to warnings in the console at game startup at best).&lt;br /&gt;
&lt;br /&gt;
Starting the correct mission briefing animation is only half the rent, you&#039;ll need to stop the correct animation as well when the player proceeds to the objectives screen:&lt;br /&gt;
 windowDef BriefingStateEnd&lt;br /&gt;
 {&lt;br /&gt;
 	noTime 1&lt;br /&gt;
 &lt;br /&gt;
 	onTime 0&lt;br /&gt;
 	{&lt;br /&gt;
 		// ... stuff&lt;br /&gt;
 &lt;br /&gt;
 		if (&amp;quot;gui::CurrentMission&amp;quot; == 1)&lt;br /&gt;
 		{&lt;br /&gt;
 			set &amp;quot;BriefingMission1Animation::visible&amp;quot; &amp;quot;0&amp;quot;;&lt;br /&gt;
 			set &amp;quot;BriefingMission1Animation::notime&amp;quot; &amp;quot;1&amp;quot;;&lt;br /&gt;
 		}&lt;br /&gt;
 		else if (&amp;quot;gui::CurrentMission&amp;quot; == 2)&lt;br /&gt;
 		{&lt;br /&gt;
 			set &amp;quot;BriefingMission2Animation::visible&amp;quot; &amp;quot;0&amp;quot;;&lt;br /&gt;
 			set &amp;quot;BriefingMission2Animation::notime&amp;quot; &amp;quot;1&amp;quot;;&lt;br /&gt;
 		}&lt;br /&gt;
 &lt;br /&gt;
 		// ... stuff&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
If you don&#039;t do that the player might see remnants of the previous mission&#039;s briefing when proceeding to the next map briefing.&lt;br /&gt;
&lt;br /&gt;
The same holds analogously for the BriefingSkip windowDef which is used to skip the briefing on mouse clicks:&lt;br /&gt;
&lt;br /&gt;
 windowDef BriefingSkip&lt;br /&gt;
 {&lt;br /&gt;
 	notime 1&lt;br /&gt;
 &lt;br /&gt;
 	onTime 0&lt;br /&gt;
 	{&lt;br /&gt;
 		// ... stuff&lt;br /&gt;
 &lt;br /&gt;
 		// Stop the animation&lt;br /&gt;
 		if (&amp;quot;gui::CurrentMission&amp;quot; == 1)&lt;br /&gt;
 		{&lt;br /&gt;
 			resetTime &amp;quot;BriefingMission1Animation&amp;quot; 0;&lt;br /&gt;
 			set &amp;quot;BriefingMission1Animation::notime&amp;quot; &amp;quot;1&amp;quot;;&lt;br /&gt;
 		}&lt;br /&gt;
 		else if (&amp;quot;gui::CurrentMission&amp;quot; == 2)&lt;br /&gt;
 		{&lt;br /&gt;
 			set &amp;quot;BriefingMission2Animation::visible&amp;quot; &amp;quot;1&amp;quot;;&lt;br /&gt;
 			resetTime &amp;quot;BriefingMission2Animation&amp;quot; 0;&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
= Briefing Videos =&lt;br /&gt;
It&#039;s possible to define briefing/intro videos for each mission in a campaign. To enable videos mappers need to include a mainmenu_custom_defs.gui file in their PK4 and define a few variables in there. You can look at the default file in the TDM PK4s to get more info and read some comments. I&#039;ll include the most important settings briefly here:&lt;br /&gt;
&lt;br /&gt;
Enable SDK-controlled briefing videos by adding this line to your mainmenu_custom_defs.gui file (or uncomment the line if it is present already but commented out):&lt;br /&gt;
 #define BRIEFING_VIDEO_CONTROLLED_BY_SDK 1&lt;br /&gt;
&lt;br /&gt;
Next you&#039;ll need to specify which video to be played for each mission. These are bit more complex:&lt;br /&gt;
&lt;br /&gt;
 #define MM_BRIEFING_1_VIDEO_MATERIALS &amp;quot;video/tdm_briefing_video;guis/video/credits/typing_sequence01;&amp;quot;&lt;br /&gt;
 #define MM_BRIEFING_1_VIDEO_LENGTHS &amp;quot;4000;5000&amp;quot;&lt;br /&gt;
 #define MM_BRIEFING_1_VIDEO_SOUND_CMD &amp;quot;music video/tdm_briefing_video_sound;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Easy to see, these three definitions refer to the first mission in the campaign, the prefix is &amp;quot;MM_BRIEFING_1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The MM_BRIEFING_1_VIDEO_MATERIALS line specifies the various ROQ materials that should be played (in this order). ROQ files have a maximum length of 60 seconds, so TDM added support to a sequence of ROQs to allow for longer videos. The materials should be separated by semicolons. Be sure to define the playback duration of each clip in the VIDEO_LENGTHS line.&lt;br /&gt;
&lt;br /&gt;
The next line MM_BRIEFING_1_VIDEO_LENGTHS corresponds to the MATERIALS line above and contains the playback duration of each ROQ clip. The time is specified in milliseconds, multiple times are separated by semicolons.&lt;br /&gt;
&lt;br /&gt;
The last line in this triple is defining the sound to be played along the video: MM_BRIEFING_1_VIDEO_SOUND_CMD. Sounds don&#039;t have a length limit, so there is no need to define multiple sounds like with the ROQ clips. Be sure to include the &amp;quot;music&amp;quot; command in the string and to refer to a valid sound shader.&lt;br /&gt;
&lt;br /&gt;
The original TDM mainmenu_custom_defs.gui file contains a lot of comments about these defs, please take a look there to learn more.&lt;br /&gt;
&lt;br /&gt;
Side note: the SDK-controlled video is also available in ordinary (single) mission packs. You don&#039;t need to build a full-blown campaign (with tdm_mapsequence.txt, etc.) to use this option, it&#039;s enough to make the correct #DEFINE statements above.&lt;br /&gt;
&lt;br /&gt;
= De-Briefing Videos =&lt;br /&gt;
With TDM 1.06 and upwards it&#039;s possible to have a video played back immediately after &amp;quot;Mission Complete&amp;quot;, so-called de-briefings.&lt;br /&gt;
&lt;br /&gt;
The mechanism to set these up is very similar to the above &amp;quot;SDK-controlled&amp;quot; briefing videos, all you need is to add the correct #DEFINE lines in your mainmenu_custom_defs.gui file:&lt;br /&gt;
&lt;br /&gt;
 #define MM_DEBRIEFING_1_VIDEO_MATERIALS &amp;quot;guis/video/credits/typing_sequence01;&amp;quot;&lt;br /&gt;
 #define MM_DEBRIEFING_1_VIDEO_LENGTHS &amp;quot;2000;&amp;quot;&lt;br /&gt;
 #define MM_DEBRIEFING_1_VIDEO_SOUND_CMD &amp;quot;music tdm_mainmenu_background_music;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
This example will play a credits video after &amp;quot;Mission Complete&amp;quot; for 2 seconds (= 2000 milliseconds). Please refer to the above &amp;quot;Briefings&amp;quot; section to learn about the precise meaning of these lines, they are pretty much analogous.&lt;br /&gt;
&lt;br /&gt;
Side note: this option is not exclusive to campaigns, you can have a de-briefing video in single-mission setups just as well.&lt;br /&gt;
&lt;br /&gt;
= Conditional Objectives =&lt;br /&gt;
You can have your mission objectives depend on the state of objectives in previous missions. It&#039;s possible to set an objective in the second mission to &amp;quot;COMPLETE&amp;quot; if the player managed to fulfill an objective in the first mission.&lt;br /&gt;
&lt;br /&gt;
[[Image:Objective conditions editor.png|400px|right]]&lt;br /&gt;
&lt;br /&gt;
Consider a campaign consisting of two maps: red.map and blue.map, played in this order. You have an optional objective in red.map telling the player to find 50 loot in gold. If the player manages to complete that objective the mandatory objective in mission 2 &#039;&#039;&amp;quot;Find enough gold for your rent&amp;quot;&#039;&#039; should already be marked as &#039;&#039;&amp;quot;Completed&amp;quot;&#039;&#039;. Such a thing can be achieved through a set of spawnargs that have been introduced in TDM 1.06 (see the [[Objectives#Objective_Conditions|Objectives]] article for reference), but you can do it through the Objectives Editor just as fine.&lt;br /&gt;
&lt;br /&gt;
I&#039;ll assume the use of the Conditions editor is fairly straightforward, but feel free to ask specific questions in our forums.&lt;br /&gt;
&lt;br /&gt;
= Scripting =&lt;br /&gt;
There are a few script methods which are specifically designed to be used in maps. See the file tdm_events.script for more details about them.&lt;br /&gt;
&lt;br /&gt;
Use the getCurrentMission() method on the sys entity to retrieve the current mission number. Note that the mission numbers are 0-based in the code, the function will return 0 for the first mission in a campaign. The following snippet will print the number to the console:&lt;br /&gt;
 sys.println(&amp;quot;Current Mission: &amp;quot; + sys.getCurrentMissionNum());&lt;br /&gt;
&lt;br /&gt;
Furthermore there are a couple of script events that can be used to store data in between missions. This data is stored in the so-called &amp;quot;persistent level info&amp;quot;, which is designed to store key/value pairs.&lt;br /&gt;
&lt;br /&gt;
The script events are very similar to the routines used to query entity spawnargs (which is not surprising, as the persistent level info is using the same C++ class idDict to store the data). Since the persistent level info is not associated to any entity, these methods need to be called on the sys object. See doom_events.script file for further reference.&lt;br /&gt;
&lt;br /&gt;
 // Sets a key/value pair that persists between maps, overwriting existing keys with the same name&lt;br /&gt;
 scriptEvent	setPersistentArg( string key, string value );&lt;br /&gt;
&lt;br /&gt;
 // Returns the string for the given persistent arg&lt;br /&gt;
 scriptEvent	string	getPersistentString( string key );&lt;br /&gt;
 &lt;br /&gt;
 // Returns the floating point value for the given persistent arg&lt;br /&gt;
 scriptEvent	float	getPersistentFloat( string key );&lt;br /&gt;
 &lt;br /&gt;
 // Returns the vector for the given persistent arg&lt;br /&gt;
 scriptEvent	vector	getPersistentVector( string key );&lt;br /&gt;
&lt;br /&gt;
As example, you can store a number value like this (all values are stored as string)&lt;br /&gt;
 sys.setPersistentArg(&amp;quot;dummyvar&amp;quot;, &amp;quot;20&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Later on you receive the number value like this:&lt;br /&gt;
 float testvar = sys.getPersistentFloat(&amp;quot;dummyvar&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
If you ever need to clear out the entire level info there&#039;s a separate routine for that:&lt;br /&gt;
 // clears data that persists between maps&lt;br /&gt;
 sys.clearPersistentArgs();&lt;br /&gt;
&lt;br /&gt;
= Inventory Items =&lt;br /&gt;
The player&#039;s inventory contains all the keys, tools, lockpicks, lantern as well as all the weapons. The mapper can define which of these should be kept when proceeding to the next mission. Items that are allowed to be kept are called &amp;quot;persistent&amp;quot;, and the corresponding spawnarg controlling that property is called &amp;quot;inv_persistent&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Tools &amp;amp; Items ==&lt;br /&gt;
By default regular inventory items are not marked as persistent, i.e. the inv_persistent key is set to &amp;quot;0&amp;quot;. Once the mapper flips that spawnarg to &amp;quot;1&amp;quot; the item will be kept throughout the following missions. The item will be kept until the end of the whole campaign, unless:&lt;br /&gt;
* the player drops the item&lt;br /&gt;
* it is removed from the inventory by script or other events&lt;br /&gt;
* a rule on the atdm:campaign_info entity is forcing the item to be removed after &amp;quot;Mission Complete&amp;quot; (see below).&lt;br /&gt;
&lt;br /&gt;
Even though TDM 2.02+ will resolve naming conflicts across maps, map authors should try to make sure that persistent items have unique names. For example, if the first map has a persistent item named &amp;quot;My Water Bottle&amp;quot;, none of the subsequent maps should have an item named &amp;quot;My Water Bottle&amp;quot;. If you must have a second water bottle, name it &amp;quot;My Second Water Bottle&amp;quot;, or something along those lines.&lt;br /&gt;
&lt;br /&gt;
If you have a persistent stackable item in map N, and you don&#039;t consume it in that map, and you have another instance of the same stackable item in map N+1 (whether it&#039;s marked &#039;persistent&#039; or not), when you pick it up, it will be added to the stack count of map N&#039;s item and become persistent.&lt;br /&gt;
&lt;br /&gt;
== Weapons &amp;amp; Arrows ==&lt;br /&gt;
All weapon inventory items are persistent by default including their ammo, so without further action the player will keep all his weapons and all the arrows when proceeding to the next mission. However it&#039;s possible to define ammo limits on the atdm:campaign_info entity, which is described below.&lt;br /&gt;
&lt;br /&gt;
Important: it&#039;s not advisable to mess with the inv_persistent spawnarg on weapon items - it&#039;s recommended to leave that spawnarg at the default value and control the carry-over by the rules on the campaign info entity.&lt;br /&gt;
&lt;br /&gt;
== Inventory Item and Weapon Limits ==&lt;br /&gt;
An [[atdm:campaign_info]] entity can be placed in a map to control which items make it to the next mission (and their amount) - and which should be dropped. The rules defined on the [[atdm:campaign_info]] entity will be enforced after the &amp;quot;Mission Complete&amp;quot; event, when the map is still active, i.e. it&#039;s &amp;quot;filtering&amp;quot; outgoing items. Each map can have its own campaign info entity to define its own set of rules.&lt;br /&gt;
&lt;br /&gt;
Please refer to the main [[atdm:campaign_info]] article to get precise info on how to set up these rules.&lt;br /&gt;
&lt;br /&gt;
= Loot Limits =&lt;br /&gt;
Special handling is possible for the amount of loot that is carried over and usable in the shop of the next mission. These so-called &amp;quot;loot carry-over&amp;quot; rules are defined on the shop entity of the respective map, e.g. the shop entity in Mission B will define the loot carry-over roles applicable to the loot collected in Mission A.&lt;br /&gt;
&lt;br /&gt;
Refer to the [[Shop#Limiting_the_Loot_from_previous_Missions|Shop]] article for further reference.&lt;br /&gt;
&lt;br /&gt;
{{editing}}&lt;br /&gt;
[[Category:Campaigns]]&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=Adding_new_Cvars&amp;diff=33676</id>
		<title>Adding new Cvars</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=Adding_new_Cvars&amp;diff=33676"/>
		<updated>2025-01-05T17:27:53Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: Updated Cvar interactions in game scripts: mission override, binding to variable deleted.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Original_Reference|Ishtvan &amp;amp; Domarius|2600}}&lt;br /&gt;
&lt;br /&gt;
To add a new console variable (cvar) the files that must be changed are /game/gamesys/syscvar.*&lt;br /&gt;
&lt;br /&gt;
Let&#039;s use the example of adding a cvar to globally lower the volume of sounds that AI hear. We want to add a cvar called dm_ai_sndvol so we can adjust the volume of sounds that AI hear in realtime in the console.&lt;br /&gt;
&lt;br /&gt;
= Add a declaration of the cvar in game/gamesys/syscvar.cpp =&lt;br /&gt;
&lt;br /&gt;
 idCVar cv_tdm_ai_sndvol( &amp;quot;tdm_ai_sndvol&amp;quot;, &amp;quot;0.0&amp;quot;, CVAR_GAME | CVAR_ARCHIVE | CVAR_FLOAT, &lt;br /&gt;
           &amp;quot;Modifier to the volume of suspcious sounds that AI&#039;s hear. Defaults to 0.0 dB&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
The syntax is:&lt;br /&gt;
&lt;br /&gt;
 idCVar &amp;lt;SDK variable name&amp;gt;( &amp;quot;&amp;lt;variable name ingame&amp;gt;&amp;quot;, &amp;quot;&amp;lt;default value&amp;gt;&amp;quot;, &amp;lt;FLAGS&amp;gt;, &lt;br /&gt;
           &amp;quot;&amp;lt;Brief description of the variable&amp;gt;&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
Our naming convention for the SDK variable name is &amp;quot;cv_*&amp;quot;, where the cv indicates it&#039;s a cvar. This should be followed. The name ingame can be whatever you want but it has to include the tdm_ prefix at least. I&#039;ve been using the format tdm_ai_ .. for stuff having to do with the AI, etc.&lt;br /&gt;
&lt;br /&gt;
Note that the default value is stored as a string. These things are parsed just like key/value pairs, so the name and default value are both strings.&lt;br /&gt;
&lt;br /&gt;
== Type Flags ==&lt;br /&gt;
These flags define the Cvar type. If one of them is not set on your cvar, it will default to type string.&lt;br /&gt;
&lt;br /&gt;
* CVAR_BOOL&lt;br /&gt;
* CVAR_INTEGER&lt;br /&gt;
* CVAR_FLOAT&lt;br /&gt;
* CVAR_ROM (not sure what this is used for)&lt;br /&gt;
&lt;br /&gt;
== Other Flags ==&lt;br /&gt;
* CVAR_GAME, CVAR_RENDERER : Identifies the CVar as having to do with the game, or having to do with the renderer. Since we can&#039;t add anything to the renderer, I&#039;m guessing we&#039;ll always ue CVAR_GAME.&lt;br /&gt;
* CVAR_GUI : Used by the GUI (the difference to &amp;quot;CVAR_GAME&amp;quot; is unclear)&lt;br /&gt;
* CVAR_ARCHIVE : If set, the value of this CVAR will be stored to your Darkmod.cfg file, and saved. When you next start the game, the CVAR will have the same value, it will NOT go back to the default. (You can see what the default value was and set it back yourself by using listcvars &amp;lt;the cvar&amp;gt;).&lt;br /&gt;
* CVAR_NETWORKSYNC : Probably means that in multiplayer games, this is read from the server, so individuals cannot change it to a different setting on their client. Examples include jump height, walking speed, etc.&lt;br /&gt;
* CVAR_SERVERINFO : Server settings&lt;br /&gt;
* CVAR_USERINFO : User settings&lt;br /&gt;
* CVAR_INIT : ???&lt;br /&gt;
* CVAR_NOCHEAT : ??? It&#039;s set on password and g_fov. Maybe if cheats are enabled, it still doesn&#039;t let people change it?&lt;br /&gt;
&lt;br /&gt;
This is from the Id documentation on the matter:&lt;br /&gt;
 CVars are always considered cheats except when CVAR_NOCHEAT, CVAR_INIT, CVAR_ROM, &lt;br /&gt;
 CVAR_ARCHIVE, CVAR_USERINFO, CVAR_SERVERINFO, CVAR_NETWORKSYNC is set.&lt;br /&gt;
&lt;br /&gt;
= Adding extern declaration in game/gamesys/syscvar.h =&lt;br /&gt;
&lt;br /&gt;
 extern idCVar cv_tdm_ai_sndvol;&lt;br /&gt;
&lt;br /&gt;
This step is pretty self explanatory, just add the extern declaration in syscvar.h. (Unfortunately, changing syscvar.h requires a recompile of all the src, since it is included in game_local.h, and that is included in pretty much everything.)&lt;br /&gt;
&lt;br /&gt;
= Step 3. Using the CVar in the SDK =&lt;br /&gt;
To set and read the variable: use the appropriate idCvar::Set* and idCVar::Get* functions, where the * is replaced with the CVar type that you declared before.&lt;br /&gt;
&lt;br /&gt;
For example, suppose we want to use our cv_tdm_ai_sndvol in the code. Suppose we want to subtract it from some value InitialVolume.&lt;br /&gt;
&lt;br /&gt;
 float AdjustedVolume = InitialVolume - cv_tdm_ai_sndvol.GetFloat();&lt;br /&gt;
&lt;br /&gt;
Similarly, to set it in the SDK;&lt;br /&gt;
&lt;br /&gt;
 cv_tdm_ai_sndvol.SetFloat( 5.0f );&lt;br /&gt;
&lt;br /&gt;
== Side note: Manipulating cvars ingame in the console ==&lt;br /&gt;
* To see a list of cvars ingame, use &amp;quot;listcvars &amp;lt;your search string&amp;gt;&amp;quot;&lt;br /&gt;
* To see a description of a cvar, use &amp;quot;listcvars -help &amp;lt;your search string&amp;gt;&amp;quot;&lt;br /&gt;
* To see the current and default value of the cvar, just type the cvar name in the console.&lt;br /&gt;
* To set the value of a cvar, use &amp;quot;set &amp;lt;cvar name&amp;gt; &amp;lt;value&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
I believe you can also omit the &amp;quot;set&amp;quot; and just type &amp;quot;&amp;lt;cvar name&amp;gt; &amp;lt;value&amp;gt;&amp;quot; to set the value.&lt;br /&gt;
&lt;br /&gt;
More info can be found in: &#039;&#039;&#039;framework/cvarsystem.h&#039;&#039;&#039;. This file actually contains a lot of documentation in the form of comments.&lt;br /&gt;
&lt;br /&gt;
= Creating a CVAR using script =&lt;br /&gt;
&lt;br /&gt;
If you need to create a cvar for use with game script, you&#039;re in for a much easier ride.&lt;br /&gt;
This command will create a new cvar or modify the value of existing cvar:&lt;br /&gt;
&lt;br /&gt;
 sys.setcvar(&amp;quot;name&amp;quot;, value);&lt;br /&gt;
&lt;br /&gt;
where &#039;name&#039; is the actual name of the cvar that the user will type in the console, and &#039;value&#039; is the string you want to assign.&lt;br /&gt;
&lt;br /&gt;
User will see this cvar and will be able to modify its value.&lt;br /&gt;
You can read the current effective value of the cvar by executing:&lt;br /&gt;
&lt;br /&gt;
 string value = sys.getcvar(&amp;quot;name&amp;quot;);&lt;br /&gt;
 float value = sys.getcvarf(&amp;quot;name&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Starting from TDM 2.13, &amp;lt;tt&amp;gt;sys.setcvar&amp;lt;/tt&amp;gt; sets &amp;quot;mission override&amp;quot; for a cvar but does not modify the user-specified value.&lt;br /&gt;
&lt;br /&gt;
Mission override has special behavior and is considered to be part of gameplay state: it is saved/restored in savefiles, cleared on game start/end, and never saved into darkmod.cfg even for archived cvars.&lt;br /&gt;
This is not important for cvars that you create dynamically, but very important if you modify the existing predefined cvars. See also [https://bugs.thedarkmod.com/view.php?id=5453 #5453].&lt;br /&gt;
&lt;br /&gt;
= CVARs and the GUI =&lt;br /&gt;
&lt;br /&gt;
It is possible to bind an input field directly to a CVAR via:&lt;br /&gt;
&lt;br /&gt;
 choices         &amp;quot;#str_07213&amp;quot;            // Aspect ratio&lt;br /&gt;
 values          &amp;quot;0;1;4;2;3&amp;quot;&lt;br /&gt;
 cvar            &amp;quot;r_aspectRatio&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The user is presented with the list of choices from &amp;quot;choices&amp;quot;, and for each of these, the appropriate value from &amp;quot;values&amp;quot; is set into &amp;quot;r_aspectRatio&amp;quot;. So when this field is changed, the value of r_aspectRatio is automatically changed, too.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{infobox|&#039;&#039;&#039;Note: Choices are limited to ASCII strings and the values are limited to valid choices for this CVAR. See [[I18N]] for details and how to work around that limitation.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
{{sdk}} [[Category:CVARS]]&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=Parallax_mapping&amp;diff=33674</id>
		<title>Parallax mapping</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=Parallax_mapping&amp;diff=33674"/>
		<updated>2025-01-04T21:29:12Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article describes how to set up a material for parallax mapping, which was added in TDM 2.13.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Material ===&lt;br /&gt;
&lt;br /&gt;
The new &#039;&#039;&#039;parallax stage&#039;&#039;&#039; is a part of an &#039;&#039;&#039;interaction group&#039;&#039;&#039;, i.e. a group of stages which together define the reaction of the surface to the surrounding light sources.&lt;br /&gt;
This sample material contains only one interaction group that consists of diffuse, bump, and parallax stages (no specular):&lt;br /&gt;
&lt;br /&gt;
 textures/test/test_parallax&lt;br /&gt;
 {&lt;br /&gt;
     diffusemap       textures/test_parallax/parallax_test2_d&lt;br /&gt;
     bumpmap          textures/test_parallax/parallax_test_local2&lt;br /&gt;
     {&lt;br /&gt;
         blend parallaxmap&lt;br /&gt;
         map textures/test_parallax/parallax_test_height&lt;br /&gt;
         min -0.2&lt;br /&gt;
         max 0.0&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Note that both height/parallax map (&amp;lt;tt&amp;gt;parallax_test_height&amp;lt;/tt&amp;gt;) and normal/bump map (&amp;lt;tt&amp;gt;parallax_test_local2&amp;lt;/tt&amp;gt;) are necessary!&lt;br /&gt;
Parallax stage alone only displaces the surface fragments according to the relief, but does not affect lighting in any way.&lt;br /&gt;
You need bump stage with matching normal map in order to make lighting behave properly according to the relief.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;min&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;max&amp;lt;/tt&amp;gt; parameters specify how the colors in heightmap are converted into physical displacements.&lt;br /&gt;
In this specific case, fragments where heightmap = 1.0 (white) stay on the mesh geometry, while fragments where heightmap = 0.0 (black) are displaced inwards by 1/5 of texture tile length.&lt;br /&gt;
&lt;br /&gt;
It is important to set correct value of (&amp;lt;tt&amp;gt;max&amp;lt;/tt&amp;gt; - &amp;lt;tt&amp;gt;min&amp;lt;/tt&amp;gt;), otherwise lighting will look incorrect. &lt;br /&gt;
Normally, you should get this number from the software when you bake height and normal maps.&lt;br /&gt;
And if you decide to change this value afterwards, then you need to rebake the normal map.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Amount of displacement ===&lt;br /&gt;
&lt;br /&gt;
These parameters define the amount of displacements for full-black and full-white texels in the heightmap respectively:&lt;br /&gt;
&lt;br /&gt;
 min {expression} (default = -0.1)&lt;br /&gt;
 max {expression} (default = 0.0)&lt;br /&gt;
&lt;br /&gt;
Positive value corresponds to displacement along surface normal (outwards), while negative pushes the fragments in the opposite way (inwards).&lt;br /&gt;
&lt;br /&gt;
The numbers specify the amount of displacement in UV space / in relative sense. If you have a quad of unit size which is covered by the texture exactly, then &amp;lt;tt&amp;gt;max = 0.35&amp;lt;/tt&amp;gt; will displace full-white texels by 0.35. If the same quad is resized to 800 doom units, then &amp;lt;tt&amp;gt;max = 0.35&amp;lt;/tt&amp;gt; will mean displacement by 0.35 * 800 = 280 doom units. So if you stretch the texture, the displacements are magnified proportionally in order to keep the match between heightmap and normalmap.&lt;br /&gt;
&lt;br /&gt;
Generally speaking, the case &amp;lt;tt&amp;gt;max = 0&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;min &amp;lt; 0&amp;lt;/tt&amp;gt; is the most useful, because it pushes the fragments inside the wall, which is usually solid and impassable by the player. Sometimes &amp;lt;tt&amp;gt;max &amp;gt; 0&amp;lt;/tt&amp;gt; might make more sense, but special case should be taken to ensure the player cannot cross the relief.&lt;br /&gt;
&lt;br /&gt;
These parameters are the most important, and you need to set at least one of them explicitly in most cases.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Falling shadows ===&lt;br /&gt;
&lt;br /&gt;
Parallax mapping is a hack, the mesh geometry is still used for many purposes, even inside rendering.&lt;br /&gt;
For example, if you let a cubic crate case shadow onto parallax-mapped wall, the shadow edges are still straight lines by default, so the surface relief does not affect the shadows falling onto it.&lt;br /&gt;
&lt;br /&gt;
This flag deforms the shadow falling onto the parallax-mapped surface according to the relief:&lt;br /&gt;
&lt;br /&gt;
 offsetExternalShadows {0 or 1}  (default = 0)&lt;br /&gt;
&lt;br /&gt;
However, it has two additional caveats:&lt;br /&gt;
# It does not work with stencil shadows.&lt;br /&gt;
# It also disables shadows cast by the parallax-mapped surface itself.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Grazing angles ===&lt;br /&gt;
&lt;br /&gt;
The parallax algorithm does not work well under grazing viewing angles.&lt;br /&gt;
That&#039;s why the parallax effect is gradually reduced to zero for low angles.&lt;br /&gt;
&lt;br /&gt;
It is controlled by the parameter:&lt;br /&gt;
&lt;br /&gt;
 grazingAngle {float}  (default = 0.3)&lt;br /&gt;
&lt;br /&gt;
The parallax gets flattened under view angles lower than this value in radians.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Quality and complexity ===&lt;br /&gt;
&lt;br /&gt;
The engine uses simple Parallax Occlusion Mapping algorithm, which intersects a ray with height map per each fragment. The raycasting algorithm is approximate and can miss intersections sometimes. This usually results in visual artifacts along the silhouette edges of relief, which look like staircases.&lt;br /&gt;
&lt;br /&gt;
===== Displacement =====&lt;br /&gt;
&lt;br /&gt;
These parameters controls how many iterations are performed:&lt;br /&gt;
&lt;br /&gt;
 linearSteps {integer}  (default = 20)&lt;br /&gt;
 refineSteps {integer}  (default = 5)&lt;br /&gt;
&lt;br /&gt;
The first parameter is more important. Increasing it reduces the number of missed intersections, making raycasting more reliable but slower.&lt;br /&gt;
The second parameter makes detected intersections more precise, but does not help with missed intersections.&lt;br /&gt;
&lt;br /&gt;
Normally, you should not touch this, but sometimes you might get away with low values without breakage.&lt;br /&gt;
&lt;br /&gt;
===== Shadows =====&lt;br /&gt;
&lt;br /&gt;
The self-shadows of parallax-mapped surface are rendered with special algorithm which involves raycasting again =)&lt;br /&gt;
This is how many linear iterations are performed when searching for shadow ray intersections:&lt;br /&gt;
&lt;br /&gt;
 shadowSteps {integer}  (default = 20)&lt;br /&gt;
&lt;br /&gt;
As usual, increasing it makes self-shadows more reliable but decreases performance.&lt;br /&gt;
If the number of shadow steps gets too low, then penumbra will become dithered, which can be annoying.&lt;br /&gt;
&lt;br /&gt;
Setting shadowSteps = 0 completely disables self-shadows.&lt;br /&gt;
&lt;br /&gt;
The following parameters defines how soft self-shadows are:&lt;br /&gt;
&lt;br /&gt;
 shadowSoftness {expression}  (default = ?)&lt;br /&gt;
&lt;br /&gt;
The default value is computed automatically from other parameters, and is around 0.005 if all the other parameters are at defaults.&lt;br /&gt;
Increasing softness can also help hide dithering from low shadowSteps.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Caveats ===&lt;br /&gt;
&lt;br /&gt;
The edges of parallax-mapped material usually look weird, especially when you more camera around.&lt;br /&gt;
You can occlude the edges from the viewer with some other geometry. Or you can create such a heightmap which makes zero displacement on the edges.&lt;br /&gt;
&lt;br /&gt;
As of now, parallax mapping only works on interactions, it does not affect the ambient stages of a material.&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=Parallax_mapping&amp;diff=33673</id>
		<title>Parallax mapping</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=Parallax_mapping&amp;diff=33673"/>
		<updated>2025-01-04T21:28:54Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article describes how to set up a material for parallax mapping, which was added in TDM 2.13.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Material ===&lt;br /&gt;
&lt;br /&gt;
The new &#039;&#039;&#039;parallax stage&#039;&#039;&#039; is a part of an &#039;&#039;&#039;interaction group&#039;&#039;&#039;, i.e. a group of stages which together define the reaction of the surface to the surrounding light sources.&lt;br /&gt;
This sample material contains only one interaction group that consists of diffuse, bump, and parallax stages (no specular):&lt;br /&gt;
&lt;br /&gt;
 textures/test/test_parallax&lt;br /&gt;
 {&lt;br /&gt;
     diffusemap       textures/test_parallax/parallax_test2_d&lt;br /&gt;
     bumpmap          textures/test_parallax/parallax_test_local2&lt;br /&gt;
     {&lt;br /&gt;
         blend parallaxmap&lt;br /&gt;
         map textures/test_parallax/parallax_test_height&lt;br /&gt;
         min -0.2&lt;br /&gt;
         max 0.0&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Note that both height/parallax map (&amp;lt;tt&amp;gt;parallax_test_height&amp;lt;/tt&amp;gt;) and normal/bump map (&amp;lt;tt&amp;gt;parallax_test_local2&amp;lt;/tt&amp;gt;) are necessary!&lt;br /&gt;
Parallax stage alone only displaces the surface fragments according to the relief, but does not affect lighting in any way.&lt;br /&gt;
You need bump stage with matching normal map in order to make lighting behave properly according to the relief.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;min&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;max&amp;lt;/tt&amp;gt; parameters specify how the colors in heightmap are converted into physical displacements.&lt;br /&gt;
In this specific case, fragments where heightmap = 1.0 (white) stay on the mesh geometry, while fragments where heightmap = 0.0 (black) are displaced inwards by 1/5 of texture tile length.&lt;br /&gt;
&lt;br /&gt;
It is important to set correct value of (&amp;lt;tt&amp;gt;max&amp;lt;/tt&amp;gt; - &amp;lt;tt&amp;gt;min&amp;lt;/tt&amp;gt;), otherwise lighting will look incorrect. &lt;br /&gt;
Normally, you should get this number from the software when you bake height and normal maps.&lt;br /&gt;
And if you decide to change this value afterwards, then you need to rebake the normal map.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Amount of displacement ===&lt;br /&gt;
&lt;br /&gt;
These parameters define the amount of displacements for full-black and full-white texels in the heightmap respectively:&lt;br /&gt;
&lt;br /&gt;
 min {expression} (default = -0.1)&lt;br /&gt;
 max {expression} (default = 0.0)&lt;br /&gt;
&lt;br /&gt;
Positive value corresponds to displacement along surface normal (outwards), while negative pushes the fragments in the opposite way (inwards).&lt;br /&gt;
&lt;br /&gt;
The numbers specify the amount of displacement in UV space / in relative sense. If you have a quad of unit size which is covered by the texture exactly, then &amp;lt;tt&amp;gt;max = 0.35&amp;lt;/tt&amp;gt; will displace full-white texels by 0.35. If the same quad is resized to 800 doom units, then &amp;lt;tt&amp;gt;max = 0.35&amp;lt;/tt&amp;gt; will mean displacement by 0.35 * 800 = 280 doom units. So if you stretch the texture, the displacements are magnified proportionally in order to keep the match between heightmap and normalmap.&lt;br /&gt;
&lt;br /&gt;
Generally speaking, the case &amp;lt;tt&amp;gt;max = 0&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;min &amp;lt; 0&amp;lt;/tt&amp;gt; is the most useful, because it pushes the fragments inside the wall, which is usually solid and impassable by the player. Sometimes &amp;lt;tt&amp;gt;max &amp;gt; 0&amp;lt;/tt&amp;gt; might make more sense, but special case should be taken to ensure the player cannot cross the relief.&lt;br /&gt;
&lt;br /&gt;
These parameters are the most important, and you need to set at least one of them explicitly in most cases.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Falling shadows ===&lt;br /&gt;
&lt;br /&gt;
Parallax mapping is a hack, the mesh geometry is still used for many purposes, even inside rendering.&lt;br /&gt;
For example, if you let a cubic crate case shadow onto parallax-mapped wall, the shadow edges are still straight lines by default, so the surface relief does not affect the shadows falling onto it.&lt;br /&gt;
&lt;br /&gt;
This flag deforms the shadow falling onto the parallax-mapped surface according to the relief:&lt;br /&gt;
&lt;br /&gt;
 offsetExternalShadows {0 or 1}  (default = 0)&lt;br /&gt;
&lt;br /&gt;
However, it has two additional caveats:&lt;br /&gt;
# It does not work with stencil shadows.&lt;br /&gt;
# It also disables shadows cast by the parallax-mapped surface itself.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Grazing angles ===&lt;br /&gt;
&lt;br /&gt;
The parallax algorithm does not work well under grazing viewing angles.&lt;br /&gt;
That&#039;s why the parallax effect is gradually reduced to zero for low angles.&lt;br /&gt;
&lt;br /&gt;
It is controlled by the parameter:&lt;br /&gt;
&lt;br /&gt;
 grazingAngle {float}  (default = 0.3)&lt;br /&gt;
&lt;br /&gt;
The parallax gets flattened under view angles lower than this value in radians.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Quality and complexity ===&lt;br /&gt;
&lt;br /&gt;
The engine uses simple Parallax Occlusion Mapping algorithm, which intersects a ray with height map per each fragment. The raycasting algorithm is approximate and can miss intersections sometimes. This usually results in visual artifacts along the silhouette edges of relief, which look like staircases.&lt;br /&gt;
&lt;br /&gt;
===== Displacement =====&lt;br /&gt;
&lt;br /&gt;
These parameters controls how many iterations are performed:&lt;br /&gt;
&lt;br /&gt;
 linearSteps {integer}  (default = 20)&lt;br /&gt;
 refineSteps {integer}  (default = 5)&lt;br /&gt;
&lt;br /&gt;
The first parameter is more important. Increasing it reduces the number of missed intersections, making raycasting more reliable but slower.&lt;br /&gt;
The second parameter makes detected intersections more precise, but does not help with missed intersections.&lt;br /&gt;
&lt;br /&gt;
Normally, you should not touch this, but sometimes you might get away with low values without breakage.&lt;br /&gt;
&lt;br /&gt;
===== Shadows =====&lt;br /&gt;
&lt;br /&gt;
The self-shadows of parallax-mapped surface are rendered with special algorithm which involves raycasting again =)&lt;br /&gt;
This is how many linear iterations are performed when searching for shadow ray intersections:&lt;br /&gt;
&lt;br /&gt;
 shadowSteps {integer}  (default = 20)&lt;br /&gt;
&lt;br /&gt;
As usual, increasing it makes self-shadows more reliable but decreases performance.&lt;br /&gt;
If the number of shadow steps gets too low, then penumbra will become dithered, which can be annoying.&lt;br /&gt;
&lt;br /&gt;
Setting shadowSteps = 0 completely disables self-shadows.&lt;br /&gt;
&lt;br /&gt;
The following parameters defines how soft self-shadows are:&lt;br /&gt;
&lt;br /&gt;
 shadowSoftness {expression}  (default = ?)&lt;br /&gt;
&lt;br /&gt;
The default value is computed automatically from other parameters, and is around 0.005 if all the other parameters are at defaults.&lt;br /&gt;
Increasing softness can also help hide dithering from low shadowSteps.&lt;br /&gt;
&lt;br /&gt;
=== Caveats ===&lt;br /&gt;
&lt;br /&gt;
The edges of parallax-mapped material usually look weird, especially when you more camera around.&lt;br /&gt;
You can occlude the edges from the viewer with some other geometry. Or you can create such a heightmap which makes zero displacement on the edges.&lt;br /&gt;
&lt;br /&gt;
As of now, parallax mapping only works on interactions, it does not affect the ambient stages of a material.&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=Parallax_mapping&amp;diff=33672</id>
		<title>Parallax mapping</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=Parallax_mapping&amp;diff=33672"/>
		<updated>2025-01-04T21:27:46Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: /* Shadows */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article describes how to set up a material for parallax mapping, which was added in TDM 2.13.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Material ===&lt;br /&gt;
&lt;br /&gt;
The new &#039;&#039;&#039;parallax stage&#039;&#039;&#039; is a part of an &#039;&#039;&#039;interaction group&#039;&#039;&#039;, i.e. a group of stages which together define the reaction of the surface to the surrounding light sources.&lt;br /&gt;
This sample material contains only one interaction group that consists of diffuse, bump, and parallax stages (no specular):&lt;br /&gt;
&lt;br /&gt;
 textures/test/test_parallax&lt;br /&gt;
 {&lt;br /&gt;
     diffusemap       textures/test_parallax/parallax_test2_d&lt;br /&gt;
     bumpmap          textures/test_parallax/parallax_test_local2&lt;br /&gt;
     {&lt;br /&gt;
         blend parallaxmap&lt;br /&gt;
         map textures/test_parallax/parallax_test_height&lt;br /&gt;
         min -0.2&lt;br /&gt;
         max 0.0&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Note that both height/parallax map (&amp;lt;tt&amp;gt;parallax_test_height&amp;lt;/tt&amp;gt;) and normal/bump map (&amp;lt;tt&amp;gt;parallax_test_local2&amp;lt;/tt&amp;gt;) are necessary!&lt;br /&gt;
Parallax stage alone only displaces the surface fragments according to the relief, but does not affect lighting in any way.&lt;br /&gt;
You need bump stage with matching normal map in order to make lighting behave properly according to the relief.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;min&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;max&amp;lt;/tt&amp;gt; parameters specify how the colors in heightmap are converted into physical displacements.&lt;br /&gt;
In this specific case, fragments where heightmap = 1.0 (white) stay on the mesh geometry, while fragments where heightmap = 0.0 (black) are displaced inwards by 1/5 of texture tile length.&lt;br /&gt;
&lt;br /&gt;
It is important to set correct value of (&amp;lt;tt&amp;gt;max&amp;lt;/tt&amp;gt; - &amp;lt;tt&amp;gt;min&amp;lt;/tt&amp;gt;), otherwise lighting will look incorrect. &lt;br /&gt;
Normally, you should get this number from the software when you bake height and normal maps.&lt;br /&gt;
And if you decide to change this value afterwards, then you need to rebake the normal map.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Amount of displacement ===&lt;br /&gt;
&lt;br /&gt;
These parameters define the amount of displacements for full-black and full-white texels in the heightmap respectively:&lt;br /&gt;
&lt;br /&gt;
* min {expression} (default = -0.1)&lt;br /&gt;
* max {expression} (default = 0.0)&lt;br /&gt;
&lt;br /&gt;
Positive value corresponds to displacement along surface normal (outwards), while negative pushes the fragments in the opposite way (inwards).&lt;br /&gt;
&lt;br /&gt;
The numbers specify the amount of displacement in UV space / in relative sense. If you have a quad of unit size which is covered by the texture exactly, then &amp;lt;tt&amp;gt;max = 0.35&amp;lt;/tt&amp;gt; will displace full-white texels by 0.35. If the same quad is resized to 800 doom units, then &amp;lt;tt&amp;gt;max = 0.35&amp;lt;/tt&amp;gt; will mean displacement by 0.35 * 800 = 280 doom units. So if you stretch the texture, the displacements are magnified proportionally in order to keep the match between heightmap and normalmap.&lt;br /&gt;
&lt;br /&gt;
Generally speaking, the case &amp;lt;tt&amp;gt;max = 0&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;min &amp;lt; 0&amp;lt;/tt&amp;gt; is the most useful, because it pushes the fragments inside the wall, which is usually solid and impassable by the player. Sometimes &amp;lt;tt&amp;gt;max &amp;gt; 0&amp;lt;/tt&amp;gt; might make more sense, but special case should be taken to ensure the player cannot cross the relief.&lt;br /&gt;
&lt;br /&gt;
These parameters are the most important, and you need to set at least one of them explicitly in most cases.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Falling shadows ===&lt;br /&gt;
&lt;br /&gt;
Parallax mapping is a hack, the mesh geometry is still used for many purposes, even inside rendering.&lt;br /&gt;
For example, if you let a cubic crate case shadow onto parallax-mapped wall, the shadow edges are still straight lines by default, so the surface relief does not affect the shadows falling onto it.&lt;br /&gt;
&lt;br /&gt;
This flag deforms the shadow falling onto the parallax-mapped surface according to the relief:&lt;br /&gt;
&lt;br /&gt;
* offsetExternalShadows {0 or 1}  (default = 0)&lt;br /&gt;
&lt;br /&gt;
However, it has two additional caveats:&lt;br /&gt;
# It does not work with stencil shadows.&lt;br /&gt;
# It also disables shadows cast by the parallax-mapped surface itself.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Grazing angles ===&lt;br /&gt;
&lt;br /&gt;
The parallax algorithm does not work well under grazing viewing angles.&lt;br /&gt;
That&#039;s why the parallax effect is gradually reduced to zero for low angles.&lt;br /&gt;
&lt;br /&gt;
It is controlled by the parameter:&lt;br /&gt;
&lt;br /&gt;
* grazingAngle {float}  (default = 0.3)&lt;br /&gt;
&lt;br /&gt;
The parallax gets flattened under view angles lower than this value in radians.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Quality and complexity ===&lt;br /&gt;
&lt;br /&gt;
The engine uses simple Parallax Occlusion Mapping algorithm, which intersects a ray with height map per each fragment. The raycasting algorithm is approximate and can miss intersections sometimes. This usually results in visual artifacts along the silhouette edges of relief, which look like staircases.&lt;br /&gt;
&lt;br /&gt;
===== Displacement =====&lt;br /&gt;
&lt;br /&gt;
These parameters controls how many iterations are performed:&lt;br /&gt;
&lt;br /&gt;
* linearSteps {integer}  (default = 20)&lt;br /&gt;
* refineSteps {integer}  (default = 5)&lt;br /&gt;
&lt;br /&gt;
The first parameter is more important. Increasing it reduces the number of missed intersections, making raycasting more reliable but slower.&lt;br /&gt;
The second parameter makes detected intersections more precise, but does not help with missed intersections.&lt;br /&gt;
&lt;br /&gt;
Normally, you should not touch this, but sometimes you might get away with low values without breakage.&lt;br /&gt;
&lt;br /&gt;
===== Shadows =====&lt;br /&gt;
&lt;br /&gt;
The self-shadows of parallax-mapped surface are rendered with special algorithm which involves raycasting again =)&lt;br /&gt;
This is how many linear iterations are performed when searching for shadow ray intersections:&lt;br /&gt;
&lt;br /&gt;
* shadowSteps {integer}  (default = 20)&lt;br /&gt;
&lt;br /&gt;
As usual, increasing it makes self-shadows more reliable but decreases performance.&lt;br /&gt;
If the number of shadow steps gets too low, then penumbra will become dithered, which can be annoying.&lt;br /&gt;
&lt;br /&gt;
Setting shadowSteps = 0 completely disables self-shadows.&lt;br /&gt;
&lt;br /&gt;
The following parameters defines how soft self-shadows are:&lt;br /&gt;
&lt;br /&gt;
* shadowSoftness {expression}  (default = ?)&lt;br /&gt;
&lt;br /&gt;
The default value is computed automatically from other parameters, and is around 0.005 if all the other parameters are at defaults.&lt;br /&gt;
Increasing softness can also help hide dithering from low shadowSteps.&lt;br /&gt;
&lt;br /&gt;
=== Caveats ===&lt;br /&gt;
&lt;br /&gt;
The edges of parallax-mapped material usually look weird, especially when you more camera around.&lt;br /&gt;
You can occlude the edges from the viewer with some other geometry. Or you can create such a heightmap which makes zero displacement on the edges.&lt;br /&gt;
&lt;br /&gt;
As of now, parallax mapping only works on interactions, it does not affect the ambient stages of a material.&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=Parallax_mapping&amp;diff=33671</id>
		<title>Parallax mapping</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=Parallax_mapping&amp;diff=33671"/>
		<updated>2025-01-04T21:27:31Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article describes how to set up a material for parallax mapping, which was added in TDM 2.13.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Material ===&lt;br /&gt;
&lt;br /&gt;
The new &#039;&#039;&#039;parallax stage&#039;&#039;&#039; is a part of an &#039;&#039;&#039;interaction group&#039;&#039;&#039;, i.e. a group of stages which together define the reaction of the surface to the surrounding light sources.&lt;br /&gt;
This sample material contains only one interaction group that consists of diffuse, bump, and parallax stages (no specular):&lt;br /&gt;
&lt;br /&gt;
 textures/test/test_parallax&lt;br /&gt;
 {&lt;br /&gt;
     diffusemap       textures/test_parallax/parallax_test2_d&lt;br /&gt;
     bumpmap          textures/test_parallax/parallax_test_local2&lt;br /&gt;
     {&lt;br /&gt;
         blend parallaxmap&lt;br /&gt;
         map textures/test_parallax/parallax_test_height&lt;br /&gt;
         min -0.2&lt;br /&gt;
         max 0.0&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Note that both height/parallax map (&amp;lt;tt&amp;gt;parallax_test_height&amp;lt;/tt&amp;gt;) and normal/bump map (&amp;lt;tt&amp;gt;parallax_test_local2&amp;lt;/tt&amp;gt;) are necessary!&lt;br /&gt;
Parallax stage alone only displaces the surface fragments according to the relief, but does not affect lighting in any way.&lt;br /&gt;
You need bump stage with matching normal map in order to make lighting behave properly according to the relief.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;min&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;max&amp;lt;/tt&amp;gt; parameters specify how the colors in heightmap are converted into physical displacements.&lt;br /&gt;
In this specific case, fragments where heightmap = 1.0 (white) stay on the mesh geometry, while fragments where heightmap = 0.0 (black) are displaced inwards by 1/5 of texture tile length.&lt;br /&gt;
&lt;br /&gt;
It is important to set correct value of (&amp;lt;tt&amp;gt;max&amp;lt;/tt&amp;gt; - &amp;lt;tt&amp;gt;min&amp;lt;/tt&amp;gt;), otherwise lighting will look incorrect. &lt;br /&gt;
Normally, you should get this number from the software when you bake height and normal maps.&lt;br /&gt;
And if you decide to change this value afterwards, then you need to rebake the normal map.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Amount of displacement ===&lt;br /&gt;
&lt;br /&gt;
These parameters define the amount of displacements for full-black and full-white texels in the heightmap respectively:&lt;br /&gt;
&lt;br /&gt;
* min {expression} (default = -0.1)&lt;br /&gt;
* max {expression} (default = 0.0)&lt;br /&gt;
&lt;br /&gt;
Positive value corresponds to displacement along surface normal (outwards), while negative pushes the fragments in the opposite way (inwards).&lt;br /&gt;
&lt;br /&gt;
The numbers specify the amount of displacement in UV space / in relative sense. If you have a quad of unit size which is covered by the texture exactly, then &amp;lt;tt&amp;gt;max = 0.35&amp;lt;/tt&amp;gt; will displace full-white texels by 0.35. If the same quad is resized to 800 doom units, then &amp;lt;tt&amp;gt;max = 0.35&amp;lt;/tt&amp;gt; will mean displacement by 0.35 * 800 = 280 doom units. So if you stretch the texture, the displacements are magnified proportionally in order to keep the match between heightmap and normalmap.&lt;br /&gt;
&lt;br /&gt;
Generally speaking, the case &amp;lt;tt&amp;gt;max = 0&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;min &amp;lt; 0&amp;lt;/tt&amp;gt; is the most useful, because it pushes the fragments inside the wall, which is usually solid and impassable by the player. Sometimes &amp;lt;tt&amp;gt;max &amp;gt; 0&amp;lt;/tt&amp;gt; might make more sense, but special case should be taken to ensure the player cannot cross the relief.&lt;br /&gt;
&lt;br /&gt;
These parameters are the most important, and you need to set at least one of them explicitly in most cases.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Falling shadows ===&lt;br /&gt;
&lt;br /&gt;
Parallax mapping is a hack, the mesh geometry is still used for many purposes, even inside rendering.&lt;br /&gt;
For example, if you let a cubic crate case shadow onto parallax-mapped wall, the shadow edges are still straight lines by default, so the surface relief does not affect the shadows falling onto it.&lt;br /&gt;
&lt;br /&gt;
This flag deforms the shadow falling onto the parallax-mapped surface according to the relief:&lt;br /&gt;
&lt;br /&gt;
* offsetExternalShadows {0 or 1}  (default = 0)&lt;br /&gt;
&lt;br /&gt;
However, it has two additional caveats:&lt;br /&gt;
# It does not work with stencil shadows.&lt;br /&gt;
# It also disables shadows cast by the parallax-mapped surface itself.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Grazing angles ===&lt;br /&gt;
&lt;br /&gt;
The parallax algorithm does not work well under grazing viewing angles.&lt;br /&gt;
That&#039;s why the parallax effect is gradually reduced to zero for low angles.&lt;br /&gt;
&lt;br /&gt;
It is controlled by the parameter:&lt;br /&gt;
&lt;br /&gt;
* grazingAngle {float}  (default = 0.3)&lt;br /&gt;
&lt;br /&gt;
The parallax gets flattened under view angles lower than this value in radians.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Quality and complexity ===&lt;br /&gt;
&lt;br /&gt;
The engine uses simple Parallax Occlusion Mapping algorithm, which intersects a ray with height map per each fragment. The raycasting algorithm is approximate and can miss intersections sometimes. This usually results in visual artifacts along the silhouette edges of relief, which look like staircases.&lt;br /&gt;
&lt;br /&gt;
===== Displacement =====&lt;br /&gt;
&lt;br /&gt;
These parameters controls how many iterations are performed:&lt;br /&gt;
&lt;br /&gt;
* linearSteps {integer}  (default = 20)&lt;br /&gt;
* refineSteps {integer}  (default = 5)&lt;br /&gt;
&lt;br /&gt;
The first parameter is more important. Increasing it reduces the number of missed intersections, making raycasting more reliable but slower.&lt;br /&gt;
The second parameter makes detected intersections more precise, but does not help with missed intersections.&lt;br /&gt;
&lt;br /&gt;
Normally, you should not touch this, but sometimes you might get away with low values without breakage.&lt;br /&gt;
&lt;br /&gt;
===== Shadows =====&lt;br /&gt;
&lt;br /&gt;
The self-shadows of parallax-mapped surface are rendered with special algorithm which involves raycasting again =)&lt;br /&gt;
This is how many linear iterations are performed when searching for shadow ray intersections:&lt;br /&gt;
&lt;br /&gt;
 * shadowSteps {integer}  (default = 20)&lt;br /&gt;
&lt;br /&gt;
As usual, increasing it makes self-shadows more reliable but decreases performance.&lt;br /&gt;
If the number of shadow steps gets too low, then penumbra will become dithered, which can be annoying.&lt;br /&gt;
&lt;br /&gt;
Setting shadowSteps = 0 completely disables self-shadows.&lt;br /&gt;
&lt;br /&gt;
The following parameters defines how soft self-shadows are:&lt;br /&gt;
&lt;br /&gt;
 * shadowSoftness {expression}  (default = ?)&lt;br /&gt;
&lt;br /&gt;
The default value is computed automatically from other parameters, and is around 0.005 if all the other parameters are at defaults.&lt;br /&gt;
Increasing softness can also help hide dithering from low shadowSteps.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Caveats ===&lt;br /&gt;
&lt;br /&gt;
The edges of parallax-mapped material usually look weird, especially when you more camera around.&lt;br /&gt;
You can occlude the edges from the viewer with some other geometry. Or you can create such a heightmap which makes zero displacement on the edges.&lt;br /&gt;
&lt;br /&gt;
As of now, parallax mapping only works on interactions, it does not affect the ambient stages of a material.&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=Parallax_mapping&amp;diff=33670</id>
		<title>Parallax mapping</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=Parallax_mapping&amp;diff=33670"/>
		<updated>2025-01-04T21:27:11Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: First version&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article describes how to set up a material for parallax mapping, which was added in TDM 2.13.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Material ===&lt;br /&gt;
&lt;br /&gt;
The new &#039;&#039;&#039;parallax stage&#039;&#039;&#039; is a part of an &#039;&#039;&#039;interaction group&#039;&#039;&#039;, i.e. a group of stages which together define the reaction of the surface to the surrounding light sources.&lt;br /&gt;
This sample material contains only one interaction group that consists of diffuse, bump, and parallax stages (no specular):&lt;br /&gt;
&lt;br /&gt;
 textures/test/test_parallax&lt;br /&gt;
 {&lt;br /&gt;
     diffusemap       textures/test_parallax/parallax_test2_d&lt;br /&gt;
     bumpmap          textures/test_parallax/parallax_test_local2&lt;br /&gt;
     {&lt;br /&gt;
         blend parallaxmap&lt;br /&gt;
         map textures/test_parallax/parallax_test_height&lt;br /&gt;
         min -0.2&lt;br /&gt;
         max 0.0&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Note that both height/parallax map (&amp;lt;tt&amp;gt;parallax_test_height&amp;lt;/tt&amp;gt;) and normal/bump map (&amp;lt;tt&amp;gt;parallax_test_local2&amp;lt;/tt&amp;gt;) are necessary!&lt;br /&gt;
Parallax stage alone only displaces the surface fragments according to the relief, but does not affect lighting in any way.&lt;br /&gt;
You need bump stage with matching normal map in order to make lighting behave properly according to the relief.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;min&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;max&amp;lt;/tt&amp;gt; parameters specify how the colors in heightmap are converted into physical displacements.&lt;br /&gt;
In this specific case, fragments where heightmap = 1.0 (white) stay on the mesh geometry, while fragments where heightmap = 0.0 (black) are displaced inwards by 1/5 of texture tile length.&lt;br /&gt;
&lt;br /&gt;
It is important to set correct value of (&amp;lt;tt&amp;gt;max&amp;lt;/tt&amp;gt; - &amp;lt;tt&amp;gt;min&amp;lt;/tt&amp;gt;), otherwise lighting will look incorrect. &lt;br /&gt;
Normally, you should get this number from the software when you bake height and normal maps.&lt;br /&gt;
And if you decide to change this value afterwards, then you need to rebake the normal map.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Amount of displacement ===&lt;br /&gt;
&lt;br /&gt;
These parameters define the amount of displacements for full-black and full-white texels in the heightmap respectively:&lt;br /&gt;
&lt;br /&gt;
* min {expression} (default = -0.1)&lt;br /&gt;
* max {expression} (default = 0.0)&lt;br /&gt;
&lt;br /&gt;
Positive value corresponds to displacement along surface normal (outwards), while negative pushes the fragments in the opposite way (inwards).&lt;br /&gt;
&lt;br /&gt;
The numbers specify the amount of displacement in UV space / in relative sense. If you have a quad of unit size which is covered by the texture exactly, then &amp;lt;tt&amp;gt;max = 0.35&amp;lt;/tt&amp;gt; will displace full-white texels by 0.35. If the same quad is resized to 800 doom units, then &amp;lt;tt&amp;gt;max = 0.35&amp;lt;/tt&amp;gt; will mean displacement by 0.35 * 800 = 280 doom units. So if you stretch the texture, the displacements are magnified proportionally in order to keep the match between heightmap and normalmap.&lt;br /&gt;
&lt;br /&gt;
Generally speaking, the case &amp;lt;tt&amp;gt;max = 0&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;min &amp;lt; 0&amp;lt;/tt&amp;gt; is the most useful, because it pushes the fragments inside the wall, which is usually solid and impassable by the player. Sometimes &amp;lt;tt&amp;gt;max &amp;gt; 0&amp;lt;/tt&amp;gt; might make more sense, but special case should be taken to ensure the player cannot cross the relief.&lt;br /&gt;
&lt;br /&gt;
These parameters are the most important, and you need to set at least one of them explicitly in most cases.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Falling shadows ===&lt;br /&gt;
&lt;br /&gt;
Parallax mapping is a hack, the mesh geometry is still used for many purposes, even inside rendering.&lt;br /&gt;
For example, if you let a cubic crate case shadow onto parallax-mapped wall, the shadow edges are still straight lines by default, so the surface relief does not affect the shadows falling onto it.&lt;br /&gt;
&lt;br /&gt;
This flag deforms the shadow falling onto the parallax-mapped surface according to the relief:&lt;br /&gt;
&lt;br /&gt;
* offsetExternalShadows {0 or 1}  (default = 0)&lt;br /&gt;
&lt;br /&gt;
However, it has two additional caveats:&lt;br /&gt;
# It does not work with stencil shadows.&lt;br /&gt;
# It also disables shadows cast by the parallax-mapped surface itself.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Grazing angles ===&lt;br /&gt;
&lt;br /&gt;
The parallax algorithm does not work well under grazing viewing angles.&lt;br /&gt;
That&#039;s why the parallax effect is gradually reduced to zero for low angles.&lt;br /&gt;
&lt;br /&gt;
It is controlled by the parameter:&lt;br /&gt;
&lt;br /&gt;
* grazingAngle {float}  (default = 0.3)&lt;br /&gt;
&lt;br /&gt;
The parallax gets flattened under view angles lower than this value in radians.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Quality and complexity ===&lt;br /&gt;
&lt;br /&gt;
The engine uses simple Parallax Occlusion Mapping algorithm, which intersects a ray with height map per each fragment. The raycasting algorithm is approximate and can miss intersections sometimes. This usually results in visual artifacts along the silhouette edges of relief, which look like staircases.&lt;br /&gt;
&lt;br /&gt;
===== Displacement =====&lt;br /&gt;
&lt;br /&gt;
These parameters controls how many iterations are performed:&lt;br /&gt;
&lt;br /&gt;
* linearSteps {integer}  (default = 20)&lt;br /&gt;
* refineSteps {integer}  (default = 5)&lt;br /&gt;
&lt;br /&gt;
The first parameter is more important. Increasing it reduces the number of missed intersections, making raycasting more reliable but slower.&lt;br /&gt;
The second parameter makes detected intersections more precise, but does not help with missed intersections.&lt;br /&gt;
&lt;br /&gt;
Normally, you should not touch this, but sometimes you might get away with low values without breakage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Shadows =====&lt;br /&gt;
&lt;br /&gt;
The self-shadows of parallax-mapped surface are rendered with special algorithm which involves raycasting again =)&lt;br /&gt;
This is how many linear iterations are performed when searching for shadow ray intersections:&lt;br /&gt;
&lt;br /&gt;
 * shadowSteps {integer}  (default = 20)&lt;br /&gt;
&lt;br /&gt;
As usual, increasing it makes self-shadows more reliable but decreases performance.&lt;br /&gt;
If the number of shadow steps gets too low, then penumbra will become dithered, which can be annoying.&lt;br /&gt;
&lt;br /&gt;
Setting shadowSteps = 0 completely disables self-shadows.&lt;br /&gt;
&lt;br /&gt;
The following parameters defines how soft self-shadows are:&lt;br /&gt;
&lt;br /&gt;
 * shadowSoftness {expression}  (default = ?)&lt;br /&gt;
&lt;br /&gt;
The default value is computed automatically from other parameters, and is around 0.005 if all the other parameters are at defaults.&lt;br /&gt;
Increasing softness can also help hide dithering from low shadowSteps.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Caveats ===&lt;br /&gt;
&lt;br /&gt;
The edges of parallax-mapped material usually look weird, especially when you more camera around.&lt;br /&gt;
You can occlude the edges from the viewer with some other geometry. Or you can create such a heightmap which makes zero displacement on the edges.&lt;br /&gt;
&lt;br /&gt;
As of now, parallax mapping only works on interactions, it does not affect the ambient stages of a material.&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=TDM_Script_Reference&amp;diff=33666</id>
		<title>TDM Script Reference</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=TDM_Script_Reference&amp;diff=33666"/>
		<updated>2025-01-01T19:36:07Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: Regenerated script reference before 2.13 beta.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page has been generated automatically by the tdm_gen_script_event_doc console command.&lt;br /&gt;
&lt;br /&gt;
Generated by The Dark Mod 2.13, code revision 10920, last update: 2025-01-01 19:39&lt;br /&gt;
&lt;br /&gt;
{{tdm-scripting-reference-intro}}&lt;br /&gt;
&amp;lt;div class=&amp;quot;toclimit-4&amp;quot;&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
= TDM Script Event Reference =&lt;br /&gt;
&lt;br /&gt;
== All Events ==&lt;br /&gt;
=== Alphabetic List ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;accelSound&#039;&#039;&#039;(string sound); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the sound to be played when the mover accelerates.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;accelTime&#039;&#039;&#039;(float time); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the acceleration time. Set this acceleration time before initiating a new move.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;accelTo&#039;&#039;&#039;(float speed, float time); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates an acceleration to the given speed over the given time in seconds.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;acos&#039;&#039;&#039;(float cosine); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the angle in degrees with the given cosine.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CTarget_AddObjectives&#039;&#039;, &#039;&#039;CTarget_CallScriptFunction&#039;&#039;, &#039;&#039;CTarget_ChangeEntityRelation&#039;&#039;, &#039;&#039;CTarget_ChangeLockState&#039;&#039;, &#039;&#039;CTarget_ChangeTarget&#039;&#039;, &#039;&#039;CTarget_InterMissionTrigger&#039;&#039;, &#039;&#039;CTarget_ItemRemove&#039;&#039;, &#039;&#039;CTarget_SetEntityRelation&#039;&#039;, &#039;&#039;CTarget_SetFrobable&#039;&#039;, &#039;&#039;CTarget_SetObjectiveComponentState&#039;&#039;, &#039;&#039;CTarget_SetObjectiveState&#039;&#039;, &#039;&#039;CTarget_SetObjectiveVisibility&#039;&#039;, &#039;&#039;CTarget_SetRelations&#039;&#039;, &#039;&#039;CTarget_SetTeam&#039;&#039;, &#039;&#039;CTarget_StartConversation&#039;&#039;, &#039;&#039;idAFEntity_Generic&#039;&#039;, &#039;&#039;idAFEntity_WithAttachedHead&#039;&#039;, &#039;&#039;idAI&#039;&#039;, &#039;&#039;idActivator&#039;&#039;, &#039;&#039;idAnimated&#039;&#039;, &#039;&#039;idBeam&#039;&#039;, &#039;&#039;idBrittleFracture&#039;&#039;, &#039;&#039;idCameraAnim&#039;&#039;, &#039;&#039;idCameraView&#039;&#039;, &#039;&#039;idCombatNode&#039;&#039;, &#039;&#039;idDamagable&#039;&#039;, &#039;&#039;idEarthQuake&#039;&#039;, &#039;&#039;idEntityFx&#039;&#039;, &#039;&#039;idExplodable&#039;&#039;, &#039;&#039;idForceField&#039;&#039;, &#039;&#039;idFuncAASObstacle&#039;&#039;, &#039;&#039;idFuncAASPortal&#039;&#039;, &#039;&#039;idFuncPortal&#039;&#039;, &#039;&#039;idFuncSmoke&#039;&#039;, &#039;&#039;idItem&#039;&#039;, &#039;&#039;idLight&#039;&#039;, &#039;&#039;idListener&#039;&#039;, &#039;&#039;idMoveable&#039;&#039;, &#039;&#039;idMover&#039;&#039;, &#039;&#039;idMover_Binary&#039;&#039;, &#039;&#039;idPhantomObjects&#039;&#039;, &#039;&#039;idPlayerStart&#039;&#039;, &#039;&#039;idPortalSky&#039;&#039;, &#039;&#039;idRiser&#039;&#039;, &#039;&#039;idRotater&#039;&#039;, &#039;&#039;idShaking&#039;&#039;, &#039;&#039;idSound&#039;&#039;, &#039;&#039;idStaticEntity&#039;&#039;, &#039;&#039;idTarget_CallObjectFunction&#039;&#039;, &#039;&#039;idTarget_Damage&#039;&#039;, &#039;&#039;idTarget_EnableLevelWeapons&#039;&#039;, &#039;&#039;idTarget_EndLevel&#039;&#039;, &#039;&#039;idTarget_FadeEntity&#039;&#039;, &#039;&#039;idTarget_FadeSoundClass&#039;&#039;, &#039;&#039;idTarget_Give&#039;&#039;, &#039;&#039;idTarget_LightFadeIn&#039;&#039;, &#039;&#039;idTarget_LightFadeOut&#039;&#039;, &#039;&#039;idTarget_PostScriptEvent&#039;&#039;, &#039;&#039;idTarget_Remove&#039;&#039;, &#039;&#039;idTarget_RemoveWeapons&#039;&#039;, &#039;&#039;idTarget_SessionCommand&#039;&#039;, &#039;&#039;idTarget_SetFov&#039;&#039;, &#039;&#039;idTarget_SetGlobalShaderTime&#039;&#039;, &#039;&#039;idTarget_SetInfluence&#039;&#039;, &#039;&#039;idTarget_SetKeyVal&#039;&#039;, &#039;&#039;idTarget_SetModel&#039;&#039;, &#039;&#039;idTarget_SetShaderParm&#039;&#039;, &#039;&#039;idTarget_SetShaderTime&#039;&#039;, &#039;&#039;idTarget_Show&#039;&#039;, &#039;&#039;idTarget_WaitForButton&#039;&#039;, &#039;&#039;idTrigger_Count&#039;&#039;, &#039;&#039;idTrigger_EntityName&#039;&#039;, &#039;&#039;idTrigger_Fade&#039;&#039;, &#039;&#039;idTrigger_Hurt&#039;&#039;, &#039;&#039;idTrigger_Multi&#039;&#039;, &#039;&#039;idTrigger_Timer&#039;&#039;, &#039;&#039;idTrigger_Touch&#039;&#039;, &#039;&#039;idVacuumSeparatorEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activateContacts&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Activate objects sitting on this object.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activateTargets&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Causes this entity to activate all it&#039;s targets. Similar to how a trigger activates entities.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;addDescendant&#039;&#039;&#039;(entity vine); ====&lt;br /&gt;
&lt;br /&gt;
:Event called using vine.*()&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;tdmVine&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;addFrobPeer&#039;&#039;&#039;(entity peer); ====&lt;br /&gt;
&lt;br /&gt;
:Adds the passed entity as a frob peer.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;addInvItem&#039;&#039;&#039;(entity inv_item); ====&lt;br /&gt;
&lt;br /&gt;
:Adds the given item to the inventory. Depending on the type the passed entity will be removed from the game (as for loot items) or hidden.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;addItemToInv&#039;&#039;&#039;(entity target); ====&lt;br /&gt;
&lt;br /&gt;
:Adds the entity to the given entity&#039;s inventory. Depending on the type the entity will be removed from the game (as for loot items) or hidden. Example: $book-&amp;gt;addItemToInv($player1);&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;addTarget&#039;&#039;&#039;(entity target); ====&lt;br /&gt;
&lt;br /&gt;
:Add a target to this entity.&lt;br /&gt;
::&#039;&#039;target&#039;&#039;: the entity to add as target&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;addToClip&#039;&#039;&#039;(float amount); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;alert&#039;&#039;&#039;(string type, float val); ====&lt;br /&gt;
&lt;br /&gt;
:ai generalized alerts&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;alertAI&#039;&#039;&#039;(string type, float amount, entity actor); ====&lt;br /&gt;
&lt;br /&gt;
:internal&lt;br /&gt;
::&#039;&#039;type&#039;&#039;: alert type&lt;br /&gt;
::&#039;&#039;amount&#039;&#039;: alert amount&lt;br /&gt;
::&#039;&#039;actor&#039;&#039;: actor causing alert&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;allowDamage&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:The AI can take damage again.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;allowDrop&#039;&#039;&#039;(float allow); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;allowHiddenMovement&#039;&#039;&#039;(float enable); ====&lt;br /&gt;
&lt;br /&gt;
:Normally, when hidden, monsters do not run physics. This enables physics when hidden.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;allowMovement&#039;&#039;&#039;(float allow); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;ammoAvailable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Number of shots left in inventory&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;ammoInClip&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;angRotate&#039;&#039;&#039;(vector angles1, vector angles2); ====&lt;br /&gt;
&lt;br /&gt;
:Rotates the given Euler angles by each other.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;angToForward&#039;&#039;&#039;(vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a forward vector for the given Euler angles.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;angToRight&#039;&#039;&#039;(vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a right vector for the given Euler angles.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;angToUp&#039;&#039;&#039;(vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Returns an up vector for the given Euler angles.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;animDistance&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the distance that the anim travels. If the entity has multiple anims with animName, the distance may not match the anim that is played. Use chooseAnim to get a non-random anim and pass that string into animDistance.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;animDone&#039;&#039;&#039;(float channel, float blendOutFrames); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the animation playing on the given channel is completed considering a number of blend frames.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;, &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;animIsPaused&#039;&#039;&#039;(float channel); ====&lt;br /&gt;
&lt;br /&gt;
:Return whether the given anim channel is paused&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;, &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;animLength&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the length of the anim in seconds. If the entity has multiple anims with animName, length may not match the anim that is played. Use chooseAnim to get a non-random anim and pass that string into animLength.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;animState&#039;&#039;&#039;(float channel, string stateFunction, float blendFrame); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a new animation state script function for the given channel.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;animTurn&#039;&#039;&#039;(float angle); ====&lt;br /&gt;
&lt;br /&gt;
:Enable/disable animation controlled turning.&lt;br /&gt;
::&#039;&#039;angle&#039;&#039;: Pass in the maximum # of degrees the animation turns. Use an amount of 0 to disable.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;applyImpulse&#039;&#039;&#039;(entity source, float bodyid, vector point, vector impulse); ====&lt;br /&gt;
&lt;br /&gt;
:Applies an impulse to the entity. Example: entity.applyImpulse($player1, 0, entity.getOrigin(), &#039;0 0 2&#039;);&lt;br /&gt;
::&#039;&#039;source&#039;&#039;: Pass $null_entity or the entity that applies the impulse&lt;br /&gt;
::&#039;&#039;bodyid&#039;&#039;: For articulated figures, ID of the body, 0 for the first (main) body. Otherwise use 0.&lt;br /&gt;
::&#039;&#039;point&#039;&#039;: Point on the body where the impulse is applied to&lt;br /&gt;
::&#039;&#039;impulse&#039;&#039;: Vector of the impulse&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;asin&#039;&#039;&#039;(float sine); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the angle in degrees with the given sine.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;assert&#039;&#039;&#039;(float condition); ====&lt;br /&gt;
&lt;br /&gt;
:Breaks if the condition is zero. (Only works in debug builds.)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;attach&#039;&#039;&#039;(entity ent, string attName); ====&lt;br /&gt;
&lt;br /&gt;
:Attach an entity to the AI. Entity spawnArgs checked for attachments are:  - &amp;quot;origin&amp;quot;, &amp;quot;angles&amp;quot;, and &amp;quot;joint&amp;quot;. These must be set prior to calling attach.&lt;br /&gt;
::&#039;&#039;attName&#039;&#039;: the desired name of the attachment, e.g., &#039;melee_weapon&#039;&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;attachToPos&#039;&#039;&#039;(entity ent, string position, string attName); ====&lt;br /&gt;
&lt;br /&gt;
:Attach an entity to the AI, using a named attachment position&lt;br /&gt;
::&#039;&#039;attName&#039;&#039;: the desired name of the attachment, e.g., &#039;melee_weapon&#039;&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;attack&#039;&#039;&#039;(entity enemy, float ignoreCollisions); ====&lt;br /&gt;
&lt;br /&gt;
:Direct the turret to manually attack the specified entity. Use disableManualAttack() to disable.&lt;br /&gt;
::&#039;&#039;enemy&#039;&#039;: enemy to attack&lt;br /&gt;
::&#039;&#039;ignoreCollisions&#039;&#039;: whether to ignore obstacles in the way to the enemy when planning to attack&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idTurret&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;attackBegin&#039;&#039;&#039;(string damageDef); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;attackEnd&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;attackMelee&#039;&#039;&#039;(string damageDef); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the attack hit&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;attackMissile&#039;&#039;&#039;(string jointName); ====&lt;br /&gt;
&lt;br /&gt;
:returns projectile fired&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;attackPosition&#039;&#039;&#039;(vector targetPos, float ignoreCollisions); ====&lt;br /&gt;
&lt;br /&gt;
:Direct the turret to manually attack a position. Use disableManualAttack() to disable.&lt;br /&gt;
::&#039;&#039;targetPos&#039;&#039;: position to attack&lt;br /&gt;
::&#039;&#039;ignoreCollisions&#039;&#039;: whether to ignore obstacles in the way to the target position when planning to attack. Recommended true for this event.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idTurret&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;bark&#039;&#039;&#039;(string sound); ====&lt;br /&gt;
&lt;br /&gt;
:Let the AI bark a certain sound.&lt;br /&gt;
::&#039;&#039;sound&#039;&#039;: sound name, e.g. &#039;snd_warn_response&#039;&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;becomeNonSolid&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Makes the moveable non-solid for other entities.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;, &#039;&#039;idMoveable&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;becomeRagdoll&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:enables the ragdoll if the entity has one&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;becomeSolid&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;bind&#039;&#039;&#039;(entity master); ====&lt;br /&gt;
&lt;br /&gt;
:Fixes this entity&#039;s position and orientation relative to another entity, such that when the master entity moves, so does this entity.&lt;br /&gt;
::&#039;&#039;master&#039;&#039;: the entity to bind to&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;bindPosition&#039;&#039;&#039;(entity master); ====&lt;br /&gt;
&lt;br /&gt;
:Fixes this entity&#039;s position (but not orientation) relative to another entity, such that when the master entity moves, so does this entity.&lt;br /&gt;
::&#039;&#039;master&#039;&#039;: the entity to bind to&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;bindToBody&#039;&#039;&#039;(entity master, float bodyID, float orientated); ====&lt;br /&gt;
&lt;br /&gt;
:Bind to AF body&lt;br /&gt;
::&#039;&#039;master&#039;&#039;: entity to bind to&lt;br /&gt;
::&#039;&#039;bodyID&#039;&#039;: AF body ID to bind to&lt;br /&gt;
::&#039;&#039;orientated&#039;&#039;: binds the orientation as well as position, if set to 1&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;bindToJoint&#039;&#039;&#039;(entity master, string boneName, float rotateWithMaster); ====&lt;br /&gt;
&lt;br /&gt;
:Fixes this entity&#039;s position and orientation relative to a bone on another entity, such that when the master&#039;s bone moves, so does this entity.&lt;br /&gt;
::&#039;&#039;master&#039;&#039;: the entity to bind to&lt;br /&gt;
::&#039;&#039;boneName&#039;&#039;: the bone name&lt;br /&gt;
::&#039;&#039;rotateWithMaster&#039;&#039;: -&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;bob&#039;&#039;&#039;(float speed, float phase, vector distance); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a translation back and forth along the given vector with the given speed and phase.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;burn&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;cacheSoundShader&#039;&#039;&#039;(string shaderName); ====&lt;br /&gt;
&lt;br /&gt;
:Ensure the specified sound shader is loaded by the system. Prevents cache misses when playing sound shaders.&lt;br /&gt;
::&#039;&#039;shaderName&#039;&#039;: the sound shader to cache&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;, &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;callFunction&#039;&#039;&#039;(string functionName); ====&lt;br /&gt;
&lt;br /&gt;
:Calls a function on an entity&#039;s script object. See also callGlobalFunction().&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;callFunctionsByWildcard&#039;&#039;&#039;(string functionName); ====&lt;br /&gt;
&lt;br /&gt;
:Calls global functions with names matching the specified wildcard in separate threads (in lexicographical order). INTERNAL: don&#039;t use in mission scripting!&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;callGlobalFunction&#039;&#039;&#039;(string functionName, entity other); ====&lt;br /&gt;
&lt;br /&gt;
:calls a global function and passes the other entity along as the first argument calls the function in a new thread, so it continues executing in the current thread right away (unlike entity.callFunction( &amp;quot;blah&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;callGui&#039;&#039;&#039;(float handle, string namedEvent); ====&lt;br /&gt;
&lt;br /&gt;
:Calls a named event in a GUI.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canBecomeSolid&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canBeUsedBy&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the entity can be used by the argument entity&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canHitEnemy&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canHitEnemyFromAnim&#039;&#039;&#039;(string anim); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canHitEnemyFromJoint&#039;&#039;&#039;(string jointname); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canPlant&#039;&#039;&#039;(vector traceStart, vector traceEnd, entity ignore, entity vine); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canReachEnemy&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if character can walk to enemy&#039;s position. For walking monsters, enemy should be near the floor.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canReachEntity&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if character can walk to entity&#039;s position. For walking monsters, entity should be near the floor.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canReachPosition&#039;&#039;&#039;(vector pos); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if character can walk to specified position. For walking monsters, position should be near the floor.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canSee&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;, &#039;&#039;idSecurityCamera&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canSeeEntity&#039;&#039;&#039;(entity target, float useLighting); ====&lt;br /&gt;
&lt;br /&gt;
:This is a general version of idAI::canSee, that can be used by all entities. It doesn&#039;t regard FOV, it just performs a trace to check whether the target is occluded by world geometry. Is probably useful for stim/response as well Pass useLighting = true to take the lighting of the target entity into account. Use &amp;quot;isEntityHidden&amp;quot; as a script event with a threshold. The constant threshold value for useLighting is defined within the SDK in game/entity.h.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canSeeExt&#039;&#039;&#039;(entity ent, float b_useFOV, float b_useLighting); ====&lt;br /&gt;
&lt;br /&gt;
:This is an alternate version of canSee that can optionally choose to use field of vision and lighting calculations.&lt;br /&gt;
::&#039;&#039;b_useFOV&#039;&#039;: If 0 the entity will be visible even if the AI&#039;s back is turned to it&lt;br /&gt;
::&#039;&#039;b_useLighting&#039;&#039;: If b_useLighting is 0 the entity will be visible in complete darkness. If it is 1, the entity will only be visible if there is light shining on it, but the slightest light is enought. Use &amp;quot;isEntityHidden&amp;quot; as a script event with a threshold instead.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canSeePositionExt&#039;&#039;&#039;(vector position, float b_useFOV, float b_useLighting); ====&lt;br /&gt;
&lt;br /&gt;
:This is an alternate version of canSeeExt that tests a location rather than an entity. Note that any actor at the position may make it not seeable from a distance.&lt;br /&gt;
::&#039;&#039;b_useFOV&#039;&#039;: If 0 the entity will be visible even if the AI&#039;s back is turned to it&lt;br /&gt;
::&#039;&#039;b_useLighting&#039;&#039;: If 0 the entity will be visible in complete darkness&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canWater&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Event called using vine.*()&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;tdmVine&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;ceil&#039;&#039;&#039;(float x); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the smallest integer that is greater than or equal to the given value.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;changeEntityRelation&#039;&#039;&#039;(entity ent, float relationChange); ====&lt;br /&gt;
&lt;br /&gt;
:This changes the current relation to an entity by adding the new amount.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;changeInvIcon&#039;&#039;&#039;(string name, string category, string icon); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the inventory icon of the given item in the given category to &amp;lt;icon&amp;gt;.&lt;br /&gt;
::&#039;&#039;name&#039;&#039;: name of the item&lt;br /&gt;
::&#039;&#039;category&#039;&#039;: the item&#039;s category&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;changeInvItemCount&#039;&#039;&#039;(string name, string category, float amount); ====&lt;br /&gt;
&lt;br /&gt;
:Decreases the inventory item stack count by amount. The item is addressed using the name and category of the item. These are usually defined on the inventory item entity (&amp;quot;inv_name&amp;quot;, &amp;quot;inv_category&amp;quot;)  Amount can be both negative and positive.&lt;br /&gt;
::&#039;&#039;name&#039;&#039;: name of the item&lt;br /&gt;
::&#039;&#039;category&#039;&#039;: the item&#039;s category&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;changeInvLightgemModifier&#039;&#039;&#039;(string name, string category, float amount); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the lightgem modifier value of the given item. Valid arguments are between 0 and 32 (which is the maximum lightgem value).&lt;br /&gt;
::&#039;&#039;name&#039;&#039;: name of the item&lt;br /&gt;
::&#039;&#039;category&#039;&#039;: the item&#039;s category&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;changeLootAmount&#039;&#039;&#039;(float type, float amount); ====&lt;br /&gt;
&lt;br /&gt;
:Changes the loot amount of the given Type (e.g. GOODS) by &amp;lt;amount&amp;gt;.  The mission statisic for loot found gets changed too.  The new value of the changed type is returned (e.g. the new GOODS value if this has been changed).  Note: The LOOT_TOTAL type can&#039;t be changed and 0 is returned.&lt;br /&gt;
::&#039;&#039;type&#039;&#039;: one of: LOOT_GOLD, LOOT_GOODS, LOOT_JEWELRY&lt;br /&gt;
::&#039;&#039;amount&#039;&#039;: can be negative&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;changeWeaponName&#039;&#039;&#039;(string weaponName, string displayName); ====&lt;br /&gt;
&lt;br /&gt;
:Changes the display name of the given weapon item to something different. Pass an empty string to reset the display name to the definition as found in the weaponDef.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;changeWeaponProjectile&#039;&#039;&#039;(string weaponName, string projectileDefName); ====&lt;br /&gt;
&lt;br /&gt;
:Changes the projectile entityDef name of the given weapon (e.g. &amp;quot;broadhead&amp;quot;) to the specified entityDef (e.g. &amp;quot;atdm:projectile_broadhead&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;chargeAttack&#039;&#039;&#039;(string damageDef); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;checkAAS&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;checkAbsence&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:description missing&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;checkAnim&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Ensures that the animation exists and causes an error if it doesn&#039;t.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;chooseAnim&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Chooses a random anim and returns the name. Useful for doing move tests on anims.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearActiveInventoryMap&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Clear the active inventory map entity&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearActiveInventoryMapEnt&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Clear the active inventory map entity&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearAllJoints&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Removes any custom transforms on all joints.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAnimatedEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearBurn&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearController&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Need separate clearController because scripting doesn&#039;t like passing in $null_entity? (greebo: one could remove this function and set the argument type of setController to &#039;E&#039;.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CAIVehicle&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearEnemy&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Clears the enemy entity&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearFlyOffset&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the preferred height relative to the player&#039;s view height to fly at to the value set in the def file.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearJoint&#039;&#039;&#039;(float jointnum); ====&lt;br /&gt;
&lt;br /&gt;
:Removes any custom transforms on the specified joint.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAnimatedEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearMouseDeadTime&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearPersistentArgs&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Clears data that persists between maps.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearSignal&#039;&#039;&#039;(float signalNum); ====&lt;br /&gt;
&lt;br /&gt;
:Disables the callback function on the specified signal.&lt;br /&gt;
::&#039;&#039;signalNum&#039;&#039;: signal number&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearSignalThread&#039;&#039;&#039;(float signalNum, entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:Clears the script callback function set for when the given signal is raised on the given entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearWatered&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Event called using vine.*()&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;tdmVine&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;clipSize&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Close&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Closes the frobmover, regardless of its previous state. Mover must be open, otherwise nothing happens.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CBinaryFrobMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;closePortal&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Closes the renderer portal associated with this mover.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;, &#039;&#039;idMover_Binary&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;closestEnemyToPoint&#039;&#039;&#039;(vector point); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the enemy closest to the given location.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;closestReachableEnemy&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Used for determining tactile alert targets&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;closestReachableEnemyOfEntity&#039;&#039;&#039;(entity team_mate); ====&lt;br /&gt;
&lt;br /&gt;
:Finds another character&#039;s closest reachable enemy&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;copyBind&#039;&#039;&#039;(entity other); ====&lt;br /&gt;
&lt;br /&gt;
:copy bind information of other to this entity (i.e., bind this entity to the same entity that other is bound to)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;copySpawnArgs&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:copies the spawn args from an entity&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;cos&#039;&#039;&#039;(float degrees); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the cosine of the given angle in degrees.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;createMissile&#039;&#039;&#039;(string jointname); ====&lt;br /&gt;
&lt;br /&gt;
:returns projectile created&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;createMissileFromDef&#039;&#039;&#039;(string defName, string jointName); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;createOverlay&#039;&#039;&#039;(string guiFile, float layer); ====&lt;br /&gt;
&lt;br /&gt;
:Creates a GUI overlay. (must be used on the player)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;createProjectile&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;CreateTimer&#039;&#039;&#039;(float stimId, float hour, float minutes, float seconds, float milliseconds); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;CrossProduct&#039;&#039;&#039;(vector vec1, vector vec2); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the cross product of the two vectors.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;cullAll&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Cull (remove from world) all entities.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;Seed&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;customDeath&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;damage&#039;&#039;&#039;(entity inflictor, entity attacker, vector dir, string damageDefName, float damageScale); ====&lt;br /&gt;
&lt;br /&gt;
:Deals damage to this entity (gets translated into the idEntity::Damage() method within the SDK).&lt;br /&gt;
::&#039;&#039;inflictor&#039;&#039;: the entity causing the damage (maybe a projectile)&lt;br /&gt;
::&#039;&#039;attacker&#039;&#039;: the &amp;quot;parent&amp;quot; entity of the inflictor, the one that is responsible for the inflictor (can be the same)&lt;br /&gt;
::&#039;&#039;dir&#039;&#039;: the direction the attack is coming from.&lt;br /&gt;
::&#039;&#039;damageDefName&#039;&#039;: the name of the damage entityDef to know what damage is being dealt to &amp;lt;self&amp;gt; (e.g. &amp;quot;damage_lava&amp;quot;)&lt;br /&gt;
::&#039;&#039;damageScale&#039;&#039;: the scale of the damage (pass 1.0 as default, this should be ok).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;dampenSound&#039;&#039;&#039;(float dampen); ====&lt;br /&gt;
&lt;br /&gt;
:Toggle whether the shattering sound is dampened on the window, e.g., when covered by moss.&lt;br /&gt;
::&#039;&#039;dampen&#039;&#039;: 1 = dampened, 0 = not dampened&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idBrittleFracture&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;deathMenu&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;debugArrow&#039;&#039;&#039;(vector color, vector start, vector end, float size, float lifetime); ====&lt;br /&gt;
&lt;br /&gt;
:line drawing for debug visualization.  lifetime of 0 == 1 frame.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;debugBounds&#039;&#039;&#039;(vector color, vector mins, vector maxs, float lifetime); ====&lt;br /&gt;
&lt;br /&gt;
:line drawing for debug visualization.  lifetime of 0 == 1 frame.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;debugCircle&#039;&#039;&#039;(vector color, vector origin, vector dir, float radius, float numSteps, float lifetime); ====&lt;br /&gt;
&lt;br /&gt;
:line drawing for debug visualization.  lifetime of 0 == 1 frame.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;debugLine&#039;&#039;&#039;(vector color, vector start, vector end, float lifetime); ====&lt;br /&gt;
&lt;br /&gt;
:line drawing for debug visualization.  lifetime of 0 == 1 frame.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;decelSound&#039;&#039;&#039;(string sound); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the sound to be played when the mover decelerates.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;decelTime&#039;&#039;&#039;(float time); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the deceleration time. Set this deceleration time before initiating a new move.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;decelTo&#039;&#039;&#039;(float speed, float time); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a deceleration to the given speed over the given time in seconds.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;destroyOverlay&#039;&#039;&#039;(float handle); ====&lt;br /&gt;
&lt;br /&gt;
:Destroys a GUI overlay. (must be used on the player)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;directDamage&#039;&#039;&#039;(entity damageTarget, string damageDef); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Disables the mover/trigger&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;Seed&#039;&#039;, &#039;&#039;idMover_Binary&#039;&#039;, &#039;&#039;idTrigger&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disableAFPush&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disableAnimchannel&#039;&#039;&#039;(float channel); ====&lt;br /&gt;
&lt;br /&gt;
:Used to disable a certain animchannel (for example if the ai is dead)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disableClip&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disableEyeFocus&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Disables eye focus.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disableGravity&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;DisableLegIK&#039;&#039;&#039;(float num); ====&lt;br /&gt;
&lt;br /&gt;
:disables leg IK&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disableManualAttack&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Stop attacking the manually specified enemy or position and return to automatic target acquisition mode.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idTurret&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disablePain&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Disables pain animations.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disableSplineAngles&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Disables aligning the mover with the spline direction.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;DisableWalkIK&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:disables walk IK&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disableWeapon&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Lowers and disables the player weapon.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;distanceTo&#039;&#039;&#039;(entity other); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the distance of this entity to another entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;distanceToPoint&#039;&#039;&#039;(vector point); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the distance of this entity to a point.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;DotProduct&#039;&#039;&#039;(vector vec1, vector vec2); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the dot product of the two vectors.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;drawText&#039;&#039;&#039;(string text, vector origin, float scale, vector color, float align, float lifetime); ====&lt;br /&gt;
&lt;br /&gt;
:text drawing for debugging. lifetime of 0 == 1 frame.&lt;br /&gt;
::&#039;&#039;align&#039;&#039;: 0 = left, 1 = center, 2 = right&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;dropAttachment&#039;&#039;&#039;(string attName); ====&lt;br /&gt;
&lt;br /&gt;
:Drop the attachment for the given attachment name.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;dropAttachmentInd&#039;&#039;&#039;(float index); ====&lt;br /&gt;
&lt;br /&gt;
:Drop the attachment for the given index.&lt;br /&gt;
::&#039;&#039;index&#039;&#039;: starts at 0&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;dropTorch&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ejectBrass&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;emitParticle&#039;&#039;&#039;(string particle, float startTime, float diversity, vector origin, vector angle); ====&lt;br /&gt;
&lt;br /&gt;
:Start a particle effect in the world without using an entity emitter. Will emit one quad per particle stage when first called with sys.getTime() as the start time. Designed to be called once per frame with the same startTime each call to achieve a normal particle effect, or on demand with sys.getTime() as the startTime for finer grained control, 1 quad at a time. Returns True (1) if there are more particles to be emitted from the stage, False (0) if the stage has released all its quads.&lt;br /&gt;
::&#039;&#039;particle&#039;&#039;: String: name of particle effect.&lt;br /&gt;
::&#039;&#039;startTime&#039;&#039;: Game seconds since map start: use sys.getTime() for the first call unless you want to back-date the particle so that it starts part way through its cycle.&lt;br /&gt;
::&#039;&#039;diversity&#039;&#039;: Randomizer value between 0 and 1. All particles with the same diversity will have the same path and rotation. Use sys.random(1) for a random path.&lt;br /&gt;
::&#039;&#039;origin&#039;&#039;: Origin of the particle effect.&lt;br /&gt;
::&#039;&#039;angle&#039;&#039;: Axis for the particle effect. Use $&amp;lt;entityname&amp;gt;.getAngles() to align the particle to an entity. use &#039;0 0 0&#039; for an upright (world-aligned) particle effect.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;emitterAddModel&#039;&#039;&#039;(string modelName, vector modelOffset); ====&lt;br /&gt;
&lt;br /&gt;
:Adds a new particle (or regular, if you wish) model to the emitter, located at modelOffset units away from the emitter&#039;s origin.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idFuncEmitter&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;emitterGetNumModels&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of models/particles this emitter has. Always &amp;gt;= 1.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idFuncEmitter&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;emptyHand&#039;&#039;&#039;(string hand); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Enables the mover/trigger&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;Seed&#039;&#039;, &#039;&#039;idMover_Binary&#039;&#039;, &#039;&#039;idTrigger&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enableAFPush&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enableAnim&#039;&#039;&#039;(float channel, float blendFrames); ====&lt;br /&gt;
&lt;br /&gt;
:Enables animation on the given channel.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enableClip&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enableDamage&#039;&#039;&#039;(float enable); ====&lt;br /&gt;
&lt;br /&gt;
:enable/disable damage&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMoveable&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enableEyeFocus&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Enables eye focus.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enableGravity&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;EnableLegIK&#039;&#039;&#039;(float num); ====&lt;br /&gt;
&lt;br /&gt;
:enables leg IK&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enablePain&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Enables pain animations.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enableSplineAngles&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Enables aligning the mover with the spline direction.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;EnableWalkIK&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:enables walk IK&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enableWeapon&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Enables the player weapon.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;endState&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Ends the current state with the given name, returns TRUE if more than one state is remaining.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;endZoom&#039;&#039;&#039;(float duration); ====&lt;br /&gt;
&lt;br /&gt;
:Starts the zoom out event, which performs a gradual transition back to the default FOV. May be called during a transition as well to intercept a pending zoom in transition.&lt;br /&gt;
::&#039;&#039;duration&#039;&#039;: duration of the transition in msec&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;enemyInCombatCone&#039;&#039;&#039;(entity combatNode, float use_current_enemy_location); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;enemyPositionValid&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;enemyRange&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;enemyRange2D&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;entityInAttackCone&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;error&#039;&#039;&#039;(string text); ====&lt;br /&gt;
&lt;br /&gt;
:Issues an error.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;exitTeleporter&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;extinguishLights&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Extinguishes all lights (i.e. the &amp;lt;self&amp;gt; entity plus all bound lights)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;faceEnemy&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;faceEntity&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;facingIdeal&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;fadeIn&#039;&#039;&#039;(vector color, float time); ====&lt;br /&gt;
&lt;br /&gt;
:Fades towards the given color over the given time in seconds.&lt;br /&gt;
::&#039;&#039;time&#039;&#039;: in seconds&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;fadeInLight&#039;&#039;&#039;(float time); ====&lt;br /&gt;
&lt;br /&gt;
:Turns the light on over the given time in seconds.&lt;br /&gt;
::&#039;&#039;time&#039;&#039;: in seconds&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idLight&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;fadeOut&#039;&#039;&#039;(vector color, float time); ====&lt;br /&gt;
&lt;br /&gt;
:Fades from the given color over the given time in seconds.&lt;br /&gt;
::&#039;&#039;time&#039;&#039;: in seconds&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;fadeOutLight&#039;&#039;&#039;(float time); ====&lt;br /&gt;
&lt;br /&gt;
:Turns the light out over the given time in seconds.&lt;br /&gt;
::&#039;&#039;time&#039;&#039;: in seconds&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idLight&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;fadeSound&#039;&#039;&#039;(float channel, float newLevel, float fadeTime); ====&lt;br /&gt;
&lt;br /&gt;
:Fades the sound on this entity to a new level over a period of time.  Use SND_CHANNEL_ANY for all currently playing sounds.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;fadeTo&#039;&#039;&#039;(vector color, float alpha, float time); ====&lt;br /&gt;
&lt;br /&gt;
:Fades to the given color up to the given alpha over the given time in seconds.&lt;br /&gt;
::&#039;&#039;time&#039;&#039;: in seconds&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;fadeToLight&#039;&#039;&#039;(vector color, float time); ====&lt;br /&gt;
&lt;br /&gt;
:Fades the light to the given color over a given time.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idLight&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;findActorsInBounds&#039;&#039;&#039;(vector mins, vector maxs); ====&lt;br /&gt;
&lt;br /&gt;
:Returns an entity within the bounds specified&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;findEnemy&#039;&#039;&#039;(float onlyInFov); ====&lt;br /&gt;
&lt;br /&gt;
:Finds enemy player in PVS&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;findEnemyAI&#039;&#039;&#039;(float onlyInFov); ====&lt;br /&gt;
&lt;br /&gt;
:Finds enemy monster in PVS&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;findEnemyInCombatNodes&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Finds enemy player in attack cones&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;findFriendlyAI&#039;&#039;&#039;(float team); ====&lt;br /&gt;
&lt;br /&gt;
:Use this to find a visible AI friendly to ourselves. It basically iterates over all active entities in the map and looks for friendly actors. The pythagorean distance is taken to evaluate the distance.  Don&#039;t call this every frame, this might get expensive in larger maps. Returns the nearest visible actor entity or the $null_entity, if none was found.&lt;br /&gt;
::&#039;&#039;team&#039;&#039;: used to constrain the search to a given team. Set this to -1 to let the code ignore this argument&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;finishAction&#039;&#039;&#039;(string action); ====&lt;br /&gt;
&lt;br /&gt;
:Finishes the given wait action.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;finishChannelAction&#039;&#039;&#039;(float channel, string animname); ====&lt;br /&gt;
&lt;br /&gt;
:Overloaded finishAction function for setting the waitstate on each channel separately&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;fireMissileAtTarget&#039;&#039;&#039;(string jointname, string targetname); ====&lt;br /&gt;
&lt;br /&gt;
:Launches a missile at entity specified by &#039;attack_target&#039;.  returns projectile fired&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;firstPerson&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns view control to the player entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;flashlight&#039;&#039;&#039;(float enable); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;flee&#039;&#039;&#039;(entity entToFleeFrom); ====&lt;br /&gt;
&lt;br /&gt;
:Flee from the given entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;fleeFromPoint&#039;&#039;&#039;(vector pos); ====&lt;br /&gt;
&lt;br /&gt;
:Flee from the given position.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;floor&#039;&#039;&#039;(float x); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the largest integer that is less than or equal to the given value.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;footstep&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Plays footstep sound.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;, &#039;&#039;idAnimated&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;foundBody&#039;&#039;&#039;(entity body); ====&lt;br /&gt;
&lt;br /&gt;
:Objective callback for when an AI finds a body.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;frob&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Frobs the entity (i.e. simulates a frob action performed by the player). Returns TRUE if the entity is frobable, FALSE otherwise.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;frobHilight&#039;&#039;&#039;(float state); ====&lt;br /&gt;
&lt;br /&gt;
:ishtvan: Tries to make the entity frobhilight or not&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;frobRidable&#039;&#039;&#039;(entity playerController); ====&lt;br /&gt;
&lt;br /&gt;
:Called when a player directly mounts or dismounts a ridable AI.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CAIVehicle&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Gas_Knockout&#039;&#039;&#039;(entity inflictor); ====&lt;br /&gt;
&lt;br /&gt;
:AI knockout&lt;br /&gt;
::&#039;&#039;inflictor&#039;&#039;: the entity causing the knockout, can be the $null_entity&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getActualStruckEnt&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Getter for projectile result variable&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CProjectileResult&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getAcuity&#039;&#039;&#039;(string type); ====&lt;br /&gt;
&lt;br /&gt;
:ai generalized alerts&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getAlertActor&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get the actor that alerted the AI in this frame.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getAlertLevelOfOtherAI&#039;&#039;&#039;(entity otherEntity); ====&lt;br /&gt;
&lt;br /&gt;
:This event gets the alert number of another AI (AI_AlertLevel variable value) Returns the alert number of the other AI, 0.0 if its not an AI or is NULL&lt;br /&gt;
::&#039;&#039;otherEntity&#039;&#039;: the other AI entity who&#039;s alert number is being queried&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getAngles&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current orientation of this entity (relative to bind parent if any).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getAngularVelocity&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the current angular velocity of this entity. The angular velocity of a physics object is a vector that passes through the center of mass. The direction of this vector defines the axis of rotation and the magnitude defines the rate of rotation about the axis in radians per second.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getAngularVelocityB&#039;&#039;&#039;(float id); ====&lt;br /&gt;
&lt;br /&gt;
:Get the angular velocitiy of a particular body Returns (0,0,0) if the body ID is invalid.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAFEntity_Base&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getAnimList&#039;&#039;&#039;(float channel); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a list of all animations and their anim rates.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getAnimRate&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the rate for the given animation. Returns -1 if animation cannot be found.&lt;br /&gt;
::&#039;&#039;animName&#039;&#039;: The name of the animation.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getAnimState&#039;&#039;&#039;(float channel); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the name of the current animation state script function used for the given channel.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getAttachment&#039;&#039;&#039;(string attName); ====&lt;br /&gt;
&lt;br /&gt;
:Get the attached entity with the given attachment name Will be NULL if the name is invalid or if the entity no longer exists&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getAttachmentInd&#039;&#039;&#039;(float index); ====&lt;br /&gt;
&lt;br /&gt;
:Get the attached entity at the given index. Will be NULL if the index is invalid or the entity no longer exists&lt;br /&gt;
::&#039;&#039;index&#039;&#039;: starts at 0&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getAttacker&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the attacking entity&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getAttackFlag&#039;&#039;&#039;(float combatType); ====&lt;br /&gt;
&lt;br /&gt;
:Returns 1 if the given attack flag is activated.&lt;br /&gt;
::&#039;&#039;combatType&#039;&#039;: see tdm_defs.script for possible enum values&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getAudThresh&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getAxialDir&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Getter for projectile result variable&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CProjectileResult&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getBindChild&#039;&#039;&#039;(float ind); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the ind_th bind child of this entity or NULL if index is invalid. NOTE: indices start at zero&lt;br /&gt;
::&#039;&#039;ind&#039;&#039;: child index&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getBindMaster&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the entity&#039;s bindmaster&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getBlendFrames&#039;&#039;&#039;(float channel); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of frames to blend between animations on the given channel.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;, &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getBoolKey&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Retrieves the boolean value of a specific spawn arg, defaulting to false.&lt;br /&gt;
::&#039;&#039;key&#039;&#039;: spawnarg name&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getButtons&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the button state from the current user command.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getCalibratedLightgemValue&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the calibrated light gem value.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getClipMask&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the clipmask of the physics object.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getClosestHiddenTarget&#039;&#039;&#039;(string entity_type); ====&lt;br /&gt;
&lt;br /&gt;
:Finds the closest targeted entity of the specified type.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getColor&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the color of this entity (shader parms Parm0, Parm1, Parm2).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getCombatNode&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getContents&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the contents of the physics object.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getCurInvCategory&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the name of the currently highlighted inventory category.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getCurInvIcon&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the icon of the currently highlighted inventory item.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getCurInvItemCount&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the item count of the currently highlighted inventory Item, if stackable.Returns - 1 if non - stackable&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getCurInvItemEntity&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the currently highlighted inventory item entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getCurInvItemId&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the name of the currently highlighted inventory item (the one defined in &amp;quot;inv_item_id&amp;quot;). Most items will return an empty string, unless the &amp;quot;inv_item_id&amp;quot; is set on purpose.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getCurInvItemName&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the name of the currently highlighted inventory item (the one defined in &amp;quot;inv_name&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getCurrentMissionNum&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of the current mission (0-based, the first mission has number 0).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getCurrentWeapon&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns weaponX where X is the number of the weapon the player is currently holding.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getCurrentYaw&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getCurWeaponName&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the name of the current weapon, as defined by &amp;quot;inv_weapon_name&amp;quot; in the weaponDef.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getcvar&#039;&#039;&#039;(string name); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the string for a cvar.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getcvarf&#039;&#039;&#039;(string name); ====&lt;br /&gt;
&lt;br /&gt;
:Returns float value for a cvar.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getDifficultyLevel&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns 0 (Easy), 1 (Medium) or 2 (Hard), depending on the difficulty level of the current mission.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getDifficultyName&#039;&#039;&#039;(float difficultyLevel); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the (translated) name of the difficulty level passed as the argument.&lt;br /&gt;
::&#039;&#039;difficultyLevel&#039;&#039;: 0 (Easy), 1 (Medium), 2 (Hard)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;GetDoor&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the associated door entity for this handle.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CFrobDoorHandle&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;GetDoorhandle&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the handle entity of this door. Can return NULL (== $null_entity)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CFrobDoor&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getDragged&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the currently dragged body. Returns $null_entity if the body is shouldered, the player has nothing in his hands, or he has a non-AF entity in his hands. See also getShouldered(), getGrabbed() and getFrobbed().&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getEnemy&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;, &#039;&#039;idSecurityCamera&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getEnemyEyePos&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getEnemyPos&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getEntity&#039;&#039;&#039;(string name); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a reference to the entity with the specified name.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getEntityFlag&#039;&#039;&#039;(string flagName); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the value of the specified entity flag.&lt;br /&gt;
::&#039;&#039;flagName&#039;&#039;: Can be one of (case insensitive): 	notarget: if true never attack or target this entity 	noknockback: if true no knockback from hits 	takedamage: if true this entity can be damaged 	hidden: if true this entity is not visible 	bindOrientated: if true both the master orientation is used for binding 	solidForTeam: if true this entity is considered solid when a physics team mate pushes entities 	forcePhysicsUpdate: if true always update from the physics whether the object moved or not 	selected: if true the entity is selected for editing 	neverDormant: if true the entity never goes dormant 	isDormant: if true the entity is dormant 	hasAwakened: before a monster has been awakened the first time, use full PVS for dormant instead of area-connected 	invisible: if true this entity cannot be seen 	inaudible: if true this entity cannot be heard &lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getEntityKey&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Retrieves the entity specified by the spawn arg.&lt;br /&gt;
::&#039;&#039;key&#039;&#039;: spawnarg name&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getEyePos&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get eye position of the player and the AI&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getFinalAngVel&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Getter for projectile result variable&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CProjectileResult&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getFinalVel&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Getter for projectile result variable&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CProjectileResult&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getFloatKey&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Retrieves the floating point value of a specific spawn arg, defaulting to 0.0f.&lt;br /&gt;
::&#039;&#039;key&#039;&#039;: spawnarg name&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getFov&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:This returns the current FOV of the player. You can modify the current FOV with startZoom() and endZoom().&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;GetFractionalPosition&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a fraction between 0.00 (closed) and 1.00 (open).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CBinaryFrobMover&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getFrameTime&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:returns the length of time between game frames.  this is not related to renderer frame rate.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getFrobbed&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the currently frobhilighted entity. This includes entities the player has in his hands. Sets &amp;quot;frob only used by&amp;quot; mode&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getGrabbed&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the currently entity in the players hands. Returns $null_entity if the player has nothing in his hands Dragging or shouldering a body counts as grabbing it. See also getDragged(), getShouldered(), getFrobbed().&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getGui&#039;&#039;&#039;(float handle); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the file currently loaded by a GUI.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getGuiFloat&#039;&#039;&#039;(float handle, string key); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a GUI parameter.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getGuiInt&#039;&#039;&#039;(float handle, string key); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a GUI parameter.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getGuiString&#039;&#039;&#039;(float handle, string key); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a GUI parameter.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getHead&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the entity used for the character&#039;s head, if it has one.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getHealth&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current health.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getHinderance&#039;&#039;&#039;(string source); ====&lt;br /&gt;
&lt;br /&gt;
:Used to get hinderance from a source.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getIdealWeapon&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getImmobilization&#039;&#039;&#039;(string source); ====&lt;br /&gt;
&lt;br /&gt;
:Used to get immobilization from a source. Warning: Not a finalized version. It&#039;s subject to change, so use it at your own risk.)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getIncidenceAngle&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Getter for projectile result variable&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CProjectileResult&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getInterceptTime&#039;&#039;&#039;(vector velocityTarget, float speedInterceptor, vector positionTarget, vector positionInterceptor); ====&lt;br /&gt;
&lt;br /&gt;
:Returns how much time it will take for an interceptor like a projectile to intercept a moving target at the earliest possible opportunity. Returns 0 if an intercept is not possible or the speed of the target and interceptor are too similar.&lt;br /&gt;
::&#039;&#039;velocityTarget&#039;&#039;: current velocity of target&lt;br /&gt;
::&#039;&#039;speedInterceptor&#039;&#039;: speed of interceptor&lt;br /&gt;
::&#039;&#039;positionTarget&#039;&#039;: current position of target&lt;br /&gt;
::&#039;&#039;positionInterceptor&#039;&#039;: starting position of interceptor&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getIntKey&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Retrieves the integer value of a specific spawn arg, defaulting to 0.&lt;br /&gt;
::&#039;&#039;key&#039;&#039;: spawnarg name&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getInventoryOverlay&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the default inventory overlay for the player. All other entities will return an invalid value.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getJointAngle&#039;&#039;&#039;(float jointnum); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the angular orientation of the joint in world space.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAnimatedEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getJointHandle&#039;&#039;&#039;(string jointname); ====&lt;br /&gt;
&lt;br /&gt;
:Looks up the number of the specified joint. Returns INVALID_JOINT if the joint is not found.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAnimatedEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getJointPos&#039;&#039;&#039;(float jointnum); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the position of the joint in world space.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAnimatedEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getJumpVelocity&#039;&#039;&#039;(vector pos, float speed, float max_jump_height); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getKey&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Retrieves the value of a specific spawn arg, defaulting to &#039;&#039;.&lt;br /&gt;
::&#039;&#039;key&#039;&#039;: spawnarg name&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getLightInPVS&#039;&#039;&#039;(float falloff, float scaling); ====&lt;br /&gt;
&lt;br /&gt;
:Computes the sum of all light in the PVS of the entity you call this on, and returns a vector with the sum.&lt;br /&gt;
::&#039;&#039;falloff&#039;&#039;: 0: no falloff with distance  0.5: sqrt(linear) falloff	(dist 100 =&amp;gt; 1/10)  1: linear falloff			(dist 100 =&amp;gt; 1/100)  2: square falloff			(dist 100 =&amp;gt; 1/10000) &lt;br /&gt;
::&#039;&#039;scaling&#039;&#039;: factor to scale the distance, can be used to lower/raise distance factor  after the linear or square scaling has been used good looking values are approx: sqrt(linear): 0.01, linear: 0.1, square 1.0&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getLightLevel&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get level (intensity) of a light, &amp;lt;= 0.0 indicates it is off&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idLight&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getLightOrigin&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get the light origin (independent of its visual model)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idLight&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getLightParm&#039;&#039;&#039;(float parmNum); ====&lt;br /&gt;
&lt;br /&gt;
:Gets a shader parameter.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idLight&#039;&#039;, &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getLinearVelocity&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the current linear velocity of this entity. The linear velocity of a physics object is a vector that defines the translation of the center of mass in units per second.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getLinearVelocityB&#039;&#039;&#039;(float id); ====&lt;br /&gt;
&lt;br /&gt;
:Get the linear velocitiy of a particular body Returns (0,0,0) if the body ID is invalid.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAFEntity_Base&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getListenLoc&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Retrieves the location of the listener when leaning.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getLocation&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the idLocation entity corresponding to the entity&#039;s current location. This was player-specific before, but is now available to all entities.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getLocationPoint&#039;&#039;&#039;(vector point); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the idLocation entity corresponding to the specified point&#039;s location.&lt;br /&gt;
::&#039;&#039;point&#039;&#039;: point whose location to check&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;GetLock&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the associated lock of this handle.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CFrobLockHandle&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getLootAmount&#039;&#039;&#039;(float type); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the amount of loot for the given type (e.g. LOOT_GOODS). Pass LOOT_TOTAL to return the sum of all loot types.&lt;br /&gt;
::&#039;&#039;type&#039;&#039;: one of: LOOT_GOLD, LOOT_GOODS, LOOT_JEWELRY, LOOT_TOTAL&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getMainAmbientLight&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the entity of the main ambient light.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMass&#039;&#039;&#039;(float body); ====&lt;br /&gt;
&lt;br /&gt;
:Gets mass of a body for an entity&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMaxHealth&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the max health of this entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getMaxs&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the maximum corner of this entity&#039;s bounding box.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMeleeActPhase&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current melee action phase (holding,recovering,etc).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMeleeActState&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current melee action state (attacking/defending).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMeleeActType&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current melee action type (overhead,thrust,etc.).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMeleeLastActTime&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the melee type of the last attack to hit this actor. Defaults to MELEETYPE_UNBLOCKABLE if we were not hit before.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMeleeLastHitByType&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the game time that the most recent melee action ended (in ms)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMeleeResult&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get the result of the last melee action Follows MELEERESULT_* enum defined in tdm_defs.script&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getMins&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the minimum corner of this entity&#039;s bounding box.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMissionStatistic&#039;&#039;&#039;(string statisticName); ====&lt;br /&gt;
&lt;br /&gt;
:Returns current mission statistic.&lt;br /&gt;
::&#039;&#039;statisticName&#039;&#039;: Can be one of (case insensitive): 	gamePlayTime: gameplay time in seconds 	damageDealt: damage dealt to enemies 	damageReceived: damage received by player 	healthReceived: health received by player 	pocketsPicked: pockets picked by player 	foundLoot: loot found by player 	missionLoot: total loot available in mission 	totalTimePlayerSeen: total time the player was seen by enemies in seconds. Updates only when AI lose sight of player 	numberTimesPlayerSeen: number of times player was seen by enemies 	numberTimesAISuspicious: number of times AI was &#039;observant&#039; or &#039;suspicious&#039;. A single AI passing through both alert levels will add 2 to the score. 	numberTimesAISearched: number of times AI was &#039;investigating&#039; or &#039;searching&#039;. A single AI passing through both alert levels will add 2 to the score. 	sightingScore: sighting score (number of times player was seen * weight) 	stealthScore: stealth score (sighting score + alerts * weights) 	killedByPlayer: number of enemies killed by player 	knockedOutByPlayer: number of enemies knocked out by player 	bodiesFound: number of times enemies have spotted a body 	secretsFound: number of secrets found by the player 	secretsTotal: total number of secrets in the mission &lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMouseGesture&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the results of the last mouse gesture in enum form. (see the definition for MOUSEDIR_* for which numbers correspond to which directions)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getMove&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the movement relative to the player&#039;s view angles from the current user command. vector_x = forward, vector_y = right, vector_z = up&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getMoveAnim&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the name of the player-requested movement anim for a player controlled AI vehicle&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CAIVehicle&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMoveSpeed&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get the movement speed.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMoveTime&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the movement time.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMoveType&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current movetype&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getName&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the name of this entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getNextEnemy&#039;&#039;&#039;(entity lastMatch); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the next enemy that the security camera can see.&lt;br /&gt;
::&#039;&#039;lastMatch&#039;&#039;: search will start after this entity.Use $null_entity or pass an uninitialized entity variable to start a new search.The first result in a new search will be the player, if the camera can see him.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idSecurityCamera&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getNextEntity&#039;&#039;&#039;(string key, string value, entity lastMatch); ====&lt;br /&gt;
&lt;br /&gt;
:Discover all entities in the map. Returns $null_entity when no more found.&lt;br /&gt;
::&#039;&#039;key&#039;&#039;: Optional string: prefix for spawnarg key match. E.g. &amp;quot;target&amp;quot; will match &amp;quot;target&amp;quot;, &amp;quot;target1&amp;quot; etc.&lt;br /&gt;
::&#039;&#039;value&#039;&#039;: Optional string: spawnarg value to match. Can be used independently of &#039;&#039;key&#039;&#039;. If &#039;&#039;key&#039;&#039; is not set, all spawnargs will be checked for the value.&lt;br /&gt;
::&#039;&#039;lastMatch&#039;&#039;: Last match: search will start after this entity. Use $null_entity or pass an uninitialized entity variable to start a new search.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getNextHinderance&#039;&#039;&#039;(string prefix, string lastMatch); ====&lt;br /&gt;
&lt;br /&gt;
:Used to get the next hinderance from a source.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getNextIdleAnim&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:This returns the name of the next idle anim to be played on this AI (used by AnimState scripts).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getNextImmobilization&#039;&#039;&#039;(string prefix, string lastMatch); ====&lt;br /&gt;
&lt;br /&gt;
:Used to get immobilization from a source. Warning: Not a finalized version. It&#039;s subject to change, so use it at your own risk.)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getNextInvItem&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Cycles the standard cursor to the next inventory item. Returns the item entity pointed to after the operation is complete.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getNextKey&#039;&#039;&#039;(string prefix, string lastMatch); ====&lt;br /&gt;
&lt;br /&gt;
:Searches for the name of a spawn arg that matches the prefix.  For example, passing in &amp;quot;attack_target&amp;quot; matches &amp;quot;attack_target1&amp;quot;, &amp;quot;attack_targetx&amp;quot;, &amp;quot;attack_target_enemy&amp;quot;,  etc. The returned string is the name of the key which can then be passed into functions like getKey() to lookup the value of that spawn arg.  This is useful for when you have multiple values to look up, like when you target multiple objects.  To find the next matching key, pass in the previous result and the next key returned will be the first one that matches after the previous result. Pass in &amp;quot;&amp;quot; to get the first match. Passing in a non-existent key is the same as passing in &amp;quot;&amp;quot;. Returns &amp;quot;&amp;quot; when no  more keys match.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getNextTurnHinderance&#039;&#039;&#039;(string prefix, string lastMatch); ====&lt;br /&gt;
&lt;br /&gt;
:Get the next hinderance on the view turning from a source&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getNumAttachments&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Return the number of attachments on an AI. Used to iterate through the attachments if desired.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getNumBodies&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of bodies in the AF. If the AF physics pointer is NULL, it returns 0.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAFEntity_Base&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getNumMeleeWeapons&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of melee weapons attached to an actor. This refers to the TDM-style attachments with the spawnarg &#039;is_weapon_melee&#039; set to &#039;1&#039;.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getNumRangedWeapons&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of ranged weapons attached to an actor. This refers to the TDM-style attachments with the spawnarg &#039;is_weapon_ranged&#039; set to &#039;1&#039;.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getObjectiveComp&#039;&#039;&#039;(float ObjNum, float CompNum); ====&lt;br /&gt;
&lt;br /&gt;
:Used to get the state of custom objective components&lt;br /&gt;
::&#039;&#039;ObjNum&#039;&#039;: Starts counting at 1&lt;br /&gt;
::&#039;&#039;CompNum&#039;&#039;: Starts counting at 1&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getObjectiveState&#039;&#039;&#039;(float ObjNum); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current state of the objective with the number ObjNum.  State is one of the following: OBJ_INCOMPLETE = 0, OBJ_COMPLETE = 1, OBJ_INVALID = 2, OBJ_FAILED = 3&lt;br /&gt;
::&#039;&#039;ObjNum&#039;&#039;: Starts counting at 1&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getObjectiveVisible&#039;&#039;&#039;(float ObjNum); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current visibility of the objective with the number ObjNum.&lt;br /&gt;
::&#039;&#039;ObjNum&#039;&#039;: Starts counting at 1&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getObservationPosition&#039;&#039;&#039;(vector targetPoint, float visualAcuityZeroToOne); ====&lt;br /&gt;
&lt;br /&gt;
:This event is used to get a position that the AI can move to observe a  given position.  It is useful for looking at hiding spots that can&#039;t be reached, and performing other investigation functions.  Returns a world position from which the observation can take place. Returns the current AI origin if no such point is found.  @sideEffect This uses the AI_DEST_UNREACHABLE flag variable  to indicate if a point was found. It will be true if none was found, false if one was found.&lt;br /&gt;
::&#039;&#039;targetPoint&#039;&#039;: the world position to be observed&lt;br /&gt;
::&#039;&#039;visualAcuityZeroToOne&#039;&#039;: the visual acuity of the AI on a scale of 0.0 to 1.0 where 0.0 is blind and 1.0 is perfect vision.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getObstacle&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the obstacle in the character&#039;s path&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getOrigin&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current position of this entity (relative to bind parent if any).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getOwner&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the owning entity&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getPainAnim&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the name of the pain animation.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getPersistentFloat&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the floating point value for the given persistent arg&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getPersistentString&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the string for the given persistent arg&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getPersistentVector&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the vector for the given persistent arg&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getPortAISoundLoss&#039;&#039;&#039;(float handle); ====&lt;br /&gt;
&lt;br /&gt;
:AI sound propagation scriptfunction on the sys object&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getPortalHandle&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the portal handle.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPortalEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getPortPlayerSoundLoss&#039;&#039;&#039;(float handle); ====&lt;br /&gt;
&lt;br /&gt;
:Player sound loss  scriptfunction on the sys object&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getPortSoundLoss&#039;&#039;&#039;(float handle); ====&lt;br /&gt;
&lt;br /&gt;
:Sound propagation scriptfunction on the sys object&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getPrevInvItem&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Cycles the standard cursor to the previous inventory item. Returns the item entity pointed to after the operation is complete.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getPreviousWeapon&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns weaponX where X is the number of the weapon the player was previously holding.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getPrime&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Event called using vine.*()&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;tdmVine&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getProjectileState&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the current state of the projectile. States are defined in tdm_defs.script&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idProjectile&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getProjMass&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Getter for projectile result variable&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CProjectileResult&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getRadius&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the light radius.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idLight&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getRandomTarget&#039;&#039;&#039;(string entity_type); ====&lt;br /&gt;
&lt;br /&gt;
:Finds a random targeted entity of the specified type.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getReachableEntityPosition&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the position of the entity within the AAS if possible, otherwise just the entity position.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getRelation&#039;&#039;&#039;(float team1, float team2); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getRelationEnt&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;GetResponseEntity&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the entity which should take the response. Some entities like AI heads are not responding themselves to stims, but relay it to another entity (i.e. the bodies they&#039;re attached to).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getSecurityCameraState&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the security camera&#039;s state. 1 = unalerted, 2 = suspicious, 3 = fully alerted, 4 = inactive, 5 = destroyed.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idSecurityCamera&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getShader&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the shader name used by the light.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idLight&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getShaderParm&#039;&#039;&#039;(float parm); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the value of the specified shader parm.&lt;br /&gt;
::&#039;&#039;parm&#039;&#039;: shader parm index&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getShouldered&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the currently shouldered body, otherwise $null_entity. See also getDragged(), getGrabbed() and getFrobbed().&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getSize&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the size of this entity&#039;s bounding box.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getSndDir&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:ai hearing of sound &lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getSoundLoss&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the sound loss value (dB).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPortalEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getSoundVolume&#039;&#039;&#039;(string soundName); ====&lt;br /&gt;
&lt;br /&gt;
:Get the volume of the sound to play.&lt;br /&gt;
::&#039;&#039;soundName&#039;&#039;: the name of the sound&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getSpotLight&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the spotlight used by the camera. Returns null_entity if none is used.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idSecurityCamera&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getState&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the current state.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getStruckEnt&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Getter for projectile result variable&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CProjectileResult&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getSurfNormal&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Getter for projectile result variable&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CProjectileResult&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getSurfType&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Getter for projectile result variable&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CProjectileResult&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getTactEnt&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:ai sense of touch&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getTalkTarget&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the entity (player) trying to talk to the character&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getTarget&#039;&#039;&#039;(float num); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the requested target entity.&lt;br /&gt;
::&#039;&#039;num&#039;&#039;: The target number. Starts at 0.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getTDMVersion&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get the current TDM version as integer. The value will be 108 for v1.08, 109 for v1.09 and 200 for v2.00 etc.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getTeam&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current team number.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getTicsPerSecond&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:returns the number of game frames per second.  this is not related to renderer frame rate.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getTime&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current game time in seconds.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getTraceBody&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of the body part of the entity which was hit during the last call to trace or tracePoint&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getTraceEndPos&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the position the trace stopped due to a collision with solid geometry during the last call to trace or tracePoint&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getTraceEntity&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a reference to the entity which was hit during the last call to trace or tracePoint&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getTraceFraction&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the fraction of movement completed during the last call to trace or tracePoint.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getTraceJoint&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of the skeletal joint closest to the location on the entity which was hit during the last call to trace or tracePoint&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getTraceNormal&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the normal of the hit plane during the last call to trace or tracePoint&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getTraceSurfType&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the type of the surface (i.e. metal, snow) which was hit during the last call to trace or tracePoint&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getTurnDelta&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getTurnHinderance&#039;&#039;&#039;(string source); ====&lt;br /&gt;
&lt;br /&gt;
:* Get the hinderance on the view turning from a source&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getTurnRate&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the rate the character turns.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getTurretState&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the turret&#039;s state.  0 = passive: no active security cameras connected. 1 = unalerted, 2 = suspicious, 3 = fully alerted, 4 = power off, 5 = destroyed.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idTurret&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getVectorKey&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Retrieves the vector value of a specific spawn arg, defaulting to &#039;0 0 0&#039;.&lt;br /&gt;
::&#039;&#039;key&#039;&#039;: spawnarg name&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getVectorToIdealOrigin&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the vector from where the AI is to where he ideally should be&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getViewAngles&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the player view angles.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getVinePlantLoc&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Event important to the growing of vines from vine arrows&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getVinePlantNormal&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Event important to the growing of vines from vine arrows&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getVisDir&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns position of the last visual alert.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getWeaponEntity&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the entity for the player&#039;s weapon&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getWorldModel&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the entity that controls the world model&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getWorldOrigin&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current world-space position of this entity (regardless of any bind parent).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;gib&#039;&#039;&#039;(string damageDefName); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAFEntity_Gibbable&#039;&#039;, &#039;&#039;idMoveableItem&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;giveHealthPool&#039;&#039;&#039;(float amount); ====&lt;br /&gt;
&lt;br /&gt;
:This increases/decreases the healthpool of the player by the given amount. The healthpool is gradually decreased over time, healing (damaging?) the player.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;handleMissionEvent&#039;&#039;&#039;(entity objEnt, float eventType, string argument); ====&lt;br /&gt;
&lt;br /&gt;
:Generic interface for passing on mission events from scripts to the SDK. Available since TDM 1.02&lt;br /&gt;
::&#039;&#039;objEnt&#039;&#039;: the entity that triggered this event (e.g. a readable)&lt;br /&gt;
::&#039;&#039;eventType&#039;&#039;: a numeric identifier (enumerated both in MissionData.h and tdm_defs.script) specifying the type of event&lt;br /&gt;
::&#039;&#039;argument&#039;&#039;: an optional string parameter, eventtype-specific.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;hasAnim&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true when an entity has a specific animation.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;hasEnemies&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the actor has one or more enemies.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;hasFunction&#039;&#039;&#039;(string functionName); ====&lt;br /&gt;
&lt;br /&gt;
:checks if an entity&#039;s script object has a specific function&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;hasInvItem&#039;&#039;&#039;(entity item); ====&lt;br /&gt;
&lt;br /&gt;
:Tests whether the player has the specified item entity in his inventory.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;hasSeenEvidence&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:This returns 1 when the AI has seen evidence of intruders before (an enemy, a body...)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;heal&#039;&#039;&#039;(string healDefName, float healScale); ====&lt;br /&gt;
&lt;br /&gt;
:Heals the entity this is called on using the specified healing entityDef. Returns 1 if the entity could be healed, 0 otherwise (if the entity is already at full health, for ex.)&lt;br /&gt;
::&#039;&#039;healDefName&#039;&#039;: the name of the entityDef containing the healing information (e.g. &amp;quot;heal_potion&amp;quot;)&lt;br /&gt;
::&#039;&#039;healScale&#039;&#039;: the scaling value to be applied to the healAmount found in the healEntityDef&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;heldEntity&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the entity currently being held, or $null_entity if the player&#039;s hands are empty.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;hide&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Makes this entity invisible.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;holdEntity&#039;&#039;&#039;(entity entity); ====&lt;br /&gt;
&lt;br /&gt;
:Forces the player to hold an entity (e.g. puts it into the grabber). Drops whatever is in the player&#039;s hands if $null_entity is passed to it. Returns 1 if successful, 0 if not.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;idleAnim&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Plays the given idle animation on the given channel.  Returns false if anim doesn&#039;t exist.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ignoreDamage&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:The AI can no longer take damage.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;inAnimState&#039;&#039;&#039;(float channel, string stateFunc); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the given animation state script function is currently used for the given channel.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;influenceActive&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Checks if an influence is active&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;inPVS&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns non-zero if this entity is in PVS. For lights, it will return true when the light&#039;s bounding box is in PVS, even though the light may not actually be in PVS. (an unmoved shadowcasting light may not be visible to PVS areas its bounding box intersects with)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isAirborne&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Checks whether the player is in the air.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isAtRest&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if object is not moving&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMoveable&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isDroppable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get whether an item may be dropped from the inventory&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isEnemy&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the given entity is an enemy.&lt;br /&gt;
::&#039;&#039;ent&#039;&#039;: The entity in question&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isEntityHidden&#039;&#039;&#039;(entity ent, float f_sightThreshold); ====&lt;br /&gt;
&lt;br /&gt;
:This is an alternate version of canSee, using FOV, distance and lighting.&lt;br /&gt;
::&#039;&#039;f_sightThreshold&#039;&#039;: goes from 0.0 (entity visible in complete darkness) to 1.0 (entity only visible if completely lit up).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isFriend&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the given entity is a friend.&lt;br /&gt;
::&#039;&#039;ent&#039;&#039;: The entity in question&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isFrobable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get whether the entity is frobable&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isHidden&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:checks if the entity&#039;s model is invisible.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isHilighted&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if entity is currently frobhilighted.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isInLiquid&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns 1 if the entity is in or touching a liquid.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isInvisible&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isLeaning&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get whether the player is leaning&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isLight&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;IsLocked&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true (nonzero) if the mover is currently locked.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CBinaryFrobMover&#039;&#039;, &#039;&#039;CFrobLock&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isMoving&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if a mover is moving&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isNeutral&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the given entity is neutral.&lt;br /&gt;
::&#039;&#039;ent&#039;&#039;: The entity in question&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;IsOpen&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true (nonzero) if the mover is open, which is basically the same as &amp;quot;not closed&amp;quot;. A mover is considered closed when it is at its close position.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CBinaryFrobMover&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isPeekLeaning&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get whether the player is peek leaning (against a keyhole or crack)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;IsPickable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true (nonzero) if this frobmover is pickable.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CBinaryFrobMover&#039;&#039;, &#039;&#039;CFrobLock&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isPlayerResponsibleForDeath&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the player was responsible for the AI&#039;s caller&#039;s death.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isRotating&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if a mover is rotating&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isType&#039;&#039;&#039;(string spawnclass); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if this entity is of the given type.&lt;br /&gt;
::&#039;&#039;spawnclass&#039;&#039;: spawn class name&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isVineFriendly&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Vine-arrow event&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CProjectileResult&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;kickObstacles&#039;&#039;&#039;(entity kickEnt, float force); ====&lt;br /&gt;
&lt;br /&gt;
:Kicks any obstacle in the character&#039;s path.&lt;br /&gt;
::&#039;&#039;kickEnt&#039;&#039;: pass in $null_entity if you don&#039;t have a specific entity to kick&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;kill&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Kills the monster.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;killthread&#039;&#039;&#039;(string threadName); ====&lt;br /&gt;
&lt;br /&gt;
:Kills all threads with the specified name&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;KO_Knockout&#039;&#039;&#039;(entity inflictor); ====&lt;br /&gt;
&lt;br /&gt;
:AI knockout&lt;br /&gt;
::&#039;&#039;inflictor&#039;&#039;: is the entity causing the knockout, can be the $null_entity&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;launch&#039;&#039;&#039;(vector start, vector dir, vector velocity); ====&lt;br /&gt;
&lt;br /&gt;
:Launches the projectile from &amp;lt;start&amp;gt; in direction &amp;lt;dir&amp;gt; with the given &amp;lt;velocity&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idProjectile&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;launchGuided&#039;&#039;&#039;(vector start, vector dir, vector velocity, entity target); ====&lt;br /&gt;
&lt;br /&gt;
:Launches the guided projectile from &amp;lt;start&amp;gt; in direction &amp;lt;dir&amp;gt; with the given &amp;lt;velocity&amp;gt; at &amp;lt;target entity&amp;gt;. Pass $null_entity to fire an unguided projectile.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idGuidedProjectile&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;launchMissile&#039;&#039;&#039;(vector origin, vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the projectile entity&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;launchMissiles&#039;&#039;&#039;(string projectilename, string sound, string launchbone, string targetbone, float numshots, float framedelay); ====&lt;br /&gt;
&lt;br /&gt;
:Launches a projectile.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAnimated&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;launchProjectiles&#039;&#039;&#039;(float num_projectiles, float spread, float fuseOffset, float launchPower, float dmgPower); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;leftFoot&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Changes to left foot and plays footstep sound.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;, &#039;&#039;idAnimated&#039;&#039;, &#039;&#039;idTestModel&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;loadExternalData&#039;&#039;&#039;(string declFile, string prefix); ====&lt;br /&gt;
&lt;br /&gt;
:Load an external xdata declaration.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;locateEnemy&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Updates the last known position of the enemy independent from whether or not the enemy is visible.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Lock&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Locks the mover. Calls to Open() will not succeed after this call. &lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CBinaryFrobMover&#039;&#039;, &#039;&#039;CFrobLock&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;log&#039;&#039;&#039;(float x); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the log of the given argument.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;logString&#039;&#039;&#039;(float logClass, float logType, string output); ====&lt;br /&gt;
&lt;br /&gt;
:This is the script counterpart to DM_LOG&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;lookAt&#039;&#039;&#039;(entity focusEntity, float duration); ====&lt;br /&gt;
&lt;br /&gt;
:Aims the character&#039;s eyes and head toward an entity for a period of time.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;lookAtAngles&#039;&#039;&#039;(float yawAngleClockwise, float pitchAngleUp, float rollAngle, float durationInSeconds); ====&lt;br /&gt;
&lt;br /&gt;
:A look at event that just looks at a set of angles relative  to the current body facing of the AI. This method is just like the vanilla Doom3 lookAt and lookAtEnemy methods, but it looks at the specified angles from the current body facing of the AI.&lt;br /&gt;
::&#039;&#039;yawAngleClockwise&#039;&#039;: Negative angles are to the left of  the AIs body and positive angles are to the right.&lt;br /&gt;
::&#039;&#039;pitchAngleUp&#039;&#039;: Negative values are down and positive values are up  where down and up are defined by the body axis.&lt;br /&gt;
::&#039;&#039;rollAngle&#039;&#039;: This is currently unused and does nothing.&lt;br /&gt;
::&#039;&#039;durationInSeconds&#039;&#039;: The duration to look in seconds.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;lookAtEnemy&#039;&#039;&#039;(float duration); ====&lt;br /&gt;
&lt;br /&gt;
:Aims the character&#039;s eyes and head toward the current enemy for a period of time.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;lookAtPosition&#039;&#039;&#039;(vector lookAtWorldPosition, float durationInSeconds); ====&lt;br /&gt;
&lt;br /&gt;
:This method is just like the vanilla Doom3 lookAt and lookAtEnemy methods, but instead of looking at an entity, it looks at a position in worldspace.  That is, it turns the head of the AI to look at the position.&lt;br /&gt;
::&#039;&#039;lookAtWorldPosition&#039;&#039;: position in space to look at&lt;br /&gt;
::&#039;&#039;durationInSeconds&#039;&#039;: duration to look in seconds&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;lookupReplacementAnim&#039;&#039;&#039;(string anim); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current replacement animation for &amp;quot;anim&amp;quot;. Returns empty if no replacement anim &lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;markUsed&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Disables the combat node if &amp;quot;use_once&amp;quot; is set on the entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idCombatNode&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;max&#039;&#039;&#039;(float x, float y); ====&lt;br /&gt;
&lt;br /&gt;
:returns the larger of two provided float values.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;melee&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;meleeActionFinished&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Called when the animation for the melee action has finished.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;meleeActionHeld&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Called when the melee action reaches the &amp;quot;hold&amp;quot; point.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;meleeActionReleased&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Called when the melee action is released from the hold point.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;meleeAttackStarted&#039;&#039;&#039;(float attType); ====&lt;br /&gt;
&lt;br /&gt;
:Registers the start of a given melee attack Intended to be called from a script that also starts the animation&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;meleeAttackToJoint&#039;&#039;&#039;(string joint, string damageDef); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;meleeBestParry&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the melee type integer of the best parry given the enemy attacks at the time If no attacking enemy is found, returns default of MELEETYPE_RL Follows MELEETYPE_* enum defined in tdm_defs.script&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;meleeNameForNum&#039;&#039;&#039;(float num); ====&lt;br /&gt;
&lt;br /&gt;
:Converts a melee type integer to a string name suffix Used for finding the right animation for a given type, etc. Possible names are, in order: &amp;quot;Over, LR, RL, Thrust, General&amp;quot; Where general blocks all attacks types except unblockable&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;meleeParryStarted&#039;&#039;&#039;(float parType); ====&lt;br /&gt;
&lt;br /&gt;
:Registers the start of a given melee parry Intended to be called from a script that also starts the animation&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;min&#039;&#039;&#039;(float x, float y); ====&lt;br /&gt;
&lt;br /&gt;
:returns the smaller of two provided float values.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;missionFailed&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;missionSuccess&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;mouseGestureFinished&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the player is not currently doing a mouse gesture.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;move&#039;&#039;&#039;(float angle, float distance); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a translation with the given distance in the given yaw direction. Uses the current speed/time and acceleration and deceleration settings.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveOutOfRange&#039;&#039;&#039;(entity ent, float range); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveSound&#039;&#039;&#039;(string sound); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the sound to be played when the moving.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;moveStatus&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveTo&#039;&#039;&#039;(entity targetEntity); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a translation to the position of an entity. Uses the current speed/time and acceleration and deceleration settings.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveToAttackPosition&#039;&#039;&#039;(entity ent, string attack_anim); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveToCover&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveToCoverFrom&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveToEnemy&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveToEnemyHeight&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveToEntity&#039;&#039;&#039;(entity destination); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveToPos&#039;&#039;&#039;(vector pos); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a translation to an absolute position. Uses the current speed/time and acceleration and deceleration settings.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveToPosition&#039;&#039;&#039;(vector position); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;music&#039;&#039;&#039;(string shaderName); ====&lt;br /&gt;
&lt;br /&gt;
:Starts playing background music.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;muzzleFlash&#039;&#039;&#039;(string jointname); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;netEndReload&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;netReload&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;nextEnemy&#039;&#039;&#039;(entity lastEnemy); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the next enemy the actor has acquired.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;nextWeapon&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;noShadows&#039;&#039;&#039;(float noShadows); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the noShadow property on the entity to true/false, turning shadowcasting on or off for this entity.&lt;br /&gt;
::&#039;&#039;noShadows&#039;&#039;: 1 = disable shadows, 0 = enable shadows&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;noShadowsDelayed&#039;&#039;&#039;(float noShadows, float delay); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the noShadow property on the entity to true/false after delay in ms, turning shadows cast by this entity on or off.&lt;br /&gt;
::&#039;&#039;noShadows&#039;&#039;: 1 = disable shadows, 0 = enable shadows&lt;br /&gt;
::&#039;&#039;delay&#039;&#039;: delay in ms&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;numBindChildren&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of bound entities lower down in the bind chain than this entity, but be sure to give it the topmost bindmaster&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;numSmokeEmitters&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the # of emitters defined by &#039;smokeParticleSystem&#039; in the entitydef&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;numTargets&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of entities this entity has targeted.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;objectiveCompUnlatch&#039;&#039;&#039;(float ObjNum, float CompNum); ====&lt;br /&gt;
&lt;br /&gt;
:Unlatch an irreversible objective component that has latched into a state&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;objectiveUnlatch&#039;&#039;&#039;(float ObjNum); ====&lt;br /&gt;
&lt;br /&gt;
:Unlatch an irreversible objective that has latched into a state&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Off&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Switches the emitter off.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idFuncEmitter&#039;&#039;, &#039;&#039;idLight&#039;&#039;, &#039;&#039;idSecurityCamera&#039;&#039;, &#039;&#039;idSound&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;offsetRelation&#039;&#039;&#039;(float team1, float team2, float val); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;On&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Switches the emitter on.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idFuncEmitter&#039;&#039;, &#039;&#039;idLight&#039;&#039;, &#039;&#039;idSecurityCamera&#039;&#039;, &#039;&#039;idSound&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;onSignal&#039;&#039;&#039;(float signalNum, entity ent, string functionName); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a script callback function for when the given signal is raised on the given entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Open&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Opens the frobmover, regardless of its previous state. The mover will not move when it&#039;s locked. &lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CBinaryFrobMover&#039;&#039;, &#039;&#039;CFrobLock&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;OpenDoor&#039;&#039;&#039;(float master); ====&lt;br /&gt;
&lt;br /&gt;
:The OpenDoor method is necessary to give the FrobDoorHandles a  &amp;quot;low level&amp;quot; open routine. The CFrobDoor::Open() call is re-routed to the FrobDoorHandle::Tap() method, so there must be a way to actually let the door open. Which is what this method does.  Note: Shouldn&#039;t be called directly by scripters, call handle-&amp;gt;Tap() instead. Unless you know what you&#039;re doing.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CFrobDoor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;openPortal&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Opens the renderer portal associated with this mover.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;, &#039;&#039;idMover_Binary&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Operate&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Call this to operate this entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CFrobButton&#039;&#039;, &#039;&#039;CFrobLever&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;overrideAnim&#039;&#039;&#039;(float channel); ====&lt;br /&gt;
&lt;br /&gt;
:Disables the animation currently playing on the given channel and syncs the animation with the animation of the nearest animating channel.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;pause&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Pauses the current thread.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;pauseAnim&#039;&#039;&#039;(float channel, float bPause); ====&lt;br /&gt;
&lt;br /&gt;
:Pause all animations playing on the given channel. NOTE: Can also be used used by idWeapons&lt;br /&gt;
::&#039;&#039;bPause&#039;&#039;: true = pause, false = unpause&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;, &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;pauseGame&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Pauses the game. This should only be called for threads that are explicitly maintained by a special SDK method, because ordinary threads won&#039;t get executed during g_stopTime == true. Note: This is used by the objective GUI threads. Note: Must be called on the player entity, not the sys entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;performRelight&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Deal with doused lights.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;playAndLipSync&#039;&#039;&#039;(string soundName, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Play the given sound, using the given lipsync animation. The lipsync animation should just be a simple non-loopable animation of the mouth opening in a linear fashion. The code will select individual frames from this to construct a simple lipsyncing effect which is in time with the sound.  Returns the length of the played sound in seconds.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;playAnim&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Do not use, this is part of TDM&#039;s internal mechanics. Use playCustomAnim() on AI.in scripts instead of this. Plays the given animation on the given channel. Returns false if anim doesn&#039;t exist.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;, &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;playCustomAnim&#039;&#039;&#039;(string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Plays the given animation on legs and torso. Returns false if anim doesn&#039;t exist.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;playCycle&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Continuously repeats the given animation on the given channel.  Returns false if anim doesn&#039;t exist.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;, &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;playStartSound&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;pointInLiquid&#039;&#039;&#039;(vector point, entity ignoreEntity); ====&lt;br /&gt;
&lt;br /&gt;
:Checks if a point is in a liquid, returns 1 if this is the case.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;pointIsInBounds&#039;&#039;&#039;(vector point, vector mins, vector maxs); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the point is within the bounds specified.&lt;br /&gt;
::&#039;&#039;point&#039;&#039;: test whether this point is in the bounds&lt;br /&gt;
::&#039;&#039;mins&#039;&#039;: minimal corner of the bounds&lt;br /&gt;
::&#039;&#039;maxs&#039;&#039;: maximal corner of the bounds&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;pow&#039;&#039;&#039;(float x, float y); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the power of x to y.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;preBurn&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;predictEnemyPos&#039;&#039;&#039;(float time); ====&lt;br /&gt;
&lt;br /&gt;
:Tries to predict the player&#039;s movement based on the AAS and his direction of movement.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;preventPain&#039;&#039;&#039;(float duration); ====&lt;br /&gt;
&lt;br /&gt;
:Prevents any pain animation from being played for the given time in seconds.&lt;br /&gt;
::&#039;&#039;duration&#039;&#039;: time in seconds&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;print&#039;&#039;&#039;(string text); ====&lt;br /&gt;
&lt;br /&gt;
:Prints the given string to the console.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;println&#039;&#039;&#039;(string text); ====&lt;br /&gt;
&lt;br /&gt;
:Prints the given line to the console.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;processBlindStim&#039;&#039;&#039;(entity stimSource, float skipVisibilityCheck); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;processVisualStim&#039;&#039;&#039;(entity stimSource); ====&lt;br /&gt;
&lt;br /&gt;
:Use this call to let the AI react to a visual stim (coming from the source entity).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;projectDecal&#039;&#039;&#039;(vector traceOrigin, vector traceEnd, entity passEntity, string decal, float decalSize, float angle); ====&lt;br /&gt;
&lt;br /&gt;
:Performs a trace from the specified origin and end positions, then projects a decal in that direction.&lt;br /&gt;
::&#039;&#039;traceOrigin&#039;&#039;: Start of the trace.&lt;br /&gt;
::&#039;&#039;traceEnd&#039;&#039;: End of the trace.&lt;br /&gt;
::&#039;&#039;passEntity&#039;&#039;: This entity will be considered non-solid by the trace.&lt;br /&gt;
::&#039;&#039;decal&#039;&#039;: Decal to be projected.&lt;br /&gt;
::&#039;&#039;decalSize&#039;&#039;: Size of the decal quad.&lt;br /&gt;
::&#039;&#039;angle&#039;&#039;: Angle of the decal quad.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;propagateSound&#039;&#039;&#039;(string soundName, float propVolMod, float msgTag); ====&lt;br /&gt;
&lt;br /&gt;
:Generates a propagated sound&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;propSound&#039;&#039;&#039;(string name); ====&lt;br /&gt;
&lt;br /&gt;
:Sound propagation scriptfunctions on all entities propagate a sound directly without playing an audible sound&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;propSoundMod&#039;&#039;&#039;(string name, float volMod); ====&lt;br /&gt;
&lt;br /&gt;
:propagate a sound directly with a volume modifier&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;pushPointIntoAAS&#039;&#039;&#039;(vector post); ====&lt;br /&gt;
&lt;br /&gt;
:Tries to push the point into a valid AAS area&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;pushState&#039;&#039;&#039;(string stateName); ====&lt;br /&gt;
&lt;br /&gt;
:Pushes the state with the given name, current one is postponed.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;radiusDamage&#039;&#039;&#039;(vector origin, entity inflictor, entity attacker, entity ignore, string damageDefName, float dmgPower); ====&lt;br /&gt;
&lt;br /&gt;
:damages entities within a radius defined by the damageDef.  inflictor is the entity  causing the damage and can be the same as the attacker (in the case   of projectiles, the projectile is the inflictor, while the attacker is the character  that fired the projectile).&lt;br /&gt;
::&#039;&#039;inflictor&#039;&#039;: the entity causing the damage&lt;br /&gt;
::&#039;&#039;ignore&#039;&#039;: an entity to not cause damage to&lt;br /&gt;
::&#039;&#039;dmgPower&#039;&#039;: scales the damage (for cases where damage is dependent on time)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;radiusDamageFromJoint&#039;&#039;&#039;(string jointname, string damageDef); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;random&#039;&#039;&#039;(float range); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a random value X where 0 &amp;lt;= X &amp;lt; range.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;randomPath&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;, &#039;&#039;idPathCorner&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;randomTarget&#039;&#039;&#039;(string ignoreName); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a random targeted entity. Pass in an entity name to skip that entity.&lt;br /&gt;
::&#039;&#039;ignoreName&#039;&#039;: the name of an entity to ignore&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;rangedThreatTo&#039;&#039;&#039;(entity target); ====&lt;br /&gt;
&lt;br /&gt;
:Could this entity threaten the given (target) entity from a distance?&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;readLightgemModifierFromWorldspawn&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;reAttachToCoords&#039;&#039;&#039;(string attName, string joint, vector offset, vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Reattach an existing attachment&lt;br /&gt;
::&#039;&#039;attName&#039;&#039;: the name of the attachment we want to reattach. &lt;br /&gt;
::&#039;&#039;joint&#039;&#039;: the name of the joint to attach to&lt;br /&gt;
::&#039;&#039;offset&#039;&#039;: the translation offset from joint&lt;br /&gt;
::&#039;&#039;angles&#039;&#039;: a (pitch, yaw, roll) angle vector that defines the rotation  of the attachment relative to the joint&#039;s orientation&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;reAttachToPos&#039;&#039;&#039;(string attName, string position); ====&lt;br /&gt;
&lt;br /&gt;
:Reattach an existing attachment to a named attachment position. Example: reAttachToPos( melee_weapon, right_hand_held )&lt;br /&gt;
::&#039;&#039;attName&#039;&#039;: the name of the attachment we want to reattach.&lt;br /&gt;
::&#039;&#039;position&#039;&#039;: the new position we want to attach it to.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;reloadTorchReplacementAnims&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:If actor has a torch, reload the torch&#039;s replacement anims.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;remove&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Removes the entity from the game. For AI, use kill() instead.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idClass&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;removeBinds&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Removes all attached entities from the game&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;removeFrobPeer&#039;&#039;&#039;(entity peer); ====&lt;br /&gt;
&lt;br /&gt;
:Removes the passed entity as a frob peer.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;removeInitialSplineAngles&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Subtracts the initial spline angles to maintain the initial orientation of the mover.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;removeKey&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Removes a key from an object&#039;s spawnargs, so things like getNextKey() don&#039;t retrieve it.&lt;br /&gt;
::&#039;&#039;key&#039;&#039;: the spawnarg to remove&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;removeReplacementAnim&#039;&#039;&#039;(string anim); ====&lt;br /&gt;
&lt;br /&gt;
:Removes the replacement for the given &amp;quot;anim&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;removeTarget&#039;&#039;&#039;(entity target); ====&lt;br /&gt;
&lt;br /&gt;
:Remove a target from this entity.&lt;br /&gt;
::&#039;&#039;target&#039;&#039;: the entity to remove from the targets&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;replaceInvItem&#039;&#039;&#039;(entity oldItem, entity newItem); ====&lt;br /&gt;
&lt;br /&gt;
:Replaces the entity &amp;lt;oldItem&amp;gt; with &amp;lt;newItem&amp;gt; in the inventory, while keeping &amp;lt;oldItem&amp;gt;&#039;s inventory position intact.  Note: The position guarantee only applies if &amp;lt;oldItem&amp;gt; and newItem  share the same category. If the categories are different, the position of &amp;lt;newItem&amp;gt; is likely to be different than the one of &amp;lt;oldItem&amp;gt;.  Note that &amp;lt;oldItem&amp;gt; will be removed from the inventory.  If &amp;lt;newItem&amp;gt; is the $null_entity, &amp;lt;oldItem&amp;gt; is just removed and no replacement happens.  Returns 1 if the operation was successful, 0 otherwise.&lt;br /&gt;
::&#039;&#039;newItem&#039;&#039;: can be $null_entity&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ResetTimer&#039;&#039;&#039;(float stimId); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;resetWeaponProjectile&#039;&#039;&#039;(string weaponName); ====&lt;br /&gt;
&lt;br /&gt;
:Reloads the original projectile def name from the weaponDef. Used to revert a change made by the event changeWeaponProjectile().&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;resetZoom&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Cancels any pending zoom transitions and resets the FOV to normal.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;reskinCollisionModel&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:For use after setSkin() on moveables and static models, if the CM needs to be refreshed to update surface properties after a skin change. CM will be regenerated from the original model file with the new skin.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;respawn&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Respawn&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idItem&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ResponseAdd&#039;&#039;&#039;(float type); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ResponseAllow&#039;&#039;&#039;(float type, entity responder); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ResponseEnable&#039;&#039;&#039;(float type, float state); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
::&#039;&#039;state&#039;&#039;: 0 = disabled, 1 = enabled&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ResponseIgnore&#039;&#039;&#039;(float type, entity responder); ====&lt;br /&gt;
&lt;br /&gt;
:This functions must be called on the stim entity. It will add the response to the ignore list, so that subsequent stims, should not trigger the stim anymore.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ResponseRemove&#039;&#039;&#039;(float type); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ResponseSetAction&#039;&#039;&#039;(float type, string action); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ResponseTrigger&#039;&#039;&#039;(entity source, float stimType); ====&lt;br /&gt;
&lt;br /&gt;
:Fires a response on this entity, without a stim (a stand-alone response, so to say)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;restartPatrol&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;RestartTimer&#039;&#039;&#039;(float stimId); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;restoreAddedEnts&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAFEntity_Base&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;restoreMove&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;restorePosition&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns this entity to the position stored in the &amp;quot;origin&amp;quot; spawn arg. This is the position the entity was spawned in unless the &amp;quot;origin&amp;quot; key is changed. Note that there is no guarantee that the entity won&#039;t be stuck in another entity when moved, so care should be taken to make sure that isn&#039;t possible.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;rightFoot&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Changes to right foot and plays footstep sound.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;, &#039;&#039;idAnimated&#039;&#039;, &#039;&#039;idTestModel&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ropeRemovalCleanup&#039;&#039;&#039;(entity ropeEnt); ====&lt;br /&gt;
&lt;br /&gt;
:Called when rope arrow ropes are removed, removes stale pointers on the player object.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;rotate&#039;&#039;&#039;(vector angleSpeed); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a rotation with the given angular speed. Uses the current speed/time and acceleration and deceleration settings.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;rotateDownTo&#039;&#039;&#039;(float axis, float angle); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a rotation about the given axis by decreasing the current angle towards the given angle. Uses the current speed/time and acceleration and deceleration settings.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;rotateOnce&#039;&#039;&#039;(vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a rotation towards the current angles plus the given Euler angles. Uses the current speed/time and acceleration and deceleration settings.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;rotateTo&#039;&#039;&#039;(vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a rotation towards the given Euler angles. Uses the current speed/time and acceleration and deceleration settings.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;rotateUpTo&#039;&#039;&#039;(float axis, float angle); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a rotation about the given axis by increasing the current angle towards the given angle. Uses the current speed/time and acceleration and deceleration settings.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;saveConDump&#039;&#039;&#039;(string cmd, string cmd); ====&lt;br /&gt;
&lt;br /&gt;
:Saves condump into FM directory; first argument is appended to dump filename, everything before last occurence of second argument is removed&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;saveGame&#039;&#039;&#039;(string filename); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;saveMove&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;say&#039;&#039;&#039;(string text); ====&lt;br /&gt;
&lt;br /&gt;
:Multiplayer - Print this line on the network&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;scaleVine&#039;&#039;&#039;(float factor); ====&lt;br /&gt;
&lt;br /&gt;
:Event called using vine.*()&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;tdmVine&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;selectWeapon&#039;&#039;&#039;(string weapon); ====&lt;br /&gt;
&lt;br /&gt;
:Selects the weapon the player is holding.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;sessionCommand&#039;&#039;&#039;(string cmd); ====&lt;br /&gt;
&lt;br /&gt;
:Sends the sessioncommand to the game&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setActiveInventoryMapEnt&#039;&#039;&#039;(entity mapEnt); ====&lt;br /&gt;
&lt;br /&gt;
:Notify the player about a new active map entity. This clears out any previously active maps.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAcuity&#039;&#039;&#039;(string type, float val); ====&lt;br /&gt;
&lt;br /&gt;
:ai generalized alerts&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAirAccelerate&#039;&#039;&#039;(float newAccelerate); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a multiplier for the player&#039;s horizontal acceleration while airborne. Default is 1.0.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAlertGracePeriod&#039;&#039;&#039;(float frac, float duration, float count); ====&lt;br /&gt;
&lt;br /&gt;
:This starts the alert grace period for an AI. Should be called in the same frame as the alert that pushes them into a higher state.&lt;br /&gt;
::&#039;&#039;frac&#039;&#039;: the fraction of the alert below which they should ignore alerts during the grace period.&lt;br /&gt;
::&#039;&#039;duration&#039;&#039;: the duration of the period in seconds&lt;br /&gt;
::&#039;&#039;count&#039;&#039;: the number of alerts ignored above which the grace period is invalid&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAlertLevel&#039;&#039;&#039;(float newLevel); ====&lt;br /&gt;
&lt;br /&gt;
:Set the alert level (AI_AlertLevel). This should always be called instead of setting AI_AlertLevel directly.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAngles&#039;&#039;&#039;(vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the current orientation of this entity (relative to bind parent if any)&lt;br /&gt;
::&#039;&#039;angles&#039;&#039;: the new orientation&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAngularVelocity&#039;&#039;&#039;(vector velocity); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the current angular velocity of this entity. The angular velocity of a physics object is a vector that passes through the center of mass. The direction of this vector defines the axis of rotation and the magnitude defines the rate of rotation about the axis in radians per second.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAngularVelocityB&#039;&#039;&#039;(vector velocity, float id); ====&lt;br /&gt;
&lt;br /&gt;
:Set the angular velocity of a particular body&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAFEntity_Base&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAnimPrefix&#039;&#039;&#039;(string prefix); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a string which is placed in front of any animation names.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;setAnimRate&#039;&#039;&#039;(float channel, string animName, float animRate); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the animation rate to the given value. Returns 1 if successful, otherwise -1&lt;br /&gt;
::&#039;&#039;animName&#039;&#039;: The name of the animation.&lt;br /&gt;
::&#039;&#039;animRate&#039;&#039;: The rate to set the animation to.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAttackFlag&#039;&#039;&#039;(float combatType, float enabled); ====&lt;br /&gt;
&lt;br /&gt;
:Activate or deactivate the given attack flag&lt;br /&gt;
::&#039;&#039;combatType&#039;&#039;: see tdm_defs.script for possible enum values&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAudThresh&#039;&#039;&#039;(float val); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setBlendFrames&#039;&#039;&#039;(float channel, float blendFrame); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the number of frames to blend between animations on the given channel.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;, &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setBoneMod&#039;&#039;&#039;(float allowBoneMod); ====&lt;br /&gt;
&lt;br /&gt;
:Enables or disables head looking (may be obsolete).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setCamera&#039;&#039;&#039;(entity cameraEnt); ====&lt;br /&gt;
&lt;br /&gt;
:Turns over view control to the given camera entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setClipMask&#039;&#039;&#039;(float clipMask); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the clipmask of the physics object.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setColor&#039;&#039;&#039;(float parm0, float parm1, float parm2); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the RGB color of this entity (shader parms Parm0, Parm1, Parm2). See also setColorVec for a variant that accepts a vector instead.&lt;br /&gt;
::&#039;&#039;parm0&#039;&#039;: red&lt;br /&gt;
::&#039;&#039;parm1&#039;&#039;: green&lt;br /&gt;
::&#039;&#039;parm2&#039;&#039;: blue&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setColorVec&#039;&#039;&#039;(vector newColor); ====&lt;br /&gt;
&lt;br /&gt;
:Similar to setColor, but accepts the new RGB color as a vector instead of 3 different floats.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;SetConstraintPosition&#039;&#039;&#039;(string constraintName, vector position); ====&lt;br /&gt;
&lt;br /&gt;
:Moves the constraint with the given name that binds this entity to another entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAFEntity_Base&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setContents&#039;&#039;&#039;(float contents); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the contents of the physics object.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setController&#039;&#039;&#039;(entity playerController); ====&lt;br /&gt;
&lt;br /&gt;
:Let a player assume movement control of an AI vehicle (may be remote control as in a player on a coach pulled by a horse)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CAIVehicle&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;setCurInvCategory&#039;&#039;&#039;(string categoryName); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the inventory cursor to the first item of the named category. Returns 1 on success, 0 on failure (e.g. wrong category name)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;setCurInvItem&#039;&#039;&#039;(string itemName); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the inventory cursor to the named item. Returns: the item entity of the newly selected item (can be $null_entity).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setcvar&#039;&#039;&#039;(string name, string value); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a cvar.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setDroppable&#039;&#039;&#039;(float droppable); ====&lt;br /&gt;
&lt;br /&gt;
:Set whether an item may be dropped from the inventory. &lt;br /&gt;
::&#039;&#039;droppable&#039;&#039;: if non-zero the item becomes droppable, when called with 0 the item becomes non-droppable&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setEnemy&#039;&#039;&#039;(entity enemy); ====&lt;br /&gt;
&lt;br /&gt;
:Make the given entity an enemy.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setEntityRelation&#039;&#039;&#039;(entity ent, float relation); ====&lt;br /&gt;
&lt;br /&gt;
:Set a relation to another entity, this can be friendly (&amp;gt;0), neutral(0) or hostile (&amp;lt;0)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setFlyOffset&#039;&#039;&#039;(float offset); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the preferred height relative to the player&#039;s view height to fly at.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setFlySpeed&#039;&#039;&#039;(float speed); ====&lt;br /&gt;
&lt;br /&gt;
:Set the speed flying creatures move at. Also sets speed for moveTypeSlide.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setFrobable&#039;&#039;&#039;(float frobable); ====&lt;br /&gt;
&lt;br /&gt;
:Set whether the entity is frobable&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setFrobActionScript&#039;&#039;&#039;(string frobActionScript); ====&lt;br /&gt;
&lt;br /&gt;
:Changes the frob action script of this entity. Also updates the &#039;frob_action_script&#039; spawnarg.&lt;br /&gt;
::&#039;&#039;frobActionScript&#039;&#039;: the new script to call when the entity is frobbed&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setFrobMaster&#039;&#039;&#039;(entity master); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the passed entity as the frob master. Pass null_entity to remove the current frob master, if any.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setFrobOnlyUsedByInv&#039;&#039;&#039;(float OnOff); ====&lt;br /&gt;
&lt;br /&gt;
:Engages or disengages a mode where we only frobhilight entities that can be used by our current inventory item. This also disables general frobactions and only allows &amp;quot;used by&amp;quot; frob actions.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setGravity&#039;&#039;&#039;(vector newGravity); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a new gravity vector for this entity. Note that non-upright vectors are poorly supported at present.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setGui&#039;&#039;&#039;(float handle, string guiFile); ====&lt;br /&gt;
&lt;br /&gt;
:Loads a new file into an existing GUI.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setGuiFloat&#039;&#039;&#039;(float handle, string key, float val); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a GUI parameter.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setGuiInt&#039;&#039;&#039;(float handle, string key, float val); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a GUI parameter.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setGuiString&#039;&#039;&#039;(float handle, string key, string val); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a GUI parameter.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setGuiStringFromKey&#039;&#039;&#039;(float handle, string key, entity src, string srcKey); ====&lt;br /&gt;
&lt;br /&gt;
:This is a kludge. It is equivelant to: setGuiString( handle, key, src.getKey(srcKey) ) However, it&#039;s used to bypass the 127 char size limit on script strings.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setHealth&#039;&#039;&#039;(float health); ====&lt;br /&gt;
&lt;br /&gt;
:Use these to set the health of AI or players (this also updates the AI_DEAD flag)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setHinderance&#039;&#039;&#039;(string source, float mCap, float fCap); ====&lt;br /&gt;
&lt;br /&gt;
:Used to set hinderance from a source.&lt;br /&gt;
::&#039;&#039;mCap&#039;&#039;: mCap values from all sources are multiplied together to define a cap&lt;br /&gt;
::&#039;&#039;fCap&#039;&#039;: fCap values are not additive, the smallest one among all the sources is used&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setImmobilization&#039;&#039;&#039;(string source, float type); ====&lt;br /&gt;
&lt;br /&gt;
:Used to set immobilization from a source. Warning: Not a finalized version. It&#039;s subject to change, so use it at your own risk.)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setJointAngle&#039;&#039;&#039;(float jointnum, float transform_type, vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Modifies the orientation of the joint based on the transform type.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAnimatedEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setJointPos&#039;&#039;&#039;(float jointnum, float transform_type, vector pos); ====&lt;br /&gt;
&lt;br /&gt;
:Modifies the position of the joint based on the transform type.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAnimatedEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setKey&#039;&#039;&#039;(string key, string value); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a key on this entity&#039;s spawn args. Note that most spawn args are evaluated when this entity spawns in, so this will not change the entity&#039;s behavior in most cases. This is chiefly for saving data the script needs in an entity for later retrieval.&lt;br /&gt;
::&#039;&#039;key&#039;&#039;: the spawnarg to set&lt;br /&gt;
::&#039;&#039;value&#039;&#039;: the value to store&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setLightgemModifier&#039;&#039;&#039;(string modifierName, float value); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the named lightgem modifier to a certain value. An example would be the player lantern: setLightgemModifier(&amp;quot;lantern&amp;quot;, 32). This way multiple modifiers can be set by concurrent script threads.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setLightOrigin&#039;&#039;&#039;(vector pos); ====&lt;br /&gt;
&lt;br /&gt;
:Set origin of lights independent of model origin&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idLight&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setLightParm&#039;&#039;&#039;(float parmNum, float value); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a shader parameter.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idLight&#039;&#039;, &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setLightParms&#039;&#039;&#039;(float parm0, float parm1, float parm2, float parm3); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the red/green/blue/alpha shader parms on the light and the model.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idLight&#039;&#039;, &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setLinearVelocity&#039;&#039;&#039;(vector velocity); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the current linear velocity of this entity in units per second. The linear velocity of a physics object is a vector that defines the translation of the center of mass in units per second.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setLinearVelocityB&#039;&#039;&#039;(vector velocity, float id); ====&lt;br /&gt;
&lt;br /&gt;
:Set the linear velocity of a particular body&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAFEntity_Base&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setMaxHealth&#039;&#039;&#039;(float maxHealth); ====&lt;br /&gt;
&lt;br /&gt;
:Use these to set the max health of AI or players. Note that the health bar GUI is limited to showing a max health of 100. If health exceeds max health after this, health will be set to be equal to max health (which would also update the AI_DEAD flag)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setModel&#039;&#039;&#039;(string modelName); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the model this entity uses&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setMoveType&#039;&#039;&#039;(float movetype); ====&lt;br /&gt;
&lt;br /&gt;
:Set the current movetype.  movetypes are defined in tdm_ai.script&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setName&#039;&#039;&#039;(string name); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the name of this entity.&lt;br /&gt;
::&#039;&#039;name&#039;&#039;: the new name&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setNeverDormant&#039;&#039;&#039;(float enable); ====&lt;br /&gt;
&lt;br /&gt;
:enables or prevents an entity from going dormant&lt;br /&gt;
::&#039;&#039;enable&#039;&#039;: 1 = enable, 0 = disable&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setNextState&#039;&#039;&#039;(string stateFunc); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the next state and waits until thread exits, or a frame delay before calling it. Handy for setting the state in the constructor.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setObjectiveComp&#039;&#039;&#039;(float ObjNum, float CompNum, float state); ====&lt;br /&gt;
&lt;br /&gt;
:Used to set the state of custom objective components&lt;br /&gt;
::&#039;&#039;ObjNum&#039;&#039;: objective number. Starts counting at 1&lt;br /&gt;
::&#039;&#039;CompNum&#039;&#039;: component number. Starts counting at 1&lt;br /&gt;
::&#039;&#039;state&#039;&#039;: 1 or 0 for true or false&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setObjectiveEnabling&#039;&#039;&#039;(float ObjNum, string strIn); ====&lt;br /&gt;
&lt;br /&gt;
:Set an objective&#039;s enabling objectives (objectives that must be completed before that objective may be completed).&lt;br /&gt;
::&#039;&#039;strIn&#039;&#039;: takes the form of a string that is a space-delimited list of integer objectives representing the new enabling objectives. E.g. : &#039;1 2 3 4&#039;&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setObjectiveNotification&#039;&#039;&#039;(float ObjNote); ====&lt;br /&gt;
&lt;br /&gt;
:Turns the notifications (sound ++ text) for objectives on/off.&lt;br /&gt;
::&#039;&#039;ObjNote&#039;&#039;: Turn notifications on/off&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setObjectiveOngoing&#039;&#039;&#039;(float ObjNum, float val); ====&lt;br /&gt;
&lt;br /&gt;
:Sets objective ongoing.&lt;br /&gt;
::&#039;&#039;val&#039;&#039;: 1 for true, 0 for false&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setObjectiveOptional&#039;&#039;&#039;(float ObjNum, float val); ====&lt;br /&gt;
&lt;br /&gt;
:Sets objective mandatory.&lt;br /&gt;
::&#039;&#039;val&#039;&#039;: 1 for true, 0 for false&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setObjectiveState&#039;&#039;&#039;(float ObjNum, float State); ====&lt;br /&gt;
&lt;br /&gt;
:Used to set the state of objectives from the script. For example, use this to invalidate an objective when something happens in your mission. The first argument is the numerical index of the objective (taking &#039;user&#039; objective indices, starting at 1). Choose from the following for the second argument: OBJ_INCOMPLETE, OBJ_COMPLETE, OBJ_INVALID, OBJ_FAILED. Use this on $player1 like $player1.setObjectiveState(1, OBJ_COMPLETE);&lt;br /&gt;
::&#039;&#039;ObjNum&#039;&#039;: Starts counting at 1&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setObjectiveText&#039;&#039;&#039;(float ObjNum, string newText); ====&lt;br /&gt;
&lt;br /&gt;
:Modify the displayed text for an objective. Can also be a string template like #str_20000&lt;br /&gt;
::&#039;&#039;ObjNum&#039;&#039;: Starts counting at 1&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setObjectiveVisible&#039;&#039;&#039;(float ObjNum, float val); ====&lt;br /&gt;
&lt;br /&gt;
:Sets objective visibility.&lt;br /&gt;
::&#039;&#039;val&#039;&#039;: 1 for true, 0 for false&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setOrigin&#039;&#039;&#039;(vector origin); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the current position of this entity (relative to it&#039;s bind parent if any)&lt;br /&gt;
::&#039;&#039;origin&#039;&#039;: the new origin&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setOwner&#039;&#039;&#039;(entity owner); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the owner of this entity. Entities will never collide with their owner.&lt;br /&gt;
::&#039;&#039;owner&#039;&#039;: the entity which will be made owner of this entity&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setPeekOverlayBackground&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the background overlay for peeking, depending on aspect ratio.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setPeekView&#039;&#039;&#039;(float OnOff, vector origin); ====&lt;br /&gt;
&lt;br /&gt;
:Toggle whether we should use a view from a peek entity as the player&#039;s view&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setPersistentArg&#039;&#039;&#039;(string key, string value); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a key/value pair that persists between maps&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setPortAISoundLoss&#039;&#039;&#039;(float handle, float value); ====&lt;br /&gt;
&lt;br /&gt;
:AI sound propagation scriptfunction on the sys object&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setPortPlayerSoundLoss&#039;&#039;&#039;(float handle, float value); ====&lt;br /&gt;
&lt;br /&gt;
:Player sound loss scriptfunction on the sys object&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setPortSoundLoss&#039;&#039;&#039;(float handle, float value); ====&lt;br /&gt;
&lt;br /&gt;
:Sound propagation scriptfunction on the sys object&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setPrime&#039;&#039;&#039;(entity vine); ====&lt;br /&gt;
&lt;br /&gt;
:Event called using vine.*()&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;tdmVine&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setRadius&#039;&#039;&#039;(float radius); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the size of the bounding box, x=y=z=radius.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idLight&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setRadiusXYZ&#039;&#039;&#039;(float x, float y, float z); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the width/length/height of the light bounding box.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idLight&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setRelation&#039;&#039;&#039;(float team1, float team2, float val); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setReplacementAnim&#039;&#039;&#039;(string animToReplace, string replacement); ====&lt;br /&gt;
&lt;br /&gt;
:Replaces the animation &amp;quot;animToReplace&amp;quot; with &amp;quot;replacement&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSavePermissions&#039;&#039;&#039;(float permission); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
::&#039;&#039;permission&#039;&#039;: 0&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSecretsFound&#039;&#039;&#039;(float secrets); ====&lt;br /&gt;
&lt;br /&gt;
:Set how many secrets the player has found. Use getMissionStatistic() for getting the current value.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSecretsTotal&#039;&#039;&#039;(float secrets); ====&lt;br /&gt;
&lt;br /&gt;
:Set how many secrets exist in the map in total. Use getMissionStatistic() for getting the current value.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setShader&#039;&#039;&#039;(string shader); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the shader to be used for the light.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idLight&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setShaderParm&#039;&#039;&#039;(float parm, float value); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the value of the specified shader parm.&lt;br /&gt;
::&#039;&#039;parm&#039;&#039;: shader parm index&lt;br /&gt;
::&#039;&#039;value&#039;&#039;: new value&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;, &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setShaderParms&#039;&#039;&#039;(float parm0, float parm1, float parm2, float parm3); ====&lt;br /&gt;
&lt;br /&gt;
:Sets shader parms Parm0, Parm1, Parm2, and Parm3 (red, green, blue, and alpha respectively).&lt;br /&gt;
::&#039;&#039;parm0&#039;&#039;: red&lt;br /&gt;
::&#039;&#039;parm1&#039;&#039;: green&lt;br /&gt;
::&#039;&#039;parm2&#039;&#039;: blue&lt;br /&gt;
::&#039;&#039;parm3&#039;&#039;: alpha&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSightThreshold&#039;&#039;&#039;(float sightThreshold); ====&lt;br /&gt;
&lt;br /&gt;
:Set the sight threshold of the security camera: how lit up the player&#039;s lightgem needs to be in order to be seen. 0.0 to 1.0&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idSecurityCamera&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSize&#039;&#039;&#039;(vector min, vector max); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the size of this entity&#039;s bounding box.&lt;br /&gt;
::&#039;&#039;min&#039;&#039;: minimum corner coordinates&lt;br /&gt;
::&#039;&#039;max&#039;&#039;: maximum corner coordinates&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSkin&#039;&#039;&#039;(string skinName); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the skin this entity uses.  Set to &amp;quot;&amp;quot; to turn off the skin.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSmoke&#039;&#039;&#039;(string particleDef); ====&lt;br /&gt;
&lt;br /&gt;
:Changes the smoke particle of a func_smoke.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idFuncSmoke&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSmokeVisibility&#039;&#039;&#039;(float particle_num, float on); ====&lt;br /&gt;
&lt;br /&gt;
:enables/disables smoke particles on bones.  pass in the particle #, or ALL_PARTICLES for turning on/off all particle systems. particles are spawned in the order they appear in the entityDef&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSolid&#039;&#039;&#039;(float solidity); ====&lt;br /&gt;
&lt;br /&gt;
:Set the solidity of the entity. If the entity has never been solid before it will be assigned solid and opaque contents/clip masks.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSoundLoss&#039;&#039;&#039;(float loss); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the sound loss value (dB).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPortalEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSoundVolume&#039;&#039;&#039;(float newLevel); ====&lt;br /&gt;
&lt;br /&gt;
:Set the volume of the sound to play, must be issued before startSoundShader.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSpawnArg&#039;&#039;&#039;(string key, string value); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a key/value pair to be used when a new entity is spawned.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSpyglassOverlayBackground&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the background overlay for the spyglass, depending on aspect ratio.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setStartedOff&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idLight&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setState&#039;&#039;&#039;(string stateFunc); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the next state and goes to it immediately&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSyncedAnimWeight&#039;&#039;&#039;(float channel, float animindex, float weight); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the blend amount on multi-point anims.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setTalkState&#039;&#039;&#039;(float state); ====&lt;br /&gt;
&lt;br /&gt;
:Sets whether the player can talk to this character or not.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setTalkTarget&#039;&#039;&#039;(entity target); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the entity (player) trying to talk to the character&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setTeam&#039;&#039;&#039;(float newTeam); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the team number of this entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;SetTimerState&#039;&#039;&#039;(float stimId, float state); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setTurnHinderance&#039;&#039;&#039;(string source, float mCap, float fCap); ====&lt;br /&gt;
&lt;br /&gt;
:Set the hinderance on the view turning from a source&lt;br /&gt;
::&#039;&#039;mCap&#039;&#039;: mCap values from all sources are multiplied together to define a cap&lt;br /&gt;
::&#039;&#039;fCap&#039;&#039;: fCap values are not additive, the smallest one among all the sources is used&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setTurnRate&#039;&#039;&#039;(float rate); ====&lt;br /&gt;
&lt;br /&gt;
:Set the rate the character turns at&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setUsedBy&#039;&#039;&#039;(entity ent, float b_canUse); ====&lt;br /&gt;
&lt;br /&gt;
:Allows to change which entities can use this entity.&lt;br /&gt;
::&#039;&#039;ent&#039;&#039;: specify an entity here, like a key&lt;br /&gt;
::&#039;&#039;b_canUse&#039;&#039;: whether the specified entity can use this entity&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setViewAngles&#039;&#039;&#039;(vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the player view angles, e.g. make the player facing this direction. 0 0 0 is east (along the X axis in DR), 0 90 0 north (along the Y axis in DR) 0 180 0 west, 0 270 0 south.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setWatered&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Event called using vine.*()&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;tdmVine&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setWorldOrigin&#039;&#039;&#039;(vector origin); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the current position of this entity (regardless of any bind parent).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;shooterFireProjectile&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Fires a projectile.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;tdmFuncShooter&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;shooterGetAmmo&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get the ammonition&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;tdmFuncShooter&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;shooterGetState&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current state of this shooter.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;tdmFuncShooter&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;shooterSetAmmo&#039;&#039;&#039;(float newAmmo); ====&lt;br /&gt;
&lt;br /&gt;
:Set the ammonition&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;tdmFuncShooter&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;shooterSetState&#039;&#039;&#039;(float state); ====&lt;br /&gt;
&lt;br /&gt;
:Activates / deactivates the shooter entity.&lt;br /&gt;
::&#039;&#039;state&#039;&#039;: 1 = active, 0 = inactive&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;tdmFuncShooter&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;show&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Makes this entity visible if it has a model.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;showAttachment&#039;&#039;&#039;(string attName, float show); ====&lt;br /&gt;
&lt;br /&gt;
:Show or hide an attachment.&lt;br /&gt;
::&#039;&#039;show&#039;&#039;: 1 shows attachment, 0 hides it.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;, &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;showAttachmentInd&#039;&#039;&#039;(float index, float show); ====&lt;br /&gt;
&lt;br /&gt;
:Show or hide an attachment by array index.&lt;br /&gt;
::&#039;&#039;index&#039;&#039;: starts at 0&lt;br /&gt;
::&#039;&#039;show&#039;&#039;: 1 shows attachment, 0 hides it.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;, &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;shrivel&#039;&#039;&#039;(float time); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;sin&#039;&#039;&#039;(float degrees); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the sine of the given angle in degrees.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;slideTo&#039;&#039;&#039;(vector position, float time); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;smoking&#039;&#039;&#039;(float state); ====&lt;br /&gt;
&lt;br /&gt;
:flame is now smoking (1), or not (0)&lt;br /&gt;
::&#039;&#039;state&#039;&#039;: 1 = smoking, 0 = not smoking&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idLight&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;spawn&#039;&#039;&#039;(string classname); ====&lt;br /&gt;
&lt;br /&gt;
:Creates an entity of the specified classname and returns a reference to the entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;SpawnFloat&#039;&#039;&#039;(string key, float default); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the floating point value for the given spawn argument.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;SpawnString&#039;&#039;&#039;(string key, string default); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the string for the given spawn argument.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;spawnThrowableProjectile&#039;&#039;&#039;(string projectileName, string jointName); ====&lt;br /&gt;
&lt;br /&gt;
:This method spawns a projectile of the type named by the caller and attaches it to the joint given by the caller.  The projectile becomes the AI&#039;s firable projectile. Returns a pointer to a projectile entity that can be  thrown by the AI. You can use AI_LaunchMissle (e* = launchMissle(v,v) ) to throw the stone.&lt;br /&gt;
::&#039;&#039;projectileName&#039;&#039;: The name of the projectile to spawn (as seen in a .def file) Must be descended from idProjectile&lt;br /&gt;
::&#039;&#039;jointName&#039;&#039;: The name of the joint on the model to which the particle should be attached for throwing. If this is NULL or the empty string, then it is attached to the model center.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;SpawnVector&#039;&#039;&#039;(string key, vector default); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the vector for the given spawn argument.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;speed&#039;&#039;&#039;(float speed); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the movement speed. Set this speed before initiating a new move.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;sqrt&#039;&#039;&#039;(float square); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the square root of the given number.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;start&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Starts a spline or anim camera moving.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idCameraAnim&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;startFx&#039;&#039;&#039;(string fx); ====&lt;br /&gt;
&lt;br /&gt;
:Starts an FX on this entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;startGamePlayTimer&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Resets the game play timer to zero and (re)starts it.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;startMouseGesture&#039;&#039;&#039;(float key, float thresh, float test, float inverted, float turnHinderance, float decideTime, float deadTime); ====&lt;br /&gt;
&lt;br /&gt;
:Start tracking a mouse gesture that started when the key impulse was pressed. Discretizes analog mouse movement into a few different gesture possibilities. Impulse arg can also be a button, see the UB_* enum in usercmdgen.h. For now, only one mouse gesture check at a time.&lt;br /&gt;
::&#039;&#039;thresh&#039;&#039;: Waits until the threshold mouse input thresh is reached before deciding.&lt;br /&gt;
::&#039;&#039;test&#039;&#039;: determines which test to do (0 = up/down, 1 = left/right, 2 = 4 directions, 3 = 8 directions).&lt;br /&gt;
::&#039;&#039;inverted&#039;&#039;: inverts the movement if set to 1, does not if 0&lt;br /&gt;
::&#039;&#039;turnHinderance&#039;&#039;: Sets the max player view turn rate when checking this mouse gesture (0 =&amp;gt; player view locked, 1.0 =&amp;gt; no effect on view turning)&lt;br /&gt;
::&#039;&#039;decideTime&#039;&#039;: time in milliseconds after which the mouse gesture is auto-decided, in the event that the mouse movement threshold was not reached. A DecideTime of -1 means wait forever until the button is released.&lt;br /&gt;
::&#039;&#039;deadTime&#039;&#039;: how long after attack is pressed that mouse control remains dampened by the fraction turnHinderance.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;startRagdoll&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Switches to a ragdoll taking over the animation.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAnimated&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;startSound&#039;&#039;&#039;(string sound, float channel, float netSync); ====&lt;br /&gt;
&lt;br /&gt;
:Plays the sound specified by the snd_* key/value pair on the channel and returns the length of the sound in seconds. This is the preferred method for playing sounds on an entity since it ensures that the sound is precached.&lt;br /&gt;
::&#039;&#039;sound&#039;&#039;: the spawnarg to reference, e.g. &#039;snd_move&#039;&lt;br /&gt;
::&#039;&#039;channel&#039;&#039;: the channel to play on&lt;br /&gt;
::&#039;&#039;netSync&#039;&#039;: -&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;startSoundShader&#039;&#039;&#039;(string shaderName, float channel); ====&lt;br /&gt;
&lt;br /&gt;
:Plays a specific sound shader on the channel and returns the length of the sound in seconds. This is not the preferred method of playing a sound since you must ensure that the sound is loaded.&lt;br /&gt;
::&#039;&#039;shaderName&#039;&#039;: the sound shader to play&lt;br /&gt;
::&#039;&#039;channel&#039;&#039;: the channel to play the sound on&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;startSpline&#039;&#039;&#039;(entity spline); ====&lt;br /&gt;
&lt;br /&gt;
:Starts moving along a spline stored on the given entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;StartTimer&#039;&#039;&#039;(float stimId); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;startZoom&#039;&#039;&#039;(float duration, float startFOV, float endFOV); ====&lt;br /&gt;
&lt;br /&gt;
:Call this to start the zoom in event. The player FOV is gradually zoomed in until over the given timespan.&lt;br /&gt;
::&#039;&#039;duration&#039;&#039;: duration of the transition in msec&lt;br /&gt;
::&#039;&#039;startFOV&#039;&#039;: The start FOV, this is clamped to [1..179]&lt;br /&gt;
::&#039;&#039;endFOV&#039;&#039;: The end FOV, this is clamped to [1..179]&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;state_light&#039;&#039;&#039;(float set); ====&lt;br /&gt;
&lt;br /&gt;
:Switches the spotlight on or off. Respects the security camera&#039;s power state.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idSecurityCamera&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;state_see_AI&#039;&#039;&#039;(float set); ====&lt;br /&gt;
&lt;br /&gt;
:Set whether the camera can see AIs.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idSecurityCamera&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;state_see_animals&#039;&#039;&#039;(float set); ====&lt;br /&gt;
&lt;br /&gt;
:Set whether the camera can see animals. Checked after seeAI or seeBodies.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idSecurityCamera&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;state_see_bodies&#039;&#039;&#039;(float set); ====&lt;br /&gt;
&lt;br /&gt;
:Set whether the camera can see bodies.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idSecurityCamera&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;state_see_player&#039;&#039;&#039;(float set); ====&lt;br /&gt;
&lt;br /&gt;
:Set whether the camera can see the player.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idSecurityCamera&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;state_sweep&#039;&#039;&#039;(float set); ====&lt;br /&gt;
&lt;br /&gt;
:Enables or disables the camera&#039;s sweeping.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idSecurityCamera&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;StimAdd&#039;&#039;&#039;(float type, float radius); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;StimClearIgnoreList&#039;&#039;&#039;(float type); ====&lt;br /&gt;
&lt;br /&gt;
:This clears the ignore list for the stim of the given type It can be used if an entity changes state in some way that it would no longer be ignored&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;StimEmit&#039;&#039;&#039;(float type, float radius, vector stimOrigin); ====&lt;br /&gt;
&lt;br /&gt;
:Emits a stim in a radius around the specified origin. The entity from which this event is called needs to have the corresponding stim setup on itself, it does not need to be active.&lt;br /&gt;
::&#039;&#039;type&#039;&#039;: Index ID of the stim to emit, i.e. 21 or STIM_TRIGGER for a trigger stim.&lt;br /&gt;
::&#039;&#039;radius&#039;&#039;: How far the stim will reach. Pass negative to use the radius settings on the entity.&lt;br /&gt;
::&#039;&#039;stimOrigin&#039;&#039;: Emit the stim from here.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;StimEnable&#039;&#039;&#039;(float type, float state); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
::&#039;&#039;state&#039;&#039;: 0 = disabled, 1 = enabled&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;StimRemove&#039;&#039;&#039;(float type); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;StimSetScriptBased&#039;&#039;&#039;(float type, float state); ====&lt;br /&gt;
&lt;br /&gt;
:Converts a stim to being script-based. It will only be emitted when a script calls StimEmit on the entity.&lt;br /&gt;
::&#039;&#039;type&#039;&#039;: Index ID of the stim to alter, i.e. 21 or STIM_TRIGGER for a trigger stim.&lt;br /&gt;
::&#039;&#039;state&#039;&#039;: New state.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stop&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Stops a spline or anim camera moving.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idCameraAnim&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopAnim&#039;&#039;&#039;(float channel, float frames); ====&lt;br /&gt;
&lt;br /&gt;
:Stops the animation currently playing on the given channel over the given number of frames.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopFxFov&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopMouseGesture&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopMove&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopMoving&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Stops any translational movement.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopPatrol&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Stops an AI from patrolling&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopRagdoll&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:turns off the ragdoll&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopRotating&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Stops any rotational movement.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopSound&#039;&#039;&#039;(float channel, float netSync); ====&lt;br /&gt;
&lt;br /&gt;
:Stops a specific sound shader on the channel.&lt;br /&gt;
::&#039;&#039;channel&#039;&#039;: the channel to stop playback on&lt;br /&gt;
::&#039;&#039;netSync&#039;&#039;: -&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopSpline&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Stops moving along a spline.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopThinking&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;StopTimer&#039;&#039;&#039;(float stimId); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;strFind&#039;&#039;&#039;(string text, string find, float casesensitive, float start, float end); ====&lt;br /&gt;
&lt;br /&gt;
:Return the position of the given substring, counting from 0, or -1 if not found.&lt;br /&gt;
::&#039;&#039;casesensitive&#039;&#039;: 0&lt;br /&gt;
::&#039;&#039;start&#039;&#039;: 0&lt;br /&gt;
::&#039;&#039;end&#039;&#039;: -1&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;strLeft&#039;&#039;&#039;(string text, float num); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a string composed of the first num characters&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;strLength&#039;&#039;&#039;(string text); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of characters in the string&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;strMid&#039;&#039;&#039;(string text, float start, float num); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a string composed of the characters from start to start + num&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;strRemove&#039;&#039;&#039;(string text, string remove); ====&lt;br /&gt;
&lt;br /&gt;
:Replace all occurances of the given substring with &amp;quot;&amp;quot;. Example: StrRemove(&amp;quot;abba&amp;quot;,&amp;quot;bb&amp;quot;) results in &amp;quot;aa&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;strReplace&#039;&#039;&#039;(string text, string remove, string replace); ====&lt;br /&gt;
&lt;br /&gt;
:Replace all occurances of the given string with the replacement string. Example: StrRemove(&amp;quot;abba&amp;quot;,&amp;quot;bb&amp;quot;,&amp;quot;ccc&amp;quot;) results in &amp;quot;accca&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;strRight&#039;&#039;&#039;(string text, float num); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a string composed of the last num characters&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;strSkip&#039;&#039;&#039;(string text, float num); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the string following the first num characters&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;strToFloat&#039;&#039;&#039;(string text); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the numeric value of the given string.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;strToInt&#039;&#039;&#039;(string text); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the integer value of the given string.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;sway&#039;&#039;&#039;(float speed, float phase, vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a rotation back and forth along the given angles with the given speed and phase.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Switch&#039;&#039;&#039;(float newState); ====&lt;br /&gt;
&lt;br /&gt;
:Move the lever to the on or off position (0 = off).&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CFrobLever&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;switchState&#039;&#039;&#039;(string stateName); ====&lt;br /&gt;
&lt;br /&gt;
:Switches to the state with the given name, current one is ended.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;syncAnimChannels&#039;&#039;&#039;(float fromChannel, float toChannel, float blendFrames); ====&lt;br /&gt;
&lt;br /&gt;
:Synchronises the channels&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idActor&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Tap&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Operates this handle.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CFrobHandle&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;TDM_Lock_OnLockPicked&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:internal&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CBinaryFrobMover&#039;&#039;, &#039;&#039;CFrobLock&#039;&#039;, &#039;&#039;idProjectile&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;TDM_Lock_StatusUpdate&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:internal&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CBinaryFrobMover&#039;&#039;, &#039;&#039;CFrobLock&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;teleportTo&#039;&#039;&#039;(entity other); ====&lt;br /&gt;
&lt;br /&gt;
:Teleports the entity to the position of the other entity, plus a possible offset and random offset (defined on the spawnargs of the entity to be teleported)&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;terminate&#039;&#039;&#039;(float threadNumber); ====&lt;br /&gt;
&lt;br /&gt;
:Terminates a thread.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;testAnimAttack&#039;&#039;&#039;(string animname); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;testAnimMove&#039;&#039;&#039;(string animname); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;testAnimMoveTowardEnemy&#039;&#039;&#039;(string animname); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;testChargeAttack&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;testEvent1&#039;&#039;&#039;(float float_pi, float int_beef, float float_exp, string string_tdm, float float_exp10, float int_food); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;testEvent2&#039;&#039;&#039;(float int_prevres, vector vec_123, float int_food, entity ent_player, entity ent_null, float float_pi, float float_exp); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;testEvent3&#039;&#039;&#039;(entity ent_prevres, vector vec_123, float float_pi, entity ent_player); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;testMeleeAttack&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;testMoveToPosition&#039;&#039;&#039;(vector position); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;threadname&#039;&#039;&#039;(string name); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the name of the current thread.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;throwAF&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;throwMoveable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;time&#039;&#039;&#039;(float time); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the movement time. Set this time before initiating a new move.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idMover&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Toggle&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Turns the forcefield on and off.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idForceField&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;toggle_light&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Toggles the spotlight on/off.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idSecurityCamera&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;toggle_see_AI&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Toggles whether the camera can see AIs.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idSecurityCamera&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;toggle_see_animals&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Toggles whether the camera can see bodies. Checked after seeAI or seeBodies.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idSecurityCamera&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;toggle_see_bodies&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Toggles whether the camera can see bodies.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idSecurityCamera&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;toggle_see_player&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Toggles whether the camera can see the player.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idSecurityCamera&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;toggle_sweep&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Toggles the camera sweep.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idSecurityCamera&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ToggleLock&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Toggles the lock state. Unlocked movers will be locked and vice versa. The notes above concerning Unlock() still apply if this call unlocks the mover. &lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CBinaryFrobMover&#039;&#039;, &#039;&#039;CFrobLock&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ToggleOpen&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Toggles the mover state. Closes when fully open, opens when fully closed. If the mover is &amp;quot;interrupted&amp;quot; (e.g. when the player frobbed the mover in between), the move direction depends on the state of the internal &amp;quot;intent_open&amp;quot; flag. &lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CBinaryFrobMover&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;totalAmmoCount&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Amount of ammo in inventory. since each shot may use more than 1 ammo, this is different than ammoAvailable()&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;touches&#039;&#039;&#039;(entity other); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if this entity touches the other entity.&lt;br /&gt;
::&#039;&#039;other&#039;&#039;: the entity to check against&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;trace&#039;&#039;&#039;(vector start, vector end, vector mins, vector maxs, float contents_mask, entity passEntity); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the fraction of movement completed before the box from &#039;mins&#039; to &#039;maxs&#039; hits solid geometry when moving from &#039;start&#039; to &#039;end&#039;. The &#039;passEntity&#039; is considered non-solid during the move.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;tracePoint&#039;&#039;&#039;(vector start, vector end, float contents_mask, entity passEntity); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the fraction of movement completed before the trace hits solid geometry when moving from &#039;start&#039; to &#039;end&#039;. The &#039;passEntity&#039; is considered non-solid during the move.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;translate&#039;&#039;&#039;(string input); ====&lt;br /&gt;
&lt;br /&gt;
:Translates a string (like #str_12345) into the current language&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;travelDistanceBetweenEntities&#039;&#039;&#039;(entity source, entity dest); ====&lt;br /&gt;
&lt;br /&gt;
:Approximate travel distance between two entities.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;travelDistanceBetweenPoints&#039;&#039;&#039;(vector source, vector dest); ====&lt;br /&gt;
&lt;br /&gt;
:Approximate travel distance between two points.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;travelDistanceToEntity&#039;&#039;&#039;(entity destination); ====&lt;br /&gt;
&lt;br /&gt;
:Approximate travel distance to entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;travelDistanceToPoint&#039;&#039;&#039;(vector destination); ====&lt;br /&gt;
&lt;br /&gt;
:Approximate travel distance to point.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;trigger&#039;&#039;&#039;(entity entityToTrigger); ====&lt;br /&gt;
&lt;br /&gt;
:Triggers the given entity.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;triggerMissionEnd&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;triggerParticles&#039;&#039;&#039;(string jointName); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;turnTo&#039;&#039;&#039;(float yaw); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;turnToEntity&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;turnToPos&#039;&#039;&#039;(vector pos); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;unbind&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Detaches this entity from its master.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Unlock&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Unlocks the mover. Calls to Open() will succeed after this call. Depending on the value of the spawnarg &amp;quot;open_on_unlock&amp;quot; the mover might automatically open after this call. &lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;CBinaryFrobMover&#039;&#039;, &#039;&#039;CFrobLock&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;unpauseGame&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Unpauses the game. Most scripts are not executed during g_stopTime == true and won&#039;t get into the position of calling this.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;useAmmo&#039;&#039;&#039;(float amount); ====&lt;br /&gt;
&lt;br /&gt;
:Eats the specified amount of ammo&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;vecLength&#039;&#039;&#039;(vector vec); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the length of the given vector.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;vecNormalize&#039;&#039;&#039;(vector vec); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the normalized version of the given vector.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;VecRotate&#039;&#039;&#039;(vector vector, vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Rotates a vector by the specified angles.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;VecToAngles&#039;&#039;&#039;(vector vec); ====&lt;br /&gt;
&lt;br /&gt;
:Returns Euler angles for the given direction.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;visScan&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Checks for enemies or player in the AI&#039;s FOV, using light level and distance. For now the check is only done on the player.  Returns a reference to the sighted actor.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;wait&#039;&#039;&#039;(float time); ====&lt;br /&gt;
&lt;br /&gt;
:Suspends execution of the current thread for the given number of seconds.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;, &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;waitAction&#039;&#039;&#039;(string name); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;waitFor&#039;&#039;&#039;(entity mover); ====&lt;br /&gt;
&lt;br /&gt;
:Waits for the given entity to complete its move.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;waitForRender&#039;&#039;&#039;(entity e); ====&lt;br /&gt;
&lt;br /&gt;
:Suspends the current thread until &#039;e&#039; might have been rendered. It&#039;s event based, so it doesn&#039;t waste CPU repeatedly checking inPVS(). e.inPVS() will very likely be true when the thread resumes. If e.inPVS() is true, calling waitForRender() will probably just wait a frame, unless D3 can figure out that the entity doesn&#039;t need to be rendered. Optimizations regarding shadowcasting lights may not apply to this function - it is based purely off whether or not the entity&#039;s bounding box is visible.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;waitForThread&#039;&#039;&#039;(float threadNumber); ====&lt;br /&gt;
&lt;br /&gt;
:Waits for the given thread to terminate.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;waitFrame&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Suspends execution of current thread for one game frame.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idEntity&#039;&#039;, &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;waitMove&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;wakeOnFlashlight&#039;&#039;&#039;(float enable); ====&lt;br /&gt;
&lt;br /&gt;
:Tells the monster to activate when flashlight shines on them.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;wander&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idAI&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;warning&#039;&#039;&#039;(string text); ====&lt;br /&gt;
&lt;br /&gt;
:Issues a warning.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idThread&#039;&#039;&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;wasDamaged&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Check if the player was damaged this frame.&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idPlayer&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;weaponHolstered&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;weaponLowering&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;weaponOutOfAmmo&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;weaponReady&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;weaponReloading&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;weaponRising&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;weaponState&#039;&#039;&#039;(string stateFunction, float blendFrames); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
:Spawnclasses responding to this event: &#039;&#039;idWeapon&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Events by Spawnclass / Entity Type ==&lt;br /&gt;
=== idClass ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;remove&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Removes the entity from the game. For AI, use kill() instead.&lt;br /&gt;
&lt;br /&gt;
=== idActor ===&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;animDistance&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the distance that the anim travels. If the entity has multiple anims with animName, the distance may not match the anim that is played. Use chooseAnim to get a non-random anim and pass that string into animDistance.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;animDone&#039;&#039;&#039;(float channel, float blendOutFrames); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the animation playing on the given channel is completed considering a number of blend frames.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;animIsPaused&#039;&#039;&#039;(float channel); ====&lt;br /&gt;
&lt;br /&gt;
:Return whether the given anim channel is paused&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;animLength&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the length of the anim in seconds. If the entity has multiple anims with animName, length may not match the anim that is played. Use chooseAnim to get a non-random anim and pass that string into animLength.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;animState&#039;&#039;&#039;(float channel, string stateFunction, float blendFrame); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a new animation state script function for the given channel.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;attach&#039;&#039;&#039;(entity ent, string attName); ====&lt;br /&gt;
&lt;br /&gt;
:Attach an entity to the AI. Entity spawnArgs checked for attachments are:  - &amp;quot;origin&amp;quot;, &amp;quot;angles&amp;quot;, and &amp;quot;joint&amp;quot;. These must be set prior to calling attach.&lt;br /&gt;
::&#039;&#039;attName&#039;&#039;: the desired name of the attachment, e.g., &#039;melee_weapon&#039;&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;attachToPos&#039;&#039;&#039;(entity ent, string position, string attName); ====&lt;br /&gt;
&lt;br /&gt;
:Attach an entity to the AI, using a named attachment position&lt;br /&gt;
::&#039;&#039;attName&#039;&#039;: the desired name of the attachment, e.g., &#039;melee_weapon&#039;&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;checkAnim&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Ensures that the animation exists and causes an error if it doesn&#039;t.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;chooseAnim&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Chooses a random anim and returns the name. Useful for doing move tests on anims.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;closestEnemyToPoint&#039;&#039;&#039;(vector point); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the enemy closest to the given location.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disableAnimchannel&#039;&#039;&#039;(float channel); ====&lt;br /&gt;
&lt;br /&gt;
:Used to disable a certain animchannel (for example if the ai is dead)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disableEyeFocus&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Disables eye focus.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;DisableLegIK&#039;&#039;&#039;(float num); ====&lt;br /&gt;
&lt;br /&gt;
:disables leg IK&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disablePain&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Disables pain animations.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;DisableWalkIK&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:disables walk IK&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;dropAttachment&#039;&#039;&#039;(string attName); ====&lt;br /&gt;
&lt;br /&gt;
:Drop the attachment for the given attachment name.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;dropAttachmentInd&#039;&#039;&#039;(float index); ====&lt;br /&gt;
&lt;br /&gt;
:Drop the attachment for the given index.&lt;br /&gt;
::&#039;&#039;index&#039;&#039;: starts at 0&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enableAnim&#039;&#039;&#039;(float channel, float blendFrames); ====&lt;br /&gt;
&lt;br /&gt;
:Enables animation on the given channel.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enableEyeFocus&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Enables eye focus.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;EnableLegIK&#039;&#039;&#039;(float num); ====&lt;br /&gt;
&lt;br /&gt;
:enables leg IK&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enablePain&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Enables pain animations.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;EnableWalkIK&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:enables walk IK&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;finishAction&#039;&#039;&#039;(string action); ====&lt;br /&gt;
&lt;br /&gt;
:Finishes the given wait action.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;finishChannelAction&#039;&#039;&#039;(float channel, string animname); ====&lt;br /&gt;
&lt;br /&gt;
:Overloaded finishAction function for setting the waitstate on each channel separately&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;footstep&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Plays footstep sound.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getAnimList&#039;&#039;&#039;(float channel); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a list of all animations and their anim rates.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getAnimRate&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the rate for the given animation. Returns -1 if animation cannot be found.&lt;br /&gt;
::&#039;&#039;animName&#039;&#039;: The name of the animation.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getAnimState&#039;&#039;&#039;(float channel); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the name of the current animation state script function used for the given channel.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getAttachment&#039;&#039;&#039;(string attName); ====&lt;br /&gt;
&lt;br /&gt;
:Get the attached entity with the given attachment name Will be NULL if the name is invalid or if the entity no longer exists&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getAttachmentInd&#039;&#039;&#039;(float index); ====&lt;br /&gt;
&lt;br /&gt;
:Get the attached entity at the given index. Will be NULL if the index is invalid or the entity no longer exists&lt;br /&gt;
::&#039;&#039;index&#039;&#039;: starts at 0&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getAttackFlag&#039;&#039;&#039;(float combatType); ====&lt;br /&gt;
&lt;br /&gt;
:Returns 1 if the given attack flag is activated.&lt;br /&gt;
::&#039;&#039;combatType&#039;&#039;: see tdm_defs.script for possible enum values&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getBlendFrames&#039;&#039;&#039;(float channel); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of frames to blend between animations on the given channel.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getEyePos&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get eye position of the player and the AI&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getHead&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the entity used for the character&#039;s head, if it has one.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMeleeActPhase&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current melee action phase (holding,recovering,etc).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMeleeActState&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current melee action state (attacking/defending).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMeleeActType&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current melee action type (overhead,thrust,etc.).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMeleeLastActTime&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the melee type of the last attack to hit this actor. Defaults to MELEETYPE_UNBLOCKABLE if we were not hit before.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMeleeLastHitByType&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the game time that the most recent melee action ended (in ms)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMeleeResult&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get the result of the last melee action Follows MELEERESULT_* enum defined in tdm_defs.script&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getNumAttachments&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Return the number of attachments on an AI. Used to iterate through the attachments if desired.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getNumMeleeWeapons&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of melee weapons attached to an actor. This refers to the TDM-style attachments with the spawnarg &#039;is_weapon_melee&#039; set to &#039;1&#039;.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getNumRangedWeapons&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of ranged weapons attached to an actor. This refers to the TDM-style attachments with the spawnarg &#039;is_weapon_ranged&#039; set to &#039;1&#039;.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getPainAnim&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the name of the pain animation.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getState&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the current state.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;hasAnim&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true when an entity has a specific animation.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;hasEnemies&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the actor has one or more enemies.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;idleAnim&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Plays the given idle animation on the given channel.  Returns false if anim doesn&#039;t exist.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;inAnimState&#039;&#039;&#039;(float channel, string stateFunc); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the given animation state script function is currently used for the given channel.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;leftFoot&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Changes to left foot and plays footstep sound.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;lookupReplacementAnim&#039;&#039;&#039;(string anim); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current replacement animation for &amp;quot;anim&amp;quot;. Returns empty if no replacement anim &lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;meleeActionFinished&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Called when the animation for the melee action has finished.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;meleeActionHeld&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Called when the melee action reaches the &amp;quot;hold&amp;quot; point.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;meleeActionReleased&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Called when the melee action is released from the hold point.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;meleeAttackStarted&#039;&#039;&#039;(float attType); ====&lt;br /&gt;
&lt;br /&gt;
:Registers the start of a given melee attack Intended to be called from a script that also starts the animation&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;meleeBestParry&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the melee type integer of the best parry given the enemy attacks at the time If no attacking enemy is found, returns default of MELEETYPE_RL Follows MELEETYPE_* enum defined in tdm_defs.script&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;meleeNameForNum&#039;&#039;&#039;(float num); ====&lt;br /&gt;
&lt;br /&gt;
:Converts a melee type integer to a string name suffix Used for finding the right animation for a given type, etc. Possible names are, in order: &amp;quot;Over, LR, RL, Thrust, General&amp;quot; Where general blocks all attacks types except unblockable&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;meleeParryStarted&#039;&#039;&#039;(float parType); ====&lt;br /&gt;
&lt;br /&gt;
:Registers the start of a given melee parry Intended to be called from a script that also starts the animation&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;nextEnemy&#039;&#039;&#039;(entity lastEnemy); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the next enemy the actor has acquired.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;overrideAnim&#039;&#039;&#039;(float channel); ====&lt;br /&gt;
&lt;br /&gt;
:Disables the animation currently playing on the given channel and syncs the animation with the animation of the nearest animating channel.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;pauseAnim&#039;&#039;&#039;(float channel, float bPause); ====&lt;br /&gt;
&lt;br /&gt;
:Pause all animations playing on the given channel. NOTE: Can also be used used by idWeapons&lt;br /&gt;
::&#039;&#039;bPause&#039;&#039;: true = pause, false = unpause&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;playAnim&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Do not use, this is part of TDM&#039;s internal mechanics. Use playCustomAnim() on AI.in scripts instead of this. Plays the given animation on the given channel. Returns false if anim doesn&#039;t exist.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;playCycle&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Continuously repeats the given animation on the given channel.  Returns false if anim doesn&#039;t exist.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;preventPain&#039;&#039;&#039;(float duration); ====&lt;br /&gt;
&lt;br /&gt;
:Prevents any pain animation from being played for the given time in seconds.&lt;br /&gt;
::&#039;&#039;duration&#039;&#039;: time in seconds&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;reAttachToCoords&#039;&#039;&#039;(string attName, string joint, vector offset, vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Reattach an existing attachment&lt;br /&gt;
::&#039;&#039;attName&#039;&#039;: the name of the attachment we want to reattach. &lt;br /&gt;
::&#039;&#039;joint&#039;&#039;: the name of the joint to attach to&lt;br /&gt;
::&#039;&#039;offset&#039;&#039;: the translation offset from joint&lt;br /&gt;
::&#039;&#039;angles&#039;&#039;: a (pitch, yaw, roll) angle vector that defines the rotation  of the attachment relative to the joint&#039;s orientation&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;reAttachToPos&#039;&#039;&#039;(string attName, string position); ====&lt;br /&gt;
&lt;br /&gt;
:Reattach an existing attachment to a named attachment position. Example: reAttachToPos( melee_weapon, right_hand_held )&lt;br /&gt;
::&#039;&#039;attName&#039;&#039;: the name of the attachment we want to reattach.&lt;br /&gt;
::&#039;&#039;position&#039;&#039;: the new position we want to attach it to.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;reloadTorchReplacementAnims&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:If actor has a torch, reload the torch&#039;s replacement anims.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;removeReplacementAnim&#039;&#039;&#039;(string anim); ====&lt;br /&gt;
&lt;br /&gt;
:Removes the replacement for the given &amp;quot;anim&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;rightFoot&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Changes to right foot and plays footstep sound.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAnimPrefix&#039;&#039;&#039;(string prefix); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a string which is placed in front of any animation names.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;setAnimRate&#039;&#039;&#039;(float channel, string animName, float animRate); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the animation rate to the given value. Returns 1 if successful, otherwise -1&lt;br /&gt;
::&#039;&#039;animName&#039;&#039;: The name of the animation.&lt;br /&gt;
::&#039;&#039;animRate&#039;&#039;: The rate to set the animation to.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAttackFlag&#039;&#039;&#039;(float combatType, float enabled); ====&lt;br /&gt;
&lt;br /&gt;
:Activate or deactivate the given attack flag&lt;br /&gt;
::&#039;&#039;combatType&#039;&#039;: see tdm_defs.script for possible enum values&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setBlendFrames&#039;&#039;&#039;(float channel, float blendFrame); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the number of frames to blend between animations on the given channel.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setNextState&#039;&#039;&#039;(string stateFunc); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the next state and waits until thread exits, or a frame delay before calling it. Handy for setting the state in the constructor.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setReplacementAnim&#039;&#039;&#039;(string animToReplace, string replacement); ====&lt;br /&gt;
&lt;br /&gt;
:Replaces the animation &amp;quot;animToReplace&amp;quot; with &amp;quot;replacement&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setState&#039;&#039;&#039;(string stateFunc); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the next state and goes to it immediately&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSyncedAnimWeight&#039;&#039;&#039;(float channel, float animindex, float weight); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the blend amount on multi-point anims.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;showAttachment&#039;&#039;&#039;(string attName, float show); ====&lt;br /&gt;
&lt;br /&gt;
:Show or hide an attachment.&lt;br /&gt;
::&#039;&#039;show&#039;&#039;: 1 shows attachment, 0 hides it.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;showAttachmentInd&#039;&#039;&#039;(float index, float show); ====&lt;br /&gt;
&lt;br /&gt;
:Show or hide an attachment by array index.&lt;br /&gt;
::&#039;&#039;index&#039;&#039;: starts at 0&lt;br /&gt;
::&#039;&#039;show&#039;&#039;: 1 shows attachment, 0 hides it.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopAnim&#039;&#039;&#039;(float channel, float frames); ====&lt;br /&gt;
&lt;br /&gt;
:Stops the animation currently playing on the given channel over the given number of frames.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;syncAnimChannels&#039;&#039;&#039;(float fromChannel, float toChannel, float blendFrames); ====&lt;br /&gt;
&lt;br /&gt;
:Synchronises the channels&lt;br /&gt;
&lt;br /&gt;
=== idAFEntity_Base ===&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getAngularVelocityB&#039;&#039;&#039;(float id); ====&lt;br /&gt;
&lt;br /&gt;
:Get the angular velocitiy of a particular body Returns (0,0,0) if the body ID is invalid.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getLinearVelocityB&#039;&#039;&#039;(float id); ====&lt;br /&gt;
&lt;br /&gt;
:Get the linear velocitiy of a particular body Returns (0,0,0) if the body ID is invalid.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getNumBodies&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of bodies in the AF. If the AF physics pointer is NULL, it returns 0.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;restoreAddedEnts&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAngularVelocityB&#039;&#039;&#039;(vector velocity, float id); ====&lt;br /&gt;
&lt;br /&gt;
:Set the angular velocity of a particular body&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;SetConstraintPosition&#039;&#039;&#039;(string constraintName, vector position); ====&lt;br /&gt;
&lt;br /&gt;
:Moves the constraint with the given name that binds this entity to another entity.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setLinearVelocityB&#039;&#039;&#039;(vector velocity, float id); ====&lt;br /&gt;
&lt;br /&gt;
:Set the linear velocity of a particular body&lt;br /&gt;
&lt;br /&gt;
=== idAFEntity_Gibbable ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;gib&#039;&#039;&#039;(string damageDefName); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
=== idAFEntity_Generic ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idAFEntity_WithAttachedHead ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== CAIVehicle ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearController&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Need separate clearController because scripting doesn&#039;t like passing in $null_entity? (greebo: one could remove this function and set the argument type of setController to &#039;E&#039;.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;frobRidable&#039;&#039;&#039;(entity playerController); ====&lt;br /&gt;
&lt;br /&gt;
:Called when a player directly mounts or dismounts a ridable AI.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getMoveAnim&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the name of the player-requested movement anim for a player controlled AI vehicle&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setController&#039;&#039;&#039;(entity playerController); ====&lt;br /&gt;
&lt;br /&gt;
:Let a player assume movement control of an AI vehicle (may be remote control as in a player on a coach pulled by a horse)&lt;br /&gt;
&lt;br /&gt;
=== idCombatNode ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;markUsed&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Disables the combat node if &amp;quot;use_once&amp;quot; is set on the entity.&lt;br /&gt;
&lt;br /&gt;
=== idAI ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;alert&#039;&#039;&#039;(string type, float val); ====&lt;br /&gt;
&lt;br /&gt;
:ai generalized alerts&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;alertAI&#039;&#039;&#039;(string type, float amount, entity actor); ====&lt;br /&gt;
&lt;br /&gt;
:internal&lt;br /&gt;
::&#039;&#039;type&#039;&#039;: alert type&lt;br /&gt;
::&#039;&#039;amount&#039;&#039;: alert amount&lt;br /&gt;
::&#039;&#039;actor&#039;&#039;: actor causing alert&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;allowDamage&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:The AI can take damage again.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;allowHiddenMovement&#039;&#039;&#039;(float enable); ====&lt;br /&gt;
&lt;br /&gt;
:Normally, when hidden, monsters do not run physics. This enables physics when hidden.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;allowMovement&#039;&#039;&#039;(float allow); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;animTurn&#039;&#039;&#039;(float angle); ====&lt;br /&gt;
&lt;br /&gt;
:Enable/disable animation controlled turning.&lt;br /&gt;
::&#039;&#039;angle&#039;&#039;: Pass in the maximum # of degrees the animation turns. Use an amount of 0 to disable.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;attackBegin&#039;&#039;&#039;(string damageDef); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;attackEnd&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;attackMelee&#039;&#039;&#039;(string damageDef); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the attack hit&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;attackMissile&#039;&#039;&#039;(string jointName); ====&lt;br /&gt;
&lt;br /&gt;
:returns projectile fired&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;bark&#039;&#039;&#039;(string sound); ====&lt;br /&gt;
&lt;br /&gt;
:Let the AI bark a certain sound.&lt;br /&gt;
::&#039;&#039;sound&#039;&#039;: sound name, e.g. &#039;snd_warn_response&#039;&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;becomeNonSolid&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Makes the moveable non-solid for other entities.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;becomeRagdoll&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:enables the ragdoll if the entity has one&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;becomeSolid&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;burn&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canBecomeSolid&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canHitEnemy&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canHitEnemyFromAnim&#039;&#039;&#039;(string anim); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canHitEnemyFromJoint&#039;&#039;&#039;(string jointname); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canReachEnemy&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if character can walk to enemy&#039;s position. For walking monsters, enemy should be near the floor.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canReachEntity&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if character can walk to entity&#039;s position. For walking monsters, entity should be near the floor.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canReachPosition&#039;&#039;&#039;(vector pos); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if character can walk to specified position. For walking monsters, position should be near the floor.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canSee&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canSeeExt&#039;&#039;&#039;(entity ent, float b_useFOV, float b_useLighting); ====&lt;br /&gt;
&lt;br /&gt;
:This is an alternate version of canSee that can optionally choose to use field of vision and lighting calculations.&lt;br /&gt;
::&#039;&#039;b_useFOV&#039;&#039;: If 0 the entity will be visible even if the AI&#039;s back is turned to it&lt;br /&gt;
::&#039;&#039;b_useLighting&#039;&#039;: If b_useLighting is 0 the entity will be visible in complete darkness. If it is 1, the entity will only be visible if there is light shining on it, but the slightest light is enought. Use &amp;quot;isEntityHidden&amp;quot; as a script event with a threshold instead.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canSeePositionExt&#039;&#039;&#039;(vector position, float b_useFOV, float b_useLighting); ====&lt;br /&gt;
&lt;br /&gt;
:This is an alternate version of canSeeExt that tests a location rather than an entity. Note that any actor at the position may make it not seeable from a distance.&lt;br /&gt;
::&#039;&#039;b_useFOV&#039;&#039;: If 0 the entity will be visible even if the AI&#039;s back is turned to it&lt;br /&gt;
::&#039;&#039;b_useLighting&#039;&#039;: If 0 the entity will be visible in complete darkness&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;chargeAttack&#039;&#039;&#039;(string damageDef); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearBurn&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearEnemy&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Clears the enemy entity&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearFlyOffset&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the preferred height relative to the player&#039;s view height to fly at to the value set in the def file.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;closestReachableEnemy&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Used for determining tactile alert targets&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;closestReachableEnemyOfEntity&#039;&#039;&#039;(entity team_mate); ====&lt;br /&gt;
&lt;br /&gt;
:Finds another character&#039;s closest reachable enemy&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;createMissile&#039;&#039;&#039;(string jointname); ====&lt;br /&gt;
&lt;br /&gt;
:returns projectile created&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;createMissileFromDef&#039;&#039;&#039;(string defName, string jointName); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;directDamage&#039;&#039;&#039;(entity damageTarget, string damageDef); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disableAFPush&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disableClip&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disableGravity&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;dropTorch&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;emptyHand&#039;&#039;&#039;(string hand); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enableAFPush&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enableClip&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enableGravity&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;endState&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Ends the current state with the given name, returns TRUE if more than one state is remaining.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;enemyInCombatCone&#039;&#039;&#039;(entity combatNode, float use_current_enemy_location); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;enemyPositionValid&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;enemyRange&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;enemyRange2D&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;entityInAttackCone&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;faceEnemy&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;faceEntity&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;facingIdeal&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;findActorsInBounds&#039;&#039;&#039;(vector mins, vector maxs); ====&lt;br /&gt;
&lt;br /&gt;
:Returns an entity within the bounds specified&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;findEnemy&#039;&#039;&#039;(float onlyInFov); ====&lt;br /&gt;
&lt;br /&gt;
:Finds enemy player in PVS&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;findEnemyAI&#039;&#039;&#039;(float onlyInFov); ====&lt;br /&gt;
&lt;br /&gt;
:Finds enemy monster in PVS&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;findEnemyInCombatNodes&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Finds enemy player in attack cones&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;findFriendlyAI&#039;&#039;&#039;(float team); ====&lt;br /&gt;
&lt;br /&gt;
:Use this to find a visible AI friendly to ourselves. It basically iterates over all active entities in the map and looks for friendly actors. The pythagorean distance is taken to evaluate the distance.  Don&#039;t call this every frame, this might get expensive in larger maps. Returns the nearest visible actor entity or the $null_entity, if none was found.&lt;br /&gt;
::&#039;&#039;team&#039;&#039;: used to constrain the search to a given team. Set this to -1 to let the code ignore this argument&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;fireMissileAtTarget&#039;&#039;&#039;(string jointname, string targetname); ====&lt;br /&gt;
&lt;br /&gt;
:Launches a missile at entity specified by &#039;attack_target&#039;.  returns projectile fired&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;flee&#039;&#039;&#039;(entity entToFleeFrom); ====&lt;br /&gt;
&lt;br /&gt;
:Flee from the given entity.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;fleeFromPoint&#039;&#039;&#039;(vector pos); ====&lt;br /&gt;
&lt;br /&gt;
:Flee from the given position.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;foundBody&#039;&#039;&#039;(entity body); ====&lt;br /&gt;
&lt;br /&gt;
:Objective callback for when an AI finds a body.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Gas_Knockout&#039;&#039;&#039;(entity inflictor); ====&lt;br /&gt;
&lt;br /&gt;
:AI knockout&lt;br /&gt;
::&#039;&#039;inflictor&#039;&#039;: the entity causing the knockout, can be the $null_entity&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getAcuity&#039;&#039;&#039;(string type); ====&lt;br /&gt;
&lt;br /&gt;
:ai generalized alerts&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getAlertActor&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get the actor that alerted the AI in this frame.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getAlertLevelOfOtherAI&#039;&#039;&#039;(entity otherEntity); ====&lt;br /&gt;
&lt;br /&gt;
:This event gets the alert number of another AI (AI_AlertLevel variable value) Returns the alert number of the other AI, 0.0 if its not an AI or is NULL&lt;br /&gt;
::&#039;&#039;otherEntity&#039;&#039;: the other AI entity who&#039;s alert number is being queried&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getAttacker&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the attacking entity&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getAudThresh&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getClosestHiddenTarget&#039;&#039;&#039;(string entity_type); ====&lt;br /&gt;
&lt;br /&gt;
:Finds the closest targeted entity of the specified type.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getCombatNode&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getCurrentYaw&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getEnemy&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getEnemyEyePos&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getEnemyPos&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getJumpVelocity&#039;&#039;&#039;(vector pos, float speed, float max_jump_height); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMoveType&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current movetype&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getNextIdleAnim&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:This returns the name of the next idle anim to be played on this AI (used by AnimState scripts).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getObservationPosition&#039;&#039;&#039;(vector targetPoint, float visualAcuityZeroToOne); ====&lt;br /&gt;
&lt;br /&gt;
:This event is used to get a position that the AI can move to observe a  given position.  It is useful for looking at hiding spots that can&#039;t be reached, and performing other investigation functions.  Returns a world position from which the observation can take place. Returns the current AI origin if no such point is found.  @sideEffect This uses the AI_DEST_UNREACHABLE flag variable  to indicate if a point was found. It will be true if none was found, false if one was found.&lt;br /&gt;
::&#039;&#039;targetPoint&#039;&#039;: the world position to be observed&lt;br /&gt;
::&#039;&#039;visualAcuityZeroToOne&#039;&#039;: the visual acuity of the AI on a scale of 0.0 to 1.0 where 0.0 is blind and 1.0 is perfect vision.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getObstacle&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the obstacle in the character&#039;s path&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getRandomTarget&#039;&#039;&#039;(string entity_type); ====&lt;br /&gt;
&lt;br /&gt;
:Finds a random targeted entity of the specified type.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getReachableEntityPosition&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the position of the entity within the AAS if possible, otherwise just the entity position.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getRelationEnt&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getSndDir&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:ai hearing of sound &lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getTactEnt&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:ai sense of touch&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getTalkTarget&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the entity (player) trying to talk to the character&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getTurnDelta&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getTurnRate&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the rate the character turns.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getVectorToIdealOrigin&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the vector from where the AI is to where he ideally should be&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getVisDir&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns position of the last visual alert.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;hasSeenEvidence&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:This returns 1 when the AI has seen evidence of intruders before (an enemy, a body...)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ignoreDamage&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:The AI can no longer take damage.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isEntityHidden&#039;&#039;&#039;(entity ent, float f_sightThreshold); ====&lt;br /&gt;
&lt;br /&gt;
:This is an alternate version of canSee, using FOV, distance and lighting.&lt;br /&gt;
::&#039;&#039;f_sightThreshold&#039;&#039;: goes from 0.0 (entity visible in complete darkness) to 1.0 (entity only visible if completely lit up).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isPlayerResponsibleForDeath&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the player was responsible for the AI&#039;s caller&#039;s death.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;kickObstacles&#039;&#039;&#039;(entity kickEnt, float force); ====&lt;br /&gt;
&lt;br /&gt;
:Kicks any obstacle in the character&#039;s path.&lt;br /&gt;
::&#039;&#039;kickEnt&#039;&#039;: pass in $null_entity if you don&#039;t have a specific entity to kick&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;kill&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Kills the monster.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;KO_Knockout&#039;&#039;&#039;(entity inflictor); ====&lt;br /&gt;
&lt;br /&gt;
:AI knockout&lt;br /&gt;
::&#039;&#039;inflictor&#039;&#039;: is the entity causing the knockout, can be the $null_entity&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;launchMissile&#039;&#039;&#039;(vector origin, vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the projectile entity&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;locateEnemy&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Updates the last known position of the enemy independent from whether or not the enemy is visible.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;lookAt&#039;&#039;&#039;(entity focusEntity, float duration); ====&lt;br /&gt;
&lt;br /&gt;
:Aims the character&#039;s eyes and head toward an entity for a period of time.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;lookAtAngles&#039;&#039;&#039;(float yawAngleClockwise, float pitchAngleUp, float rollAngle, float durationInSeconds); ====&lt;br /&gt;
&lt;br /&gt;
:A look at event that just looks at a set of angles relative  to the current body facing of the AI. This method is just like the vanilla Doom3 lookAt and lookAtEnemy methods, but it looks at the specified angles from the current body facing of the AI.&lt;br /&gt;
::&#039;&#039;yawAngleClockwise&#039;&#039;: Negative angles are to the left of  the AIs body and positive angles are to the right.&lt;br /&gt;
::&#039;&#039;pitchAngleUp&#039;&#039;: Negative values are down and positive values are up  where down and up are defined by the body axis.&lt;br /&gt;
::&#039;&#039;rollAngle&#039;&#039;: This is currently unused and does nothing.&lt;br /&gt;
::&#039;&#039;durationInSeconds&#039;&#039;: The duration to look in seconds.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;lookAtEnemy&#039;&#039;&#039;(float duration); ====&lt;br /&gt;
&lt;br /&gt;
:Aims the character&#039;s eyes and head toward the current enemy for a period of time.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;lookAtPosition&#039;&#039;&#039;(vector lookAtWorldPosition, float durationInSeconds); ====&lt;br /&gt;
&lt;br /&gt;
:This method is just like the vanilla Doom3 lookAt and lookAtEnemy methods, but instead of looking at an entity, it looks at a position in worldspace.  That is, it turns the head of the AI to look at the position.&lt;br /&gt;
::&#039;&#039;lookAtWorldPosition&#039;&#039;: position in space to look at&lt;br /&gt;
::&#039;&#039;durationInSeconds&#039;&#039;: duration to look in seconds&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;meleeAttackToJoint&#039;&#039;&#039;(string joint, string damageDef); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveOutOfRange&#039;&#039;&#039;(entity ent, float range); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;moveStatus&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveToAttackPosition&#039;&#039;&#039;(entity ent, string attack_anim); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveToCover&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveToCoverFrom&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveToEnemy&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveToEnemyHeight&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveToEntity&#039;&#039;&#039;(entity destination); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveToPosition&#039;&#039;&#039;(vector position); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;muzzleFlash&#039;&#039;&#039;(string jointname); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;numSmokeEmitters&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the # of emitters defined by &#039;smokeParticleSystem&#039; in the entitydef&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;performRelight&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Deal with doused lights.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;playAndLipSync&#039;&#039;&#039;(string soundName, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Play the given sound, using the given lipsync animation. The lipsync animation should just be a simple non-loopable animation of the mouth opening in a linear fashion. The code will select individual frames from this to construct a simple lipsyncing effect which is in time with the sound.  Returns the length of the played sound in seconds.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;playCustomAnim&#039;&#039;&#039;(string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Plays the given animation on legs and torso. Returns false if anim doesn&#039;t exist.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;preBurn&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;predictEnemyPos&#039;&#039;&#039;(float time); ====&lt;br /&gt;
&lt;br /&gt;
:Tries to predict the player&#039;s movement based on the AAS and his direction of movement.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;processBlindStim&#039;&#039;&#039;(entity stimSource, float skipVisibilityCheck); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;processVisualStim&#039;&#039;&#039;(entity stimSource); ====&lt;br /&gt;
&lt;br /&gt;
:Use this call to let the AI react to a visual stim (coming from the source entity).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;pushPointIntoAAS&#039;&#039;&#039;(vector post); ====&lt;br /&gt;
&lt;br /&gt;
:Tries to push the point into a valid AAS area&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;pushState&#039;&#039;&#039;(string stateName); ====&lt;br /&gt;
&lt;br /&gt;
:Pushes the state with the given name, current one is postponed.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;radiusDamageFromJoint&#039;&#039;&#039;(string jointname, string damageDef); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;randomPath&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;restartPatrol&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;restoreMove&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;saveMove&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAcuity&#039;&#039;&#039;(string type, float val); ====&lt;br /&gt;
&lt;br /&gt;
:ai generalized alerts&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAlertGracePeriod&#039;&#039;&#039;(float frac, float duration, float count); ====&lt;br /&gt;
&lt;br /&gt;
:This starts the alert grace period for an AI. Should be called in the same frame as the alert that pushes them into a higher state.&lt;br /&gt;
::&#039;&#039;frac&#039;&#039;: the fraction of the alert below which they should ignore alerts during the grace period.&lt;br /&gt;
::&#039;&#039;duration&#039;&#039;: the duration of the period in seconds&lt;br /&gt;
::&#039;&#039;count&#039;&#039;: the number of alerts ignored above which the grace period is invalid&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAlertLevel&#039;&#039;&#039;(float newLevel); ====&lt;br /&gt;
&lt;br /&gt;
:Set the alert level (AI_AlertLevel). This should always be called instead of setting AI_AlertLevel directly.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAudThresh&#039;&#039;&#039;(float val); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setBoneMod&#039;&#039;&#039;(float allowBoneMod); ====&lt;br /&gt;
&lt;br /&gt;
:Enables or disables head looking (may be obsolete).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setEnemy&#039;&#039;&#039;(entity enemy); ====&lt;br /&gt;
&lt;br /&gt;
:Make the given entity an enemy.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setFlyOffset&#039;&#039;&#039;(float offset); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the preferred height relative to the player&#039;s view height to fly at.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setFlySpeed&#039;&#039;&#039;(float speed); ====&lt;br /&gt;
&lt;br /&gt;
:Set the speed flying creatures move at. Also sets speed for moveTypeSlide.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setMoveType&#039;&#039;&#039;(float movetype); ====&lt;br /&gt;
&lt;br /&gt;
:Set the current movetype.  movetypes are defined in tdm_ai.script&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSmokeVisibility&#039;&#039;&#039;(float particle_num, float on); ====&lt;br /&gt;
&lt;br /&gt;
:enables/disables smoke particles on bones.  pass in the particle #, or ALL_PARTICLES for turning on/off all particle systems. particles are spawned in the order they appear in the entityDef&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setTalkState&#039;&#039;&#039;(float state); ====&lt;br /&gt;
&lt;br /&gt;
:Sets whether the player can talk to this character or not.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setTalkTarget&#039;&#039;&#039;(entity target); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the entity (player) trying to talk to the character&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setTurnRate&#039;&#039;&#039;(float rate); ====&lt;br /&gt;
&lt;br /&gt;
:Set the rate the character turns at&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;shrivel&#039;&#039;&#039;(float time); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;slideTo&#039;&#039;&#039;(vector position, float time); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;spawnThrowableProjectile&#039;&#039;&#039;(string projectileName, string jointName); ====&lt;br /&gt;
&lt;br /&gt;
:This method spawns a projectile of the type named by the caller and attaches it to the joint given by the caller.  The projectile becomes the AI&#039;s firable projectile. Returns a pointer to a projectile entity that can be  thrown by the AI. You can use AI_LaunchMissle (e* = launchMissle(v,v) ) to throw the stone.&lt;br /&gt;
::&#039;&#039;projectileName&#039;&#039;: The name of the projectile to spawn (as seen in a .def file) Must be descended from idProjectile&lt;br /&gt;
::&#039;&#039;jointName&#039;&#039;: The name of the joint on the model to which the particle should be attached for throwing. If this is NULL or the empty string, then it is attached to the model center.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopMove&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopPatrol&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Stops an AI from patrolling&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopRagdoll&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:turns off the ragdoll&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopThinking&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;switchState&#039;&#039;&#039;(string stateName); ====&lt;br /&gt;
&lt;br /&gt;
:Switches to the state with the given name, current one is ended.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;testAnimAttack&#039;&#039;&#039;(string animname); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;testAnimMove&#039;&#039;&#039;(string animname); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;testAnimMoveTowardEnemy&#039;&#039;&#039;(string animname); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;testChargeAttack&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;testMeleeAttack&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;testMoveToPosition&#039;&#039;&#039;(vector position); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;throwAF&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;throwMoveable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;travelDistanceBetweenEntities&#039;&#039;&#039;(entity source, entity dest); ====&lt;br /&gt;
&lt;br /&gt;
:Approximate travel distance between two entities.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;travelDistanceBetweenPoints&#039;&#039;&#039;(vector source, vector dest); ====&lt;br /&gt;
&lt;br /&gt;
:Approximate travel distance between two points.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;travelDistanceToEntity&#039;&#039;&#039;(entity destination); ====&lt;br /&gt;
&lt;br /&gt;
:Approximate travel distance to entity.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;travelDistanceToPoint&#039;&#039;&#039;(vector destination); ====&lt;br /&gt;
&lt;br /&gt;
:Approximate travel distance to point.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;triggerParticles&#039;&#039;&#039;(string jointName); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;turnTo&#039;&#039;&#039;(float yaw); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;turnToEntity&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;turnToPos&#039;&#039;&#039;(vector pos); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;visScan&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Checks for enemies or player in the AI&#039;s FOV, using light level and distance. For now the check is only done on the player.  Returns a reference to the sighted actor.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;waitAction&#039;&#039;&#039;(string name); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;waitMove&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;wakeOnFlashlight&#039;&#039;&#039;(float enable); ====&lt;br /&gt;
&lt;br /&gt;
:Tells the monster to activate when flashlight shines on them.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;wander&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
=== idTestModel ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;leftFoot&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Changes to left foot and plays footstep sound.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;rightFoot&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Changes to right foot and plays footstep sound.&lt;br /&gt;
&lt;br /&gt;
=== CBinaryFrobMover ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Close&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Closes the frobmover, regardless of its previous state. Mover must be open, otherwise nothing happens.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;GetFractionalPosition&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a fraction between 0.00 (closed) and 1.00 (open).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;IsLocked&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true (nonzero) if the mover is currently locked.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;IsOpen&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true (nonzero) if the mover is open, which is basically the same as &amp;quot;not closed&amp;quot;. A mover is considered closed when it is at its close position.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;IsPickable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true (nonzero) if this frobmover is pickable.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Lock&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Locks the mover. Calls to Open() will not succeed after this call. &lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Open&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Opens the frobmover, regardless of its previous state. The mover will not move when it&#039;s locked. &lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;TDM_Lock_OnLockPicked&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:internal&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;TDM_Lock_StatusUpdate&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:internal&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ToggleLock&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Toggles the lock state. Unlocked movers will be locked and vice versa. The notes above concerning Unlock() still apply if this call unlocks the mover. &lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ToggleOpen&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Toggles the mover state. Closes when fully open, opens when fully closed. If the mover is &amp;quot;interrupted&amp;quot; (e.g. when the player frobbed the mover in between), the move direction depends on the state of the internal &amp;quot;intent_open&amp;quot; flag. &lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Unlock&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Unlocks the mover. Calls to Open() will succeed after this call. Depending on the value of the spawnarg &amp;quot;open_on_unlock&amp;quot; the mover might automatically open after this call. &lt;br /&gt;
&lt;br /&gt;
=== idBrittleFracture ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;dampenSound&#039;&#039;&#039;(float dampen); ====&lt;br /&gt;
&lt;br /&gt;
:Toggle whether the shattering sound is dampened on the window, e.g., when covered by moss.&lt;br /&gt;
::&#039;&#039;dampen&#039;&#039;: 1 = dampened, 0 = not dampened&lt;br /&gt;
&lt;br /&gt;
=== idCameraView ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idCameraAnim ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;start&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Starts a spline or anim camera moving.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stop&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Stops a spline or anim camera moving.&lt;br /&gt;
&lt;br /&gt;
=== idFuncEmitter ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;emitterAddModel&#039;&#039;&#039;(string modelName, vector modelOffset); ====&lt;br /&gt;
&lt;br /&gt;
:Adds a new particle (or regular, if you wish) model to the emitter, located at modelOffset units away from the emitter&#039;s origin.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;emitterGetNumModels&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of models/particles this emitter has. Always &amp;gt;= 1.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Off&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Switches the emitter off.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;On&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Switches the emitter on.&lt;br /&gt;
&lt;br /&gt;
=== idEntity ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activateContacts&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Activate objects sitting on this object.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activateTargets&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Causes this entity to activate all it&#039;s targets. Similar to how a trigger activates entities.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;addFrobPeer&#039;&#039;&#039;(entity peer); ====&lt;br /&gt;
&lt;br /&gt;
:Adds the passed entity as a frob peer.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;addInvItem&#039;&#039;&#039;(entity inv_item); ====&lt;br /&gt;
&lt;br /&gt;
:Adds the given item to the inventory. Depending on the type the passed entity will be removed from the game (as for loot items) or hidden.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;addItemToInv&#039;&#039;&#039;(entity target); ====&lt;br /&gt;
&lt;br /&gt;
:Adds the entity to the given entity&#039;s inventory. Depending on the type the entity will be removed from the game (as for loot items) or hidden. Example: $book-&amp;gt;addItemToInv($player1);&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;addTarget&#039;&#039;&#039;(entity target); ====&lt;br /&gt;
&lt;br /&gt;
:Add a target to this entity.&lt;br /&gt;
::&#039;&#039;target&#039;&#039;: the entity to add as target&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;applyImpulse&#039;&#039;&#039;(entity source, float bodyid, vector point, vector impulse); ====&lt;br /&gt;
&lt;br /&gt;
:Applies an impulse to the entity. Example: entity.applyImpulse($player1, 0, entity.getOrigin(), &#039;0 0 2&#039;);&lt;br /&gt;
::&#039;&#039;source&#039;&#039;: Pass $null_entity or the entity that applies the impulse&lt;br /&gt;
::&#039;&#039;bodyid&#039;&#039;: For articulated figures, ID of the body, 0 for the first (main) body. Otherwise use 0.&lt;br /&gt;
::&#039;&#039;point&#039;&#039;: Point on the body where the impulse is applied to&lt;br /&gt;
::&#039;&#039;impulse&#039;&#039;: Vector of the impulse&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;bind&#039;&#039;&#039;(entity master); ====&lt;br /&gt;
&lt;br /&gt;
:Fixes this entity&#039;s position and orientation relative to another entity, such that when the master entity moves, so does this entity.&lt;br /&gt;
::&#039;&#039;master&#039;&#039;: the entity to bind to&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;bindPosition&#039;&#039;&#039;(entity master); ====&lt;br /&gt;
&lt;br /&gt;
:Fixes this entity&#039;s position (but not orientation) relative to another entity, such that when the master entity moves, so does this entity.&lt;br /&gt;
::&#039;&#039;master&#039;&#039;: the entity to bind to&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;bindToBody&#039;&#039;&#039;(entity master, float bodyID, float orientated); ====&lt;br /&gt;
&lt;br /&gt;
:Bind to AF body&lt;br /&gt;
::&#039;&#039;master&#039;&#039;: entity to bind to&lt;br /&gt;
::&#039;&#039;bodyID&#039;&#039;: AF body ID to bind to&lt;br /&gt;
::&#039;&#039;orientated&#039;&#039;: binds the orientation as well as position, if set to 1&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;bindToJoint&#039;&#039;&#039;(entity master, string boneName, float rotateWithMaster); ====&lt;br /&gt;
&lt;br /&gt;
:Fixes this entity&#039;s position and orientation relative to a bone on another entity, such that when the master&#039;s bone moves, so does this entity.&lt;br /&gt;
::&#039;&#039;master&#039;&#039;: the entity to bind to&lt;br /&gt;
::&#039;&#039;boneName&#039;&#039;: the bone name&lt;br /&gt;
::&#039;&#039;rotateWithMaster&#039;&#039;: -&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;cacheSoundShader&#039;&#039;&#039;(string shaderName); ====&lt;br /&gt;
&lt;br /&gt;
:Ensure the specified sound shader is loaded by the system. Prevents cache misses when playing sound shaders.&lt;br /&gt;
::&#039;&#039;shaderName&#039;&#039;: the sound shader to cache&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;callFunction&#039;&#039;&#039;(string functionName); ====&lt;br /&gt;
&lt;br /&gt;
:Calls a function on an entity&#039;s script object. See also callGlobalFunction().&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;callGlobalFunction&#039;&#039;&#039;(string functionName, entity other); ====&lt;br /&gt;
&lt;br /&gt;
:calls a global function and passes the other entity along as the first argument calls the function in a new thread, so it continues executing in the current thread right away (unlike entity.callFunction( &amp;quot;blah&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;callGui&#039;&#039;&#039;(float handle, string namedEvent); ====&lt;br /&gt;
&lt;br /&gt;
:Calls a named event in a GUI.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canBeUsedBy&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the entity can be used by the argument entity&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canSeeEntity&#039;&#039;&#039;(entity target, float useLighting); ====&lt;br /&gt;
&lt;br /&gt;
:This is a general version of idAI::canSee, that can be used by all entities. It doesn&#039;t regard FOV, it just performs a trace to check whether the target is occluded by world geometry. Is probably useful for stim/response as well Pass useLighting = true to take the lighting of the target entity into account. Use &amp;quot;isEntityHidden&amp;quot; as a script event with a threshold. The constant threshold value for useLighting is defined within the SDK in game/entity.h.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;changeEntityRelation&#039;&#039;&#039;(entity ent, float relationChange); ====&lt;br /&gt;
&lt;br /&gt;
:This changes the current relation to an entity by adding the new amount.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;changeInvIcon&#039;&#039;&#039;(string name, string category, string icon); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the inventory icon of the given item in the given category to &amp;lt;icon&amp;gt;.&lt;br /&gt;
::&#039;&#039;name&#039;&#039;: name of the item&lt;br /&gt;
::&#039;&#039;category&#039;&#039;: the item&#039;s category&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;changeInvItemCount&#039;&#039;&#039;(string name, string category, float amount); ====&lt;br /&gt;
&lt;br /&gt;
:Decreases the inventory item stack count by amount. The item is addressed using the name and category of the item. These are usually defined on the inventory item entity (&amp;quot;inv_name&amp;quot;, &amp;quot;inv_category&amp;quot;)  Amount can be both negative and positive.&lt;br /&gt;
::&#039;&#039;name&#039;&#039;: name of the item&lt;br /&gt;
::&#039;&#039;category&#039;&#039;: the item&#039;s category&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;changeInvLightgemModifier&#039;&#039;&#039;(string name, string category, float amount); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the lightgem modifier value of the given item. Valid arguments are between 0 and 32 (which is the maximum lightgem value).&lt;br /&gt;
::&#039;&#039;name&#039;&#039;: name of the item&lt;br /&gt;
::&#039;&#039;category&#039;&#039;: the item&#039;s category&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;changeLootAmount&#039;&#039;&#039;(float type, float amount); ====&lt;br /&gt;
&lt;br /&gt;
:Changes the loot amount of the given Type (e.g. GOODS) by &amp;lt;amount&amp;gt;.  The mission statisic for loot found gets changed too.  The new value of the changed type is returned (e.g. the new GOODS value if this has been changed).  Note: The LOOT_TOTAL type can&#039;t be changed and 0 is returned.&lt;br /&gt;
::&#039;&#039;type&#039;&#039;: one of: LOOT_GOLD, LOOT_GOODS, LOOT_JEWELRY&lt;br /&gt;
::&#039;&#039;amount&#039;&#039;: can be negative&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;checkAbsence&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:description missing&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;copyBind&#039;&#039;&#039;(entity other); ====&lt;br /&gt;
&lt;br /&gt;
:copy bind information of other to this entity (i.e., bind this entity to the same entity that other is bound to)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;createOverlay&#039;&#039;&#039;(string guiFile, float layer); ====&lt;br /&gt;
&lt;br /&gt;
:Creates a GUI overlay. (must be used on the player)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;CreateTimer&#039;&#039;&#039;(float stimId, float hour, float minutes, float seconds, float milliseconds); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;damage&#039;&#039;&#039;(entity inflictor, entity attacker, vector dir, string damageDefName, float damageScale); ====&lt;br /&gt;
&lt;br /&gt;
:Deals damage to this entity (gets translated into the idEntity::Damage() method within the SDK).&lt;br /&gt;
::&#039;&#039;inflictor&#039;&#039;: the entity causing the damage (maybe a projectile)&lt;br /&gt;
::&#039;&#039;attacker&#039;&#039;: the &amp;quot;parent&amp;quot; entity of the inflictor, the one that is responsible for the inflictor (can be the same)&lt;br /&gt;
::&#039;&#039;dir&#039;&#039;: the direction the attack is coming from.&lt;br /&gt;
::&#039;&#039;damageDefName&#039;&#039;: the name of the damage entityDef to know what damage is being dealt to &amp;lt;self&amp;gt; (e.g. &amp;quot;damage_lava&amp;quot;)&lt;br /&gt;
::&#039;&#039;damageScale&#039;&#039;: the scale of the damage (pass 1.0 as default, this should be ok).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;destroyOverlay&#039;&#039;&#039;(float handle); ====&lt;br /&gt;
&lt;br /&gt;
:Destroys a GUI overlay. (must be used on the player)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;distanceTo&#039;&#039;&#039;(entity other); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the distance of this entity to another entity.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;distanceToPoint&#039;&#039;&#039;(vector point); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the distance of this entity to a point.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;extinguishLights&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Extinguishes all lights (i.e. the &amp;lt;self&amp;gt; entity plus all bound lights)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;fadeSound&#039;&#039;&#039;(float channel, float newLevel, float fadeTime); ====&lt;br /&gt;
&lt;br /&gt;
:Fades the sound on this entity to a new level over a period of time.  Use SND_CHANNEL_ANY for all currently playing sounds.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;frob&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Frobs the entity (i.e. simulates a frob action performed by the player). Returns TRUE if the entity is frobable, FALSE otherwise.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;frobHilight&#039;&#039;&#039;(float state); ====&lt;br /&gt;
&lt;br /&gt;
:ishtvan: Tries to make the entity frobhilight or not&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getAngles&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current orientation of this entity (relative to bind parent if any).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getAngularVelocity&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the current angular velocity of this entity. The angular velocity of a physics object is a vector that passes through the center of mass. The direction of this vector defines the axis of rotation and the magnitude defines the rate of rotation about the axis in radians per second.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getBindChild&#039;&#039;&#039;(float ind); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the ind_th bind child of this entity or NULL if index is invalid. NOTE: indices start at zero&lt;br /&gt;
::&#039;&#039;ind&#039;&#039;: child index&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getBindMaster&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the entity&#039;s bindmaster&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getBoolKey&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Retrieves the boolean value of a specific spawn arg, defaulting to false.&lt;br /&gt;
::&#039;&#039;key&#039;&#039;: spawnarg name&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getClipMask&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the clipmask of the physics object.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getColor&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the color of this entity (shader parms Parm0, Parm1, Parm2).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getContents&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the contents of the physics object.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getCurInvCategory&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the name of the currently highlighted inventory category.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getCurInvIcon&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the icon of the currently highlighted inventory item.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getCurInvItemCount&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the item count of the currently highlighted inventory Item, if stackable.Returns - 1 if non - stackable&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getCurInvItemEntity&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the currently highlighted inventory item entity.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getCurInvItemId&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the name of the currently highlighted inventory item (the one defined in &amp;quot;inv_item_id&amp;quot;). Most items will return an empty string, unless the &amp;quot;inv_item_id&amp;quot; is set on purpose.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getCurInvItemName&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the name of the currently highlighted inventory item (the one defined in &amp;quot;inv_name&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getEntityFlag&#039;&#039;&#039;(string flagName); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the value of the specified entity flag.&lt;br /&gt;
::&#039;&#039;flagName&#039;&#039;: Can be one of (case insensitive): 	notarget: if true never attack or target this entity 	noknockback: if true no knockback from hits 	takedamage: if true this entity can be damaged 	hidden: if true this entity is not visible 	bindOrientated: if true both the master orientation is used for binding 	solidForTeam: if true this entity is considered solid when a physics team mate pushes entities 	forcePhysicsUpdate: if true always update from the physics whether the object moved or not 	selected: if true the entity is selected for editing 	neverDormant: if true the entity never goes dormant 	isDormant: if true the entity is dormant 	hasAwakened: before a monster has been awakened the first time, use full PVS for dormant instead of area-connected 	invisible: if true this entity cannot be seen 	inaudible: if true this entity cannot be heard &lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getEntityKey&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Retrieves the entity specified by the spawn arg.&lt;br /&gt;
::&#039;&#039;key&#039;&#039;: spawnarg name&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getFloatKey&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Retrieves the floating point value of a specific spawn arg, defaulting to 0.0f.&lt;br /&gt;
::&#039;&#039;key&#039;&#039;: spawnarg name&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getGui&#039;&#039;&#039;(float handle); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the file currently loaded by a GUI.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getGuiFloat&#039;&#039;&#039;(float handle, string key); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a GUI parameter.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getGuiInt&#039;&#039;&#039;(float handle, string key); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a GUI parameter.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getGuiString&#039;&#039;&#039;(float handle, string key); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a GUI parameter.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getHealth&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current health.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getIntKey&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Retrieves the integer value of a specific spawn arg, defaulting to 0.&lt;br /&gt;
::&#039;&#039;key&#039;&#039;: spawnarg name&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getKey&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Retrieves the value of a specific spawn arg, defaulting to &#039;&#039;.&lt;br /&gt;
::&#039;&#039;key&#039;&#039;: spawnarg name&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getLightInPVS&#039;&#039;&#039;(float falloff, float scaling); ====&lt;br /&gt;
&lt;br /&gt;
:Computes the sum of all light in the PVS of the entity you call this on, and returns a vector with the sum.&lt;br /&gt;
::&#039;&#039;falloff&#039;&#039;: 0: no falloff with distance  0.5: sqrt(linear) falloff	(dist 100 =&amp;gt; 1/10)  1: linear falloff			(dist 100 =&amp;gt; 1/100)  2: square falloff			(dist 100 =&amp;gt; 1/10000) &lt;br /&gt;
::&#039;&#039;scaling&#039;&#039;: factor to scale the distance, can be used to lower/raise distance factor  after the linear or square scaling has been used good looking values are approx: sqrt(linear): 0.01, linear: 0.1, square 1.0&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getLinearVelocity&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the current linear velocity of this entity. The linear velocity of a physics object is a vector that defines the translation of the center of mass in units per second.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getLocation&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the idLocation entity corresponding to the entity&#039;s current location. This was player-specific before, but is now available to all entities.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getLootAmount&#039;&#039;&#039;(float type); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the amount of loot for the given type (e.g. LOOT_GOODS). Pass LOOT_TOTAL to return the sum of all loot types.&lt;br /&gt;
::&#039;&#039;type&#039;&#039;: one of: LOOT_GOLD, LOOT_GOODS, LOOT_JEWELRY, LOOT_TOTAL&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMass&#039;&#039;&#039;(float body); ====&lt;br /&gt;
&lt;br /&gt;
:Gets mass of a body for an entity&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMaxHealth&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the max health of this entity.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getMaxs&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the maximum corner of this entity&#039;s bounding box.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getMins&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the minimum corner of this entity&#039;s bounding box.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getName&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the name of this entity.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getNextInvItem&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Cycles the standard cursor to the next inventory item. Returns the item entity pointed to after the operation is complete.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getNextKey&#039;&#039;&#039;(string prefix, string lastMatch); ====&lt;br /&gt;
&lt;br /&gt;
:Searches for the name of a spawn arg that matches the prefix.  For example, passing in &amp;quot;attack_target&amp;quot; matches &amp;quot;attack_target1&amp;quot;, &amp;quot;attack_targetx&amp;quot;, &amp;quot;attack_target_enemy&amp;quot;,  etc. The returned string is the name of the key which can then be passed into functions like getKey() to lookup the value of that spawn arg.  This is useful for when you have multiple values to look up, like when you target multiple objects.  To find the next matching key, pass in the previous result and the next key returned will be the first one that matches after the previous result. Pass in &amp;quot;&amp;quot; to get the first match. Passing in a non-existent key is the same as passing in &amp;quot;&amp;quot;. Returns &amp;quot;&amp;quot; when no  more keys match.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getOrigin&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current position of this entity (relative to bind parent if any).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getPrevInvItem&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Cycles the standard cursor to the previous inventory item. Returns the item entity pointed to after the operation is complete.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;GetResponseEntity&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the entity which should take the response. Some entities like AI heads are not responding themselves to stims, but relay it to another entity (i.e. the bodies they&#039;re attached to).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getShaderParm&#039;&#039;&#039;(float parm); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the value of the specified shader parm.&lt;br /&gt;
::&#039;&#039;parm&#039;&#039;: shader parm index&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getSize&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the size of this entity&#039;s bounding box.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getSoundVolume&#039;&#039;&#039;(string soundName); ====&lt;br /&gt;
&lt;br /&gt;
:Get the volume of the sound to play.&lt;br /&gt;
::&#039;&#039;soundName&#039;&#039;: the name of the sound&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getTarget&#039;&#039;&#039;(float num); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the requested target entity.&lt;br /&gt;
::&#039;&#039;num&#039;&#039;: The target number. Starts at 0.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getTeam&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current team number.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getVectorKey&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Retrieves the vector value of a specific spawn arg, defaulting to &#039;0 0 0&#039;.&lt;br /&gt;
::&#039;&#039;key&#039;&#039;: spawnarg name&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getVinePlantLoc&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Event important to the growing of vines from vine arrows&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getVinePlantNormal&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Event important to the growing of vines from vine arrows&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getWorldOrigin&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current world-space position of this entity (regardless of any bind parent).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;hasFunction&#039;&#039;&#039;(string functionName); ====&lt;br /&gt;
&lt;br /&gt;
:checks if an entity&#039;s script object has a specific function&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;hasInvItem&#039;&#039;&#039;(entity item); ====&lt;br /&gt;
&lt;br /&gt;
:Tests whether the player has the specified item entity in his inventory.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;heal&#039;&#039;&#039;(string healDefName, float healScale); ====&lt;br /&gt;
&lt;br /&gt;
:Heals the entity this is called on using the specified healing entityDef. Returns 1 if the entity could be healed, 0 otherwise (if the entity is already at full health, for ex.)&lt;br /&gt;
::&#039;&#039;healDefName&#039;&#039;: the name of the entityDef containing the healing information (e.g. &amp;quot;heal_potion&amp;quot;)&lt;br /&gt;
::&#039;&#039;healScale&#039;&#039;: the scaling value to be applied to the healAmount found in the healEntityDef&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;hide&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Makes this entity invisible.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;inPVS&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns non-zero if this entity is in PVS. For lights, it will return true when the light&#039;s bounding box is in PVS, even though the light may not actually be in PVS. (an unmoved shadowcasting light may not be visible to PVS areas its bounding box intersects with)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isDroppable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get whether an item may be dropped from the inventory&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isEnemy&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the given entity is an enemy.&lt;br /&gt;
::&#039;&#039;ent&#039;&#039;: The entity in question&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isFriend&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the given entity is a friend.&lt;br /&gt;
::&#039;&#039;ent&#039;&#039;: The entity in question&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isFrobable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get whether the entity is frobable&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isHidden&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:checks if the entity&#039;s model is invisible.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isHilighted&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if entity is currently frobhilighted.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isInLiquid&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns 1 if the entity is in or touching a liquid.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isLight&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isNeutral&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the given entity is neutral.&lt;br /&gt;
::&#039;&#039;ent&#039;&#039;: The entity in question&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isType&#039;&#039;&#039;(string spawnclass); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if this entity is of the given type.&lt;br /&gt;
::&#039;&#039;spawnclass&#039;&#039;: spawn class name&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;loadExternalData&#039;&#039;&#039;(string declFile, string prefix); ====&lt;br /&gt;
&lt;br /&gt;
:Load an external xdata declaration.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;noShadows&#039;&#039;&#039;(float noShadows); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the noShadow property on the entity to true/false, turning shadowcasting on or off for this entity.&lt;br /&gt;
::&#039;&#039;noShadows&#039;&#039;: 1 = disable shadows, 0 = enable shadows&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;noShadowsDelayed&#039;&#039;&#039;(float noShadows, float delay); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the noShadow property on the entity to true/false after delay in ms, turning shadows cast by this entity on or off.&lt;br /&gt;
::&#039;&#039;noShadows&#039;&#039;: 1 = disable shadows, 0 = enable shadows&lt;br /&gt;
::&#039;&#039;delay&#039;&#039;: delay in ms&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;numBindChildren&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of bound entities lower down in the bind chain than this entity, but be sure to give it the topmost bindmaster&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;numTargets&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of entities this entity has targeted.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;propagateSound&#039;&#039;&#039;(string soundName, float propVolMod, float msgTag); ====&lt;br /&gt;
&lt;br /&gt;
:Generates a propagated sound&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;propSound&#039;&#039;&#039;(string name); ====&lt;br /&gt;
&lt;br /&gt;
:Sound propagation scriptfunctions on all entities propagate a sound directly without playing an audible sound&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;propSoundMod&#039;&#039;&#039;(string name, float volMod); ====&lt;br /&gt;
&lt;br /&gt;
:propagate a sound directly with a volume modifier&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;randomTarget&#039;&#039;&#039;(string ignoreName); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a random targeted entity. Pass in an entity name to skip that entity.&lt;br /&gt;
::&#039;&#039;ignoreName&#039;&#039;: the name of an entity to ignore&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;rangedThreatTo&#039;&#039;&#039;(entity target); ====&lt;br /&gt;
&lt;br /&gt;
:Could this entity threaten the given (target) entity from a distance?&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;removeBinds&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Removes all attached entities from the game&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;removeFrobPeer&#039;&#039;&#039;(entity peer); ====&lt;br /&gt;
&lt;br /&gt;
:Removes the passed entity as a frob peer.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;removeKey&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Removes a key from an object&#039;s spawnargs, so things like getNextKey() don&#039;t retrieve it.&lt;br /&gt;
::&#039;&#039;key&#039;&#039;: the spawnarg to remove&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;removeTarget&#039;&#039;&#039;(entity target); ====&lt;br /&gt;
&lt;br /&gt;
:Remove a target from this entity.&lt;br /&gt;
::&#039;&#039;target&#039;&#039;: the entity to remove from the targets&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;replaceInvItem&#039;&#039;&#039;(entity oldItem, entity newItem); ====&lt;br /&gt;
&lt;br /&gt;
:Replaces the entity &amp;lt;oldItem&amp;gt; with &amp;lt;newItem&amp;gt; in the inventory, while keeping &amp;lt;oldItem&amp;gt;&#039;s inventory position intact.  Note: The position guarantee only applies if &amp;lt;oldItem&amp;gt; and newItem  share the same category. If the categories are different, the position of &amp;lt;newItem&amp;gt; is likely to be different than the one of &amp;lt;oldItem&amp;gt;.  Note that &amp;lt;oldItem&amp;gt; will be removed from the inventory.  If &amp;lt;newItem&amp;gt; is the $null_entity, &amp;lt;oldItem&amp;gt; is just removed and no replacement happens.  Returns 1 if the operation was successful, 0 otherwise.&lt;br /&gt;
::&#039;&#039;newItem&#039;&#039;: can be $null_entity&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ResetTimer&#039;&#039;&#039;(float stimId); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;reskinCollisionModel&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:For use after setSkin() on moveables and static models, if the CM needs to be refreshed to update surface properties after a skin change. CM will be regenerated from the original model file with the new skin.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ResponseAdd&#039;&#039;&#039;(float type); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ResponseAllow&#039;&#039;&#039;(float type, entity responder); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ResponseEnable&#039;&#039;&#039;(float type, float state); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
::&#039;&#039;state&#039;&#039;: 0 = disabled, 1 = enabled&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ResponseIgnore&#039;&#039;&#039;(float type, entity responder); ====&lt;br /&gt;
&lt;br /&gt;
:This functions must be called on the stim entity. It will add the response to the ignore list, so that subsequent stims, should not trigger the stim anymore.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ResponseRemove&#039;&#039;&#039;(float type); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ResponseSetAction&#039;&#039;&#039;(float type, string action); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ResponseTrigger&#039;&#039;&#039;(entity source, float stimType); ====&lt;br /&gt;
&lt;br /&gt;
:Fires a response on this entity, without a stim (a stand-alone response, so to say)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;RestartTimer&#039;&#039;&#039;(float stimId); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;restorePosition&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns this entity to the position stored in the &amp;quot;origin&amp;quot; spawn arg. This is the position the entity was spawned in unless the &amp;quot;origin&amp;quot; key is changed. Note that there is no guarantee that the entity won&#039;t be stuck in another entity when moved, so care should be taken to make sure that isn&#039;t possible.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAngles&#039;&#039;&#039;(vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the current orientation of this entity (relative to bind parent if any)&lt;br /&gt;
::&#039;&#039;angles&#039;&#039;: the new orientation&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAngularVelocity&#039;&#039;&#039;(vector velocity); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the current angular velocity of this entity. The angular velocity of a physics object is a vector that passes through the center of mass. The direction of this vector defines the axis of rotation and the magnitude defines the rate of rotation about the axis in radians per second.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setClipMask&#039;&#039;&#039;(float clipMask); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the clipmask of the physics object.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setColor&#039;&#039;&#039;(float parm0, float parm1, float parm2); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the RGB color of this entity (shader parms Parm0, Parm1, Parm2). See also setColorVec for a variant that accepts a vector instead.&lt;br /&gt;
::&#039;&#039;parm0&#039;&#039;: red&lt;br /&gt;
::&#039;&#039;parm1&#039;&#039;: green&lt;br /&gt;
::&#039;&#039;parm2&#039;&#039;: blue&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setColorVec&#039;&#039;&#039;(vector newColor); ====&lt;br /&gt;
&lt;br /&gt;
:Similar to setColor, but accepts the new RGB color as a vector instead of 3 different floats.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setContents&#039;&#039;&#039;(float contents); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the contents of the physics object.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;setCurInvCategory&#039;&#039;&#039;(string categoryName); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the inventory cursor to the first item of the named category. Returns 1 on success, 0 on failure (e.g. wrong category name)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;setCurInvItem&#039;&#039;&#039;(string itemName); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the inventory cursor to the named item. Returns: the item entity of the newly selected item (can be $null_entity).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setDroppable&#039;&#039;&#039;(float droppable); ====&lt;br /&gt;
&lt;br /&gt;
:Set whether an item may be dropped from the inventory. &lt;br /&gt;
::&#039;&#039;droppable&#039;&#039;: if non-zero the item becomes droppable, when called with 0 the item becomes non-droppable&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setEntityRelation&#039;&#039;&#039;(entity ent, float relation); ====&lt;br /&gt;
&lt;br /&gt;
:Set a relation to another entity, this can be friendly (&amp;gt;0), neutral(0) or hostile (&amp;lt;0)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setFrobable&#039;&#039;&#039;(float frobable); ====&lt;br /&gt;
&lt;br /&gt;
:Set whether the entity is frobable&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setFrobActionScript&#039;&#039;&#039;(string frobActionScript); ====&lt;br /&gt;
&lt;br /&gt;
:Changes the frob action script of this entity. Also updates the &#039;frob_action_script&#039; spawnarg.&lt;br /&gt;
::&#039;&#039;frobActionScript&#039;&#039;: the new script to call when the entity is frobbed&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setFrobMaster&#039;&#039;&#039;(entity master); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the passed entity as the frob master. Pass null_entity to remove the current frob master, if any.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setGravity&#039;&#039;&#039;(vector newGravity); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a new gravity vector for this entity. Note that non-upright vectors are poorly supported at present.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setGui&#039;&#039;&#039;(float handle, string guiFile); ====&lt;br /&gt;
&lt;br /&gt;
:Loads a new file into an existing GUI.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setGuiFloat&#039;&#039;&#039;(float handle, string key, float val); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a GUI parameter.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setGuiInt&#039;&#039;&#039;(float handle, string key, float val); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a GUI parameter.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setGuiString&#039;&#039;&#039;(float handle, string key, string val); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a GUI parameter.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setGuiStringFromKey&#039;&#039;&#039;(float handle, string key, entity src, string srcKey); ====&lt;br /&gt;
&lt;br /&gt;
:This is a kludge. It is equivelant to: setGuiString( handle, key, src.getKey(srcKey) ) However, it&#039;s used to bypass the 127 char size limit on script strings.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setHealth&#039;&#039;&#039;(float health); ====&lt;br /&gt;
&lt;br /&gt;
:Use these to set the health of AI or players (this also updates the AI_DEAD flag)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setKey&#039;&#039;&#039;(string key, string value); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a key on this entity&#039;s spawn args. Note that most spawn args are evaluated when this entity spawns in, so this will not change the entity&#039;s behavior in most cases. This is chiefly for saving data the script needs in an entity for later retrieval.&lt;br /&gt;
::&#039;&#039;key&#039;&#039;: the spawnarg to set&lt;br /&gt;
::&#039;&#039;value&#039;&#039;: the value to store&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setLinearVelocity&#039;&#039;&#039;(vector velocity); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the current linear velocity of this entity in units per second. The linear velocity of a physics object is a vector that defines the translation of the center of mass in units per second.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setMaxHealth&#039;&#039;&#039;(float maxHealth); ====&lt;br /&gt;
&lt;br /&gt;
:Use these to set the max health of AI or players. Note that the health bar GUI is limited to showing a max health of 100. If health exceeds max health after this, health will be set to be equal to max health (which would also update the AI_DEAD flag)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setModel&#039;&#039;&#039;(string modelName); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the model this entity uses&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setName&#039;&#039;&#039;(string name); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the name of this entity.&lt;br /&gt;
::&#039;&#039;name&#039;&#039;: the new name&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setNeverDormant&#039;&#039;&#039;(float enable); ====&lt;br /&gt;
&lt;br /&gt;
:enables or prevents an entity from going dormant&lt;br /&gt;
::&#039;&#039;enable&#039;&#039;: 1 = enable, 0 = disable&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setOrigin&#039;&#039;&#039;(vector origin); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the current position of this entity (relative to it&#039;s bind parent if any)&lt;br /&gt;
::&#039;&#039;origin&#039;&#039;: the new origin&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setOwner&#039;&#039;&#039;(entity owner); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the owner of this entity. Entities will never collide with their owner.&lt;br /&gt;
::&#039;&#039;owner&#039;&#039;: the entity which will be made owner of this entity&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setShaderParm&#039;&#039;&#039;(float parm, float value); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the value of the specified shader parm.&lt;br /&gt;
::&#039;&#039;parm&#039;&#039;: shader parm index&lt;br /&gt;
::&#039;&#039;value&#039;&#039;: new value&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setShaderParms&#039;&#039;&#039;(float parm0, float parm1, float parm2, float parm3); ====&lt;br /&gt;
&lt;br /&gt;
:Sets shader parms Parm0, Parm1, Parm2, and Parm3 (red, green, blue, and alpha respectively).&lt;br /&gt;
::&#039;&#039;parm0&#039;&#039;: red&lt;br /&gt;
::&#039;&#039;parm1&#039;&#039;: green&lt;br /&gt;
::&#039;&#039;parm2&#039;&#039;: blue&lt;br /&gt;
::&#039;&#039;parm3&#039;&#039;: alpha&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSize&#039;&#039;&#039;(vector min, vector max); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the size of this entity&#039;s bounding box.&lt;br /&gt;
::&#039;&#039;min&#039;&#039;: minimum corner coordinates&lt;br /&gt;
::&#039;&#039;max&#039;&#039;: maximum corner coordinates&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSkin&#039;&#039;&#039;(string skinName); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the skin this entity uses.  Set to &amp;quot;&amp;quot; to turn off the skin.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSolid&#039;&#039;&#039;(float solidity); ====&lt;br /&gt;
&lt;br /&gt;
:Set the solidity of the entity. If the entity has never been solid before it will be assigned solid and opaque contents/clip masks.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSoundVolume&#039;&#039;&#039;(float newLevel); ====&lt;br /&gt;
&lt;br /&gt;
:Set the volume of the sound to play, must be issued before startSoundShader.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setTeam&#039;&#039;&#039;(float newTeam); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the team number of this entity.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;SetTimerState&#039;&#039;&#039;(float stimId, float state); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setUsedBy&#039;&#039;&#039;(entity ent, float b_canUse); ====&lt;br /&gt;
&lt;br /&gt;
:Allows to change which entities can use this entity.&lt;br /&gt;
::&#039;&#039;ent&#039;&#039;: specify an entity here, like a key&lt;br /&gt;
::&#039;&#039;b_canUse&#039;&#039;: whether the specified entity can use this entity&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setWorldOrigin&#039;&#039;&#039;(vector origin); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the current position of this entity (regardless of any bind parent).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;show&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Makes this entity visible if it has a model.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;startFx&#039;&#039;&#039;(string fx); ====&lt;br /&gt;
&lt;br /&gt;
:Starts an FX on this entity.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;startSound&#039;&#039;&#039;(string sound, float channel, float netSync); ====&lt;br /&gt;
&lt;br /&gt;
:Plays the sound specified by the snd_* key/value pair on the channel and returns the length of the sound in seconds. This is the preferred method for playing sounds on an entity since it ensures that the sound is precached.&lt;br /&gt;
::&#039;&#039;sound&#039;&#039;: the spawnarg to reference, e.g. &#039;snd_move&#039;&lt;br /&gt;
::&#039;&#039;channel&#039;&#039;: the channel to play on&lt;br /&gt;
::&#039;&#039;netSync&#039;&#039;: -&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;startSoundShader&#039;&#039;&#039;(string shaderName, float channel); ====&lt;br /&gt;
&lt;br /&gt;
:Plays a specific sound shader on the channel and returns the length of the sound in seconds. This is not the preferred method of playing a sound since you must ensure that the sound is loaded.&lt;br /&gt;
::&#039;&#039;shaderName&#039;&#039;: the sound shader to play&lt;br /&gt;
::&#039;&#039;channel&#039;&#039;: the channel to play the sound on&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;StartTimer&#039;&#039;&#039;(float stimId); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;StimAdd&#039;&#039;&#039;(float type, float radius); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;StimClearIgnoreList&#039;&#039;&#039;(float type); ====&lt;br /&gt;
&lt;br /&gt;
:This clears the ignore list for the stim of the given type It can be used if an entity changes state in some way that it would no longer be ignored&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;StimEmit&#039;&#039;&#039;(float type, float radius, vector stimOrigin); ====&lt;br /&gt;
&lt;br /&gt;
:Emits a stim in a radius around the specified origin. The entity from which this event is called needs to have the corresponding stim setup on itself, it does not need to be active.&lt;br /&gt;
::&#039;&#039;type&#039;&#039;: Index ID of the stim to emit, i.e. 21 or STIM_TRIGGER for a trigger stim.&lt;br /&gt;
::&#039;&#039;radius&#039;&#039;: How far the stim will reach. Pass negative to use the radius settings on the entity.&lt;br /&gt;
::&#039;&#039;stimOrigin&#039;&#039;: Emit the stim from here.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;StimEnable&#039;&#039;&#039;(float type, float state); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
::&#039;&#039;state&#039;&#039;: 0 = disabled, 1 = enabled&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;StimRemove&#039;&#039;&#039;(float type); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;StimSetScriptBased&#039;&#039;&#039;(float type, float state); ====&lt;br /&gt;
&lt;br /&gt;
:Converts a stim to being script-based. It will only be emitted when a script calls StimEmit on the entity.&lt;br /&gt;
::&#039;&#039;type&#039;&#039;: Index ID of the stim to alter, i.e. 21 or STIM_TRIGGER for a trigger stim.&lt;br /&gt;
::&#039;&#039;state&#039;&#039;: New state.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopSound&#039;&#039;&#039;(float channel, float netSync); ====&lt;br /&gt;
&lt;br /&gt;
:Stops a specific sound shader on the channel.&lt;br /&gt;
::&#039;&#039;channel&#039;&#039;: the channel to stop playback on&lt;br /&gt;
::&#039;&#039;netSync&#039;&#039;: -&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;StopTimer&#039;&#039;&#039;(float stimId); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;teleportTo&#039;&#039;&#039;(entity other); ====&lt;br /&gt;
&lt;br /&gt;
:Teleports the entity to the position of the other entity, plus a possible offset and random offset (defined on the spawnargs of the entity to be teleported)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;touches&#039;&#039;&#039;(entity other); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if this entity touches the other entity.&lt;br /&gt;
::&#039;&#039;other&#039;&#039;: the entity to check against&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;unbind&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Detaches this entity from its master.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;wait&#039;&#039;&#039;(float time); ====&lt;br /&gt;
&lt;br /&gt;
:Suspends execution of the current thread for the given number of seconds.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;waitFrame&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Suspends execution of current thread for one game frame.&lt;br /&gt;
&lt;br /&gt;
=== idAnimatedEntity ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearAllJoints&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Removes any custom transforms on all joints.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearJoint&#039;&#039;&#039;(float jointnum); ====&lt;br /&gt;
&lt;br /&gt;
:Removes any custom transforms on the specified joint.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getJointAngle&#039;&#039;&#039;(float jointnum); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the angular orientation of the joint in world space.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getJointHandle&#039;&#039;&#039;(string jointname); ====&lt;br /&gt;
&lt;br /&gt;
:Looks up the number of the specified joint. Returns INVALID_JOINT if the joint is not found.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getJointPos&#039;&#039;&#039;(float jointnum); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the position of the joint in world space.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setJointAngle&#039;&#039;&#039;(float jointnum, float transform_type, vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Modifies the orientation of the joint based on the transform type.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setJointPos&#039;&#039;&#039;(float jointnum, float transform_type, vector pos); ====&lt;br /&gt;
&lt;br /&gt;
:Modifies the position of the joint based on the transform type.&lt;br /&gt;
&lt;br /&gt;
=== CFrobButton ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Operate&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Call this to operate this entity.&lt;br /&gt;
&lt;br /&gt;
=== CFrobDoor ===&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;GetDoorhandle&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the handle entity of this door. Can return NULL (== $null_entity)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;OpenDoor&#039;&#039;&#039;(float master); ====&lt;br /&gt;
&lt;br /&gt;
:The OpenDoor method is necessary to give the FrobDoorHandles a  &amp;quot;low level&amp;quot; open routine. The CFrobDoor::Open() call is re-routed to the FrobDoorHandle::Tap() method, so there must be a way to actually let the door open. Which is what this method does.  Note: Shouldn&#039;t be called directly by scripters, call handle-&amp;gt;Tap() instead. Unless you know what you&#039;re doing.&lt;br /&gt;
&lt;br /&gt;
=== CFrobDoorHandle ===&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;GetDoor&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the associated door entity for this handle.&lt;br /&gt;
&lt;br /&gt;
=== CFrobHandle ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Tap&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Operates this handle.&lt;br /&gt;
&lt;br /&gt;
=== CFrobLever ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Operate&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Call this to operate this entity.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Switch&#039;&#039;&#039;(float newState); ====&lt;br /&gt;
&lt;br /&gt;
:Move the lever to the on or off position (0 = off).&lt;br /&gt;
&lt;br /&gt;
=== CFrobLock ===&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;IsLocked&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true (nonzero) if the mover is currently locked.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;IsPickable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true (nonzero) if this frobmover is pickable.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Lock&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Locks the mover. Calls to Open() will not succeed after this call. &lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Open&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Opens the frobmover, regardless of its previous state. The mover will not move when it&#039;s locked. &lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;TDM_Lock_OnLockPicked&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:internal&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;TDM_Lock_StatusUpdate&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:internal&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ToggleLock&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Toggles the lock state. Unlocked movers will be locked and vice versa. The notes above concerning Unlock() still apply if this call unlocks the mover. &lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Unlock&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Unlocks the mover. Calls to Open() will succeed after this call. Depending on the value of the spawnarg &amp;quot;open_on_unlock&amp;quot; the mover might automatically open after this call. &lt;br /&gt;
&lt;br /&gt;
=== CFrobLockHandle ===&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;GetLock&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the associated lock of this handle.&lt;br /&gt;
&lt;br /&gt;
=== tdmFuncShooter ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;shooterFireProjectile&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Fires a projectile.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;shooterGetAmmo&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get the ammonition&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;shooterGetState&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current state of this shooter.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;shooterSetAmmo&#039;&#039;&#039;(float newAmmo); ====&lt;br /&gt;
&lt;br /&gt;
:Set the ammonition&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;shooterSetState&#039;&#039;&#039;(float state); ====&lt;br /&gt;
&lt;br /&gt;
:Activates / deactivates the shooter entity.&lt;br /&gt;
::&#039;&#039;state&#039;&#039;: 1 = active, 0 = inactive&lt;br /&gt;
&lt;br /&gt;
=== idEntityFx ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idItem ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;respawn&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Respawn&lt;br /&gt;
&lt;br /&gt;
=== idMoveableItem ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;gib&#039;&#039;&#039;(string damageDefName); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
=== idLight ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;fadeInLight&#039;&#039;&#039;(float time); ====&lt;br /&gt;
&lt;br /&gt;
:Turns the light on over the given time in seconds.&lt;br /&gt;
::&#039;&#039;time&#039;&#039;: in seconds&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;fadeOutLight&#039;&#039;&#039;(float time); ====&lt;br /&gt;
&lt;br /&gt;
:Turns the light out over the given time in seconds.&lt;br /&gt;
::&#039;&#039;time&#039;&#039;: in seconds&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;fadeToLight&#039;&#039;&#039;(vector color, float time); ====&lt;br /&gt;
&lt;br /&gt;
:Fades the light to the given color over a given time.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getLightLevel&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get level (intensity) of a light, &amp;lt;= 0.0 indicates it is off&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getLightOrigin&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get the light origin (independent of its visual model)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getLightParm&#039;&#039;&#039;(float parmNum); ====&lt;br /&gt;
&lt;br /&gt;
:Gets a shader parameter.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getRadius&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the light radius.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getShader&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the shader name used by the light.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Off&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Switches the emitter off.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;On&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Switches the emitter on.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setLightOrigin&#039;&#039;&#039;(vector pos); ====&lt;br /&gt;
&lt;br /&gt;
:Set origin of lights independent of model origin&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setLightParm&#039;&#039;&#039;(float parmNum, float value); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a shader parameter.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setLightParms&#039;&#039;&#039;(float parm0, float parm1, float parm2, float parm3); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the red/green/blue/alpha shader parms on the light and the model.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setRadius&#039;&#039;&#039;(float radius); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the size of the bounding box, x=y=z=radius.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setRadiusXYZ&#039;&#039;&#039;(float x, float y, float z); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the width/length/height of the light bounding box.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setShader&#039;&#039;&#039;(string shader); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the shader to be used for the light.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setStartedOff&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;smoking&#039;&#039;&#039;(float state); ====&lt;br /&gt;
&lt;br /&gt;
:flame is now smoking (1), or not (0)&lt;br /&gt;
::&#039;&#039;state&#039;&#039;: 1 = smoking, 0 = not smoking&lt;br /&gt;
&lt;br /&gt;
=== idListener ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idPlayerStart ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idActivator ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idPathCorner ===&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;randomPath&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
=== idDamagable ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idExplodable ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idForceField ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Toggle&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Turns the forcefield on and off.&lt;br /&gt;
&lt;br /&gt;
=== idAnimated ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;footstep&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Plays footstep sound.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;launchMissiles&#039;&#039;&#039;(string projectilename, string sound, string launchbone, string targetbone, float numshots, float framedelay); ====&lt;br /&gt;
&lt;br /&gt;
:Launches a projectile.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;leftFoot&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Changes to left foot and plays footstep sound.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;rightFoot&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Changes to right foot and plays footstep sound.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;startRagdoll&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Switches to a ragdoll taking over the animation.&lt;br /&gt;
&lt;br /&gt;
=== idStaticEntity ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idFuncSmoke ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSmoke&#039;&#039;&#039;(string particleDef); ====&lt;br /&gt;
&lt;br /&gt;
:Changes the smoke particle of a func_smoke.&lt;br /&gt;
&lt;br /&gt;
=== idVacuumSeparatorEntity ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idPortalEntity ===&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getPortalHandle&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the portal handle.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getSoundLoss&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the sound loss value (dB).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSoundLoss&#039;&#039;&#039;(float loss); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the sound loss value (dB).&lt;br /&gt;
&lt;br /&gt;
=== idBeam ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idShaking ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idEarthQuake ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idFuncPortal ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idFuncAASPortal ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idFuncAASObstacle ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idPhantomObjects ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idPortalSky ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== tdmVine ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;addDescendant&#039;&#039;&#039;(entity vine); ====&lt;br /&gt;
&lt;br /&gt;
:Event called using vine.*()&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canWater&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Event called using vine.*()&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearWatered&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Event called using vine.*()&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getPrime&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Event called using vine.*()&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;scaleVine&#039;&#039;&#039;(float factor); ====&lt;br /&gt;
&lt;br /&gt;
:Event called using vine.*()&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setPrime&#039;&#039;&#039;(entity vine); ====&lt;br /&gt;
&lt;br /&gt;
:Event called using vine.*()&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setWatered&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Event called using vine.*()&lt;br /&gt;
&lt;br /&gt;
=== idMoveable ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;becomeNonSolid&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Makes the moveable non-solid for other entities.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enableDamage&#039;&#039;&#039;(float enable); ====&lt;br /&gt;
&lt;br /&gt;
:enable/disable damage&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isAtRest&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if object is not moving&lt;br /&gt;
&lt;br /&gt;
=== idMover ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;accelSound&#039;&#039;&#039;(string sound); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the sound to be played when the mover accelerates.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;accelTime&#039;&#039;&#039;(float time); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the acceleration time. Set this acceleration time before initiating a new move.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;accelTo&#039;&#039;&#039;(float speed, float time); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates an acceleration to the given speed over the given time in seconds.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;bob&#039;&#039;&#039;(float speed, float phase, vector distance); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a translation back and forth along the given vector with the given speed and phase.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;closePortal&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Closes the renderer portal associated with this mover.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;decelSound&#039;&#039;&#039;(string sound); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the sound to be played when the mover decelerates.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;decelTime&#039;&#039;&#039;(float time); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the deceleration time. Set this deceleration time before initiating a new move.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;decelTo&#039;&#039;&#039;(float speed, float time); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a deceleration to the given speed over the given time in seconds.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disableSplineAngles&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Disables aligning the mover with the spline direction.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enableSplineAngles&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Enables aligning the mover with the spline direction.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMoveSpeed&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get the movement speed.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMoveTime&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the movement time.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isMoving&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if a mover is moving&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isRotating&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if a mover is rotating&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;move&#039;&#039;&#039;(float angle, float distance); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a translation with the given distance in the given yaw direction. Uses the current speed/time and acceleration and deceleration settings.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveSound&#039;&#039;&#039;(string sound); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the sound to be played when the moving.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveTo&#039;&#039;&#039;(entity targetEntity); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a translation to the position of an entity. Uses the current speed/time and acceleration and deceleration settings.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;moveToPos&#039;&#039;&#039;(vector pos); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a translation to an absolute position. Uses the current speed/time and acceleration and deceleration settings.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;openPortal&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Opens the renderer portal associated with this mover.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;removeInitialSplineAngles&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Subtracts the initial spline angles to maintain the initial orientation of the mover.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;rotate&#039;&#039;&#039;(vector angleSpeed); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a rotation with the given angular speed. Uses the current speed/time and acceleration and deceleration settings.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;rotateDownTo&#039;&#039;&#039;(float axis, float angle); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a rotation about the given axis by decreasing the current angle towards the given angle. Uses the current speed/time and acceleration and deceleration settings.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;rotateOnce&#039;&#039;&#039;(vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a rotation towards the current angles plus the given Euler angles. Uses the current speed/time and acceleration and deceleration settings.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;rotateTo&#039;&#039;&#039;(vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a rotation towards the given Euler angles. Uses the current speed/time and acceleration and deceleration settings.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;rotateUpTo&#039;&#039;&#039;(float axis, float angle); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a rotation about the given axis by increasing the current angle towards the given angle. Uses the current speed/time and acceleration and deceleration settings.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;speed&#039;&#039;&#039;(float speed); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the movement speed. Set this speed before initiating a new move.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;startSpline&#039;&#039;&#039;(entity spline); ====&lt;br /&gt;
&lt;br /&gt;
:Starts moving along a spline stored on the given entity.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopMoving&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Stops any translational movement.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopRotating&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Stops any rotational movement.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopSpline&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Stops moving along a spline.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;sway&#039;&#039;&#039;(float speed, float phase, vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Initiates a rotation back and forth along the given angles with the given speed and phase.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;time&#039;&#039;&#039;(float time); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the movement time. Set this time before initiating a new move.&lt;br /&gt;
&lt;br /&gt;
=== idMover_Binary ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;closePortal&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Closes the renderer portal associated with this mover.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Disables the mover/trigger&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Enables the mover/trigger&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;openPortal&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Opens the renderer portal associated with this mover.&lt;br /&gt;
&lt;br /&gt;
=== idRotater ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idRiser ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idPlayer ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;changeWeaponName&#039;&#039;&#039;(string weaponName, string displayName); ====&lt;br /&gt;
&lt;br /&gt;
:Changes the display name of the given weapon item to something different. Pass an empty string to reset the display name to the definition as found in the weaponDef.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;changeWeaponProjectile&#039;&#039;&#039;(string weaponName, string projectileDefName); ====&lt;br /&gt;
&lt;br /&gt;
:Changes the projectile entityDef name of the given weapon (e.g. &amp;quot;broadhead&amp;quot;) to the specified entityDef (e.g. &amp;quot;atdm:projectile_broadhead&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;checkAAS&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearActiveInventoryMap&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Clear the active inventory map entity&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearActiveInventoryMapEnt&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Clear the active inventory map entity&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearMouseDeadTime&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;customDeath&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;deathMenu&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disableWeapon&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Lowers and disables the player weapon.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enableWeapon&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Enables the player weapon.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;endZoom&#039;&#039;&#039;(float duration); ====&lt;br /&gt;
&lt;br /&gt;
:Starts the zoom out event, which performs a gradual transition back to the default FOV. May be called during a transition as well to intercept a pending zoom in transition.&lt;br /&gt;
::&#039;&#039;duration&#039;&#039;: duration of the transition in msec&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;exitTeleporter&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getButtons&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the button state from the current user command.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getCalibratedLightgemValue&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the calibrated light gem value.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getCurrentWeapon&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns weaponX where X is the number of the weapon the player is currently holding.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getCurWeaponName&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the name of the current weapon, as defined by &amp;quot;inv_weapon_name&amp;quot; in the weaponDef.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getDragged&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the currently dragged body. Returns $null_entity if the body is shouldered, the player has nothing in his hands, or he has a non-AF entity in his hands. See also getShouldered(), getGrabbed() and getFrobbed().&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getFov&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:This returns the current FOV of the player. You can modify the current FOV with startZoom() and endZoom().&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getFrobbed&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the currently frobhilighted entity. This includes entities the player has in his hands. Sets &amp;quot;frob only used by&amp;quot; mode&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getGrabbed&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the currently entity in the players hands. Returns $null_entity if the player has nothing in his hands Dragging or shouldering a body counts as grabbing it. See also getDragged(), getShouldered(), getFrobbed().&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getHinderance&#039;&#039;&#039;(string source); ====&lt;br /&gt;
&lt;br /&gt;
:Used to get hinderance from a source.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getImmobilization&#039;&#039;&#039;(string source); ====&lt;br /&gt;
&lt;br /&gt;
:Used to get immobilization from a source. Warning: Not a finalized version. It&#039;s subject to change, so use it at your own risk.)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getInventoryOverlay&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the default inventory overlay for the player. All other entities will return an invalid value.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getListenLoc&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Retrieves the location of the listener when leaning.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMouseGesture&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the results of the last mouse gesture in enum form. (see the definition for MOUSEDIR_* for which numbers correspond to which directions)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getMove&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the movement relative to the player&#039;s view angles from the current user command. vector_x = forward, vector_y = right, vector_z = up&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getNextHinderance&#039;&#039;&#039;(string prefix, string lastMatch); ====&lt;br /&gt;
&lt;br /&gt;
:Used to get the next hinderance from a source.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getNextImmobilization&#039;&#039;&#039;(string prefix, string lastMatch); ====&lt;br /&gt;
&lt;br /&gt;
:Used to get immobilization from a source. Warning: Not a finalized version. It&#039;s subject to change, so use it at your own risk.)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getNextTurnHinderance&#039;&#039;&#039;(string prefix, string lastMatch); ====&lt;br /&gt;
&lt;br /&gt;
:Get the next hinderance on the view turning from a source&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getObjectiveComp&#039;&#039;&#039;(float ObjNum, float CompNum); ====&lt;br /&gt;
&lt;br /&gt;
:Used to get the state of custom objective components&lt;br /&gt;
::&#039;&#039;ObjNum&#039;&#039;: Starts counting at 1&lt;br /&gt;
::&#039;&#039;CompNum&#039;&#039;: Starts counting at 1&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getObjectiveState&#039;&#039;&#039;(float ObjNum); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current state of the objective with the number ObjNum.  State is one of the following: OBJ_INCOMPLETE = 0, OBJ_COMPLETE = 1, OBJ_INVALID = 2, OBJ_FAILED = 3&lt;br /&gt;
::&#039;&#039;ObjNum&#039;&#039;: Starts counting at 1&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getObjectiveVisible&#039;&#039;&#039;(float ObjNum); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current visibility of the objective with the number ObjNum.&lt;br /&gt;
::&#039;&#039;ObjNum&#039;&#039;: Starts counting at 1&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getPreviousWeapon&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns weaponX where X is the number of the weapon the player was previously holding.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getShouldered&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the currently shouldered body, otherwise $null_entity. See also getDragged(), getGrabbed() and getFrobbed().&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getTurnHinderance&#039;&#039;&#039;(string source); ====&lt;br /&gt;
&lt;br /&gt;
:* Get the hinderance on the view turning from a source&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getViewAngles&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the player view angles.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getWeaponEntity&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the entity for the player&#039;s weapon&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;giveHealthPool&#039;&#039;&#039;(float amount); ====&lt;br /&gt;
&lt;br /&gt;
:This increases/decreases the healthpool of the player by the given amount. The healthpool is gradually decreased over time, healing (damaging?) the player.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;heldEntity&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the entity currently being held, or $null_entity if the player&#039;s hands are empty.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;holdEntity&#039;&#039;&#039;(entity entity); ====&lt;br /&gt;
&lt;br /&gt;
:Forces the player to hold an entity (e.g. puts it into the grabber). Drops whatever is in the player&#039;s hands if $null_entity is passed to it. Returns 1 if successful, 0 if not.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isAirborne&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Checks whether the player is in the air.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isLeaning&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get whether the player is leaning&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isPeekLeaning&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get whether the player is peek leaning (against a keyhole or crack)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;missionFailed&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;missionSuccess&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;mouseGestureFinished&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the player is not currently doing a mouse gesture.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;objectiveCompUnlatch&#039;&#039;&#039;(float ObjNum, float CompNum); ====&lt;br /&gt;
&lt;br /&gt;
:Unlatch an irreversible objective component that has latched into a state&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;objectiveUnlatch&#039;&#039;&#039;(float ObjNum); ====&lt;br /&gt;
&lt;br /&gt;
:Unlatch an irreversible objective that has latched into a state&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;pauseGame&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Pauses the game. This should only be called for threads that are explicitly maintained by a special SDK method, because ordinary threads won&#039;t get executed during g_stopTime == true. Note: This is used by the objective GUI threads. Note: Must be called on the player entity, not the sys entity.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;playStartSound&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;readLightgemModifierFromWorldspawn&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;resetWeaponProjectile&#039;&#039;&#039;(string weaponName); ====&lt;br /&gt;
&lt;br /&gt;
:Reloads the original projectile def name from the weaponDef. Used to revert a change made by the event changeWeaponProjectile().&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;resetZoom&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Cancels any pending zoom transitions and resets the FOV to normal.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ropeRemovalCleanup&#039;&#039;&#039;(entity ropeEnt); ====&lt;br /&gt;
&lt;br /&gt;
:Called when rope arrow ropes are removed, removes stale pointers on the player object.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;saveGame&#039;&#039;&#039;(string filename); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;selectWeapon&#039;&#039;&#039;(string weapon); ====&lt;br /&gt;
&lt;br /&gt;
:Selects the weapon the player is holding.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setActiveInventoryMapEnt&#039;&#039;&#039;(entity mapEnt); ====&lt;br /&gt;
&lt;br /&gt;
:Notify the player about a new active map entity. This clears out any previously active maps.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setAirAccelerate&#039;&#039;&#039;(float newAccelerate); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a multiplier for the player&#039;s horizontal acceleration while airborne. Default is 1.0.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setFrobOnlyUsedByInv&#039;&#039;&#039;(float OnOff); ====&lt;br /&gt;
&lt;br /&gt;
:Engages or disengages a mode where we only frobhilight entities that can be used by our current inventory item. This also disables general frobactions and only allows &amp;quot;used by&amp;quot; frob actions.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setHinderance&#039;&#039;&#039;(string source, float mCap, float fCap); ====&lt;br /&gt;
&lt;br /&gt;
:Used to set hinderance from a source.&lt;br /&gt;
::&#039;&#039;mCap&#039;&#039;: mCap values from all sources are multiplied together to define a cap&lt;br /&gt;
::&#039;&#039;fCap&#039;&#039;: fCap values are not additive, the smallest one among all the sources is used&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setImmobilization&#039;&#039;&#039;(string source, float type); ====&lt;br /&gt;
&lt;br /&gt;
:Used to set immobilization from a source. Warning: Not a finalized version. It&#039;s subject to change, so use it at your own risk.)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setLightgemModifier&#039;&#039;&#039;(string modifierName, float value); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the named lightgem modifier to a certain value. An example would be the player lantern: setLightgemModifier(&amp;quot;lantern&amp;quot;, 32). This way multiple modifiers can be set by concurrent script threads.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setObjectiveComp&#039;&#039;&#039;(float ObjNum, float CompNum, float state); ====&lt;br /&gt;
&lt;br /&gt;
:Used to set the state of custom objective components&lt;br /&gt;
::&#039;&#039;ObjNum&#039;&#039;: objective number. Starts counting at 1&lt;br /&gt;
::&#039;&#039;CompNum&#039;&#039;: component number. Starts counting at 1&lt;br /&gt;
::&#039;&#039;state&#039;&#039;: 1 or 0 for true or false&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setObjectiveEnabling&#039;&#039;&#039;(float ObjNum, string strIn); ====&lt;br /&gt;
&lt;br /&gt;
:Set an objective&#039;s enabling objectives (objectives that must be completed before that objective may be completed).&lt;br /&gt;
::&#039;&#039;strIn&#039;&#039;: takes the form of a string that is a space-delimited list of integer objectives representing the new enabling objectives. E.g. : &#039;1 2 3 4&#039;&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setObjectiveNotification&#039;&#039;&#039;(float ObjNote); ====&lt;br /&gt;
&lt;br /&gt;
:Turns the notifications (sound ++ text) for objectives on/off.&lt;br /&gt;
::&#039;&#039;ObjNote&#039;&#039;: Turn notifications on/off&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setObjectiveOngoing&#039;&#039;&#039;(float ObjNum, float val); ====&lt;br /&gt;
&lt;br /&gt;
:Sets objective ongoing.&lt;br /&gt;
::&#039;&#039;val&#039;&#039;: 1 for true, 0 for false&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setObjectiveOptional&#039;&#039;&#039;(float ObjNum, float val); ====&lt;br /&gt;
&lt;br /&gt;
:Sets objective mandatory.&lt;br /&gt;
::&#039;&#039;val&#039;&#039;: 1 for true, 0 for false&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setObjectiveState&#039;&#039;&#039;(float ObjNum, float State); ====&lt;br /&gt;
&lt;br /&gt;
:Used to set the state of objectives from the script. For example, use this to invalidate an objective when something happens in your mission. The first argument is the numerical index of the objective (taking &#039;user&#039; objective indices, starting at 1). Choose from the following for the second argument: OBJ_INCOMPLETE, OBJ_COMPLETE, OBJ_INVALID, OBJ_FAILED. Use this on $player1 like $player1.setObjectiveState(1, OBJ_COMPLETE);&lt;br /&gt;
::&#039;&#039;ObjNum&#039;&#039;: Starts counting at 1&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setObjectiveText&#039;&#039;&#039;(float ObjNum, string newText); ====&lt;br /&gt;
&lt;br /&gt;
:Modify the displayed text for an objective. Can also be a string template like #str_20000&lt;br /&gt;
::&#039;&#039;ObjNum&#039;&#039;: Starts counting at 1&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setObjectiveVisible&#039;&#039;&#039;(float ObjNum, float val); ====&lt;br /&gt;
&lt;br /&gt;
:Sets objective visibility.&lt;br /&gt;
::&#039;&#039;val&#039;&#039;: 1 for true, 0 for false&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setPeekOverlayBackground&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the background overlay for peeking, depending on aspect ratio.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setPeekView&#039;&#039;&#039;(float OnOff, vector origin); ====&lt;br /&gt;
&lt;br /&gt;
:Toggle whether we should use a view from a peek entity as the player&#039;s view&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSavePermissions&#039;&#039;&#039;(float permission); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
::&#039;&#039;permission&#039;&#039;: 0&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSpyglassOverlayBackground&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the background overlay for the spyglass, depending on aspect ratio.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setTurnHinderance&#039;&#039;&#039;(string source, float mCap, float fCap); ====&lt;br /&gt;
&lt;br /&gt;
:Set the hinderance on the view turning from a source&lt;br /&gt;
::&#039;&#039;mCap&#039;&#039;: mCap values from all sources are multiplied together to define a cap&lt;br /&gt;
::&#039;&#039;fCap&#039;&#039;: fCap values are not additive, the smallest one among all the sources is used&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setViewAngles&#039;&#039;&#039;(vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the player view angles, e.g. make the player facing this direction. 0 0 0 is east (along the X axis in DR), 0 90 0 north (along the Y axis in DR) 0 180 0 west, 0 270 0 south.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;startGamePlayTimer&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Resets the game play timer to zero and (re)starts it.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;startMouseGesture&#039;&#039;&#039;(float key, float thresh, float test, float inverted, float turnHinderance, float decideTime, float deadTime); ====&lt;br /&gt;
&lt;br /&gt;
:Start tracking a mouse gesture that started when the key impulse was pressed. Discretizes analog mouse movement into a few different gesture possibilities. Impulse arg can also be a button, see the UB_* enum in usercmdgen.h. For now, only one mouse gesture check at a time.&lt;br /&gt;
::&#039;&#039;thresh&#039;&#039;: Waits until the threshold mouse input thresh is reached before deciding.&lt;br /&gt;
::&#039;&#039;test&#039;&#039;: determines which test to do (0 = up/down, 1 = left/right, 2 = 4 directions, 3 = 8 directions).&lt;br /&gt;
::&#039;&#039;inverted&#039;&#039;: inverts the movement if set to 1, does not if 0&lt;br /&gt;
::&#039;&#039;turnHinderance&#039;&#039;: Sets the max player view turn rate when checking this mouse gesture (0 =&amp;gt; player view locked, 1.0 =&amp;gt; no effect on view turning)&lt;br /&gt;
::&#039;&#039;decideTime&#039;&#039;: time in milliseconds after which the mouse gesture is auto-decided, in the event that the mouse movement threshold was not reached. A DecideTime of -1 means wait forever until the button is released.&lt;br /&gt;
::&#039;&#039;deadTime&#039;&#039;: how long after attack is pressed that mouse control remains dampened by the fraction turnHinderance.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;startZoom&#039;&#039;&#039;(float duration, float startFOV, float endFOV); ====&lt;br /&gt;
&lt;br /&gt;
:Call this to start the zoom in event. The player FOV is gradually zoomed in until over the given timespan.&lt;br /&gt;
::&#039;&#039;duration&#039;&#039;: duration of the transition in msec&lt;br /&gt;
::&#039;&#039;startFOV&#039;&#039;: The start FOV, this is clamped to [1..179]&lt;br /&gt;
::&#039;&#039;endFOV&#039;&#039;: The end FOV, this is clamped to [1..179]&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopFxFov&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;stopMouseGesture&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;testEvent1&#039;&#039;&#039;(float float_pi, float int_beef, float float_exp, string string_tdm, float float_exp10, float int_food); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;testEvent2&#039;&#039;&#039;(float int_prevres, vector vec_123, float int_food, entity ent_player, entity ent_null, float float_pi, float float_exp); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;testEvent3&#039;&#039;&#039;(entity ent_prevres, vector vec_123, float float_pi, entity ent_player); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;triggerMissionEnd&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;unpauseGame&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Unpauses the game. Most scripts are not executed during g_stopTime == true and won&#039;t get into the position of calling this.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;wasDamaged&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Check if the player was damaged this frame.&lt;br /&gt;
&lt;br /&gt;
=== idProjectile ===&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getProjectileState&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Gets the current state of the projectile. States are defined in tdm_defs.script&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;launch&#039;&#039;&#039;(vector start, vector dir, vector velocity); ====&lt;br /&gt;
&lt;br /&gt;
:Launches the projectile from &amp;lt;start&amp;gt; in direction &amp;lt;dir&amp;gt; with the given &amp;lt;velocity&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;TDM_Lock_OnLockPicked&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:internal&lt;br /&gt;
&lt;br /&gt;
=== idGuidedProjectile ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;launchGuided&#039;&#039;&#039;(vector start, vector dir, vector velocity, entity target); ====&lt;br /&gt;
&lt;br /&gt;
:Launches the guided projectile from &amp;lt;start&amp;gt; in direction &amp;lt;dir&amp;gt; with the given &amp;lt;velocity&amp;gt; at &amp;lt;target entity&amp;gt;. Pass $null_entity to fire an unguided projectile.&lt;br /&gt;
&lt;br /&gt;
=== CProjectileResult ===&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getActualStruckEnt&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Getter for projectile result variable&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getAxialDir&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Getter for projectile result variable&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getFinalAngVel&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Getter for projectile result variable&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getFinalVel&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Getter for projectile result variable&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getIncidenceAngle&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Getter for projectile result variable&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getProjMass&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Getter for projectile result variable&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getStruckEnt&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Getter for projectile result variable&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getSurfNormal&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Getter for projectile result variable&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getSurfType&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Getter for projectile result variable&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isVineFriendly&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Vine-arrow event&lt;br /&gt;
&lt;br /&gt;
=== CTarget_SetRelations ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== CTarget_SetEntityRelation ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== CTarget_ChangeEntityRelation ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idThread ===&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;acos&#039;&#039;&#039;(float cosine); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the angle in degrees with the given cosine.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;angRotate&#039;&#039;&#039;(vector angles1, vector angles2); ====&lt;br /&gt;
&lt;br /&gt;
:Rotates the given Euler angles by each other.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;angToForward&#039;&#039;&#039;(vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a forward vector for the given Euler angles.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;angToRight&#039;&#039;&#039;(vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a right vector for the given Euler angles.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;angToUp&#039;&#039;&#039;(vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Returns an up vector for the given Euler angles.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;asin&#039;&#039;&#039;(float sine); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the angle in degrees with the given sine.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;assert&#039;&#039;&#039;(float condition); ====&lt;br /&gt;
&lt;br /&gt;
:Breaks if the condition is zero. (Only works in debug builds.)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;cacheSoundShader&#039;&#039;&#039;(string shaderName); ====&lt;br /&gt;
&lt;br /&gt;
:Ensure the specified sound shader is loaded by the system. Prevents cache misses when playing sound shaders.&lt;br /&gt;
::&#039;&#039;shaderName&#039;&#039;: the sound shader to cache&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;callFunctionsByWildcard&#039;&#039;&#039;(string functionName); ====&lt;br /&gt;
&lt;br /&gt;
:Calls global functions with names matching the specified wildcard in separate threads (in lexicographical order). INTERNAL: don&#039;t use in mission scripting!&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canPlant&#039;&#039;&#039;(vector traceStart, vector traceEnd, entity ignore, entity vine); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;ceil&#039;&#039;&#039;(float x); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the smallest integer that is greater than or equal to the given value.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearPersistentArgs&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Clears data that persists between maps.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;clearSignalThread&#039;&#039;&#039;(float signalNum, entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:Clears the script callback function set for when the given signal is raised on the given entity.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;copySpawnArgs&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:copies the spawn args from an entity&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;cos&#039;&#039;&#039;(float degrees); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the cosine of the given angle in degrees.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;CrossProduct&#039;&#039;&#039;(vector vec1, vector vec2); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the cross product of the two vectors.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;debugArrow&#039;&#039;&#039;(vector color, vector start, vector end, float size, float lifetime); ====&lt;br /&gt;
&lt;br /&gt;
:line drawing for debug visualization.  lifetime of 0 == 1 frame.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;debugBounds&#039;&#039;&#039;(vector color, vector mins, vector maxs, float lifetime); ====&lt;br /&gt;
&lt;br /&gt;
:line drawing for debug visualization.  lifetime of 0 == 1 frame.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;debugCircle&#039;&#039;&#039;(vector color, vector origin, vector dir, float radius, float numSteps, float lifetime); ====&lt;br /&gt;
&lt;br /&gt;
:line drawing for debug visualization.  lifetime of 0 == 1 frame.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;debugLine&#039;&#039;&#039;(vector color, vector start, vector end, float lifetime); ====&lt;br /&gt;
&lt;br /&gt;
:line drawing for debug visualization.  lifetime of 0 == 1 frame.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;DotProduct&#039;&#039;&#039;(vector vec1, vector vec2); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the dot product of the two vectors.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;drawText&#039;&#039;&#039;(string text, vector origin, float scale, vector color, float align, float lifetime); ====&lt;br /&gt;
&lt;br /&gt;
:text drawing for debugging. lifetime of 0 == 1 frame.&lt;br /&gt;
::&#039;&#039;align&#039;&#039;: 0 = left, 1 = center, 2 = right&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;emitParticle&#039;&#039;&#039;(string particle, float startTime, float diversity, vector origin, vector angle); ====&lt;br /&gt;
&lt;br /&gt;
:Start a particle effect in the world without using an entity emitter. Will emit one quad per particle stage when first called with sys.getTime() as the start time. Designed to be called once per frame with the same startTime each call to achieve a normal particle effect, or on demand with sys.getTime() as the startTime for finer grained control, 1 quad at a time. Returns True (1) if there are more particles to be emitted from the stage, False (0) if the stage has released all its quads.&lt;br /&gt;
::&#039;&#039;particle&#039;&#039;: String: name of particle effect.&lt;br /&gt;
::&#039;&#039;startTime&#039;&#039;: Game seconds since map start: use sys.getTime() for the first call unless you want to back-date the particle so that it starts part way through its cycle.&lt;br /&gt;
::&#039;&#039;diversity&#039;&#039;: Randomizer value between 0 and 1. All particles with the same diversity will have the same path and rotation. Use sys.random(1) for a random path.&lt;br /&gt;
::&#039;&#039;origin&#039;&#039;: Origin of the particle effect.&lt;br /&gt;
::&#039;&#039;angle&#039;&#039;: Axis for the particle effect. Use $&amp;lt;entityname&amp;gt;.getAngles() to align the particle to an entity. use &#039;0 0 0&#039; for an upright (world-aligned) particle effect.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;error&#039;&#039;&#039;(string text); ====&lt;br /&gt;
&lt;br /&gt;
:Issues an error.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;fadeIn&#039;&#039;&#039;(vector color, float time); ====&lt;br /&gt;
&lt;br /&gt;
:Fades towards the given color over the given time in seconds.&lt;br /&gt;
::&#039;&#039;time&#039;&#039;: in seconds&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;fadeOut&#039;&#039;&#039;(vector color, float time); ====&lt;br /&gt;
&lt;br /&gt;
:Fades from the given color over the given time in seconds.&lt;br /&gt;
::&#039;&#039;time&#039;&#039;: in seconds&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;fadeTo&#039;&#039;&#039;(vector color, float alpha, float time); ====&lt;br /&gt;
&lt;br /&gt;
:Fades to the given color up to the given alpha over the given time in seconds.&lt;br /&gt;
::&#039;&#039;time&#039;&#039;: in seconds&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;firstPerson&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns view control to the player entity.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;floor&#039;&#039;&#039;(float x); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the largest integer that is less than or equal to the given value.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getCurrentMissionNum&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of the current mission (0-based, the first mission has number 0).&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getcvar&#039;&#039;&#039;(string name); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the string for a cvar.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getcvarf&#039;&#039;&#039;(string name); ====&lt;br /&gt;
&lt;br /&gt;
:Returns float value for a cvar.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getDifficultyLevel&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns 0 (Easy), 1 (Medium) or 2 (Hard), depending on the difficulty level of the current mission.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getDifficultyName&#039;&#039;&#039;(float difficultyLevel); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the (translated) name of the difficulty level passed as the argument.&lt;br /&gt;
::&#039;&#039;difficultyLevel&#039;&#039;: 0 (Easy), 1 (Medium), 2 (Hard)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getEntity&#039;&#039;&#039;(string name); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a reference to the entity with the specified name.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getFrameTime&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:returns the length of time between game frames.  this is not related to renderer frame rate.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getInterceptTime&#039;&#039;&#039;(vector velocityTarget, float speedInterceptor, vector positionTarget, vector positionInterceptor); ====&lt;br /&gt;
&lt;br /&gt;
:Returns how much time it will take for an interceptor like a projectile to intercept a moving target at the earliest possible opportunity. Returns 0 if an intercept is not possible or the speed of the target and interceptor are too similar.&lt;br /&gt;
::&#039;&#039;velocityTarget&#039;&#039;: current velocity of target&lt;br /&gt;
::&#039;&#039;speedInterceptor&#039;&#039;: speed of interceptor&lt;br /&gt;
::&#039;&#039;positionTarget&#039;&#039;: current position of target&lt;br /&gt;
::&#039;&#039;positionInterceptor&#039;&#039;: starting position of interceptor&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getLocationPoint&#039;&#039;&#039;(vector point); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the idLocation entity corresponding to the specified point&#039;s location.&lt;br /&gt;
::&#039;&#039;point&#039;&#039;: point whose location to check&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getMainAmbientLight&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the entity of the main ambient light.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getMissionStatistic&#039;&#039;&#039;(string statisticName); ====&lt;br /&gt;
&lt;br /&gt;
:Returns current mission statistic.&lt;br /&gt;
::&#039;&#039;statisticName&#039;&#039;: Can be one of (case insensitive): 	gamePlayTime: gameplay time in seconds 	damageDealt: damage dealt to enemies 	damageReceived: damage received by player 	healthReceived: health received by player 	pocketsPicked: pockets picked by player 	foundLoot: loot found by player 	missionLoot: total loot available in mission 	totalTimePlayerSeen: total time the player was seen by enemies in seconds. Updates only when AI lose sight of player 	numberTimesPlayerSeen: number of times player was seen by enemies 	numberTimesAISuspicious: number of times AI was &#039;observant&#039; or &#039;suspicious&#039;. A single AI passing through both alert levels will add 2 to the score. 	numberTimesAISearched: number of times AI was &#039;investigating&#039; or &#039;searching&#039;. A single AI passing through both alert levels will add 2 to the score. 	sightingScore: sighting score (number of times player was seen * weight) 	stealthScore: stealth score (sighting score + alerts * weights) 	killedByPlayer: number of enemies killed by player 	knockedOutByPlayer: number of enemies knocked out by player 	bodiesFound: number of times enemies have spotted a body 	secretsFound: number of secrets found by the player 	secretsTotal: total number of secrets in the mission &lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getNextEntity&#039;&#039;&#039;(string key, string value, entity lastMatch); ====&lt;br /&gt;
&lt;br /&gt;
:Discover all entities in the map. Returns $null_entity when no more found.&lt;br /&gt;
::&#039;&#039;key&#039;&#039;: Optional string: prefix for spawnarg key match. E.g. &amp;quot;target&amp;quot; will match &amp;quot;target&amp;quot;, &amp;quot;target1&amp;quot; etc.&lt;br /&gt;
::&#039;&#039;value&#039;&#039;: Optional string: spawnarg value to match. Can be used independently of &#039;&#039;key&#039;&#039;. If &#039;&#039;key&#039;&#039; is not set, all spawnargs will be checked for the value.&lt;br /&gt;
::&#039;&#039;lastMatch&#039;&#039;: Last match: search will start after this entity. Use $null_entity or pass an uninitialized entity variable to start a new search.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getPersistentFloat&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the floating point value for the given persistent arg&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getPersistentString&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the string for the given persistent arg&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getPersistentVector&#039;&#039;&#039;(string key); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the vector for the given persistent arg&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getPortAISoundLoss&#039;&#039;&#039;(float handle); ====&lt;br /&gt;
&lt;br /&gt;
:AI sound propagation scriptfunction on the sys object&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getPortPlayerSoundLoss&#039;&#039;&#039;(float handle); ====&lt;br /&gt;
&lt;br /&gt;
:Player sound loss  scriptfunction on the sys object&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getPortSoundLoss&#039;&#039;&#039;(float handle); ====&lt;br /&gt;
&lt;br /&gt;
:Sound propagation scriptfunction on the sys object&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getRelation&#039;&#039;&#039;(float team1, float team2); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getTDMVersion&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Get the current TDM version as integer. The value will be 108 for v1.08, 109 for v1.09 and 200 for v2.00 etc.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getTicsPerSecond&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:returns the number of game frames per second.  this is not related to renderer frame rate.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getTime&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the current game time in seconds.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getTraceBody&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of the body part of the entity which was hit during the last call to trace or tracePoint&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getTraceEndPos&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the position the trace stopped due to a collision with solid geometry during the last call to trace or tracePoint&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getTraceEntity&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a reference to the entity which was hit during the last call to trace or tracePoint&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getTraceFraction&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the fraction of movement completed during the last call to trace or tracePoint.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getTraceJoint&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of the skeletal joint closest to the location on the entity which was hit during the last call to trace or tracePoint&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;getTraceNormal&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the normal of the hit plane during the last call to trace or tracePoint&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;getTraceSurfType&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the type of the surface (i.e. metal, snow) which was hit during the last call to trace or tracePoint&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;handleMissionEvent&#039;&#039;&#039;(entity objEnt, float eventType, string argument); ====&lt;br /&gt;
&lt;br /&gt;
:Generic interface for passing on mission events from scripts to the SDK. Available since TDM 1.02&lt;br /&gt;
::&#039;&#039;objEnt&#039;&#039;: the entity that triggered this event (e.g. a readable)&lt;br /&gt;
::&#039;&#039;eventType&#039;&#039;: a numeric identifier (enumerated both in MissionData.h and tdm_defs.script) specifying the type of event&lt;br /&gt;
::&#039;&#039;argument&#039;&#039;: an optional string parameter, eventtype-specific.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;influenceActive&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Checks if an influence is active&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;killthread&#039;&#039;&#039;(string threadName); ====&lt;br /&gt;
&lt;br /&gt;
:Kills all threads with the specified name&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;log&#039;&#039;&#039;(float x); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the log of the given argument.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;logString&#039;&#039;&#039;(float logClass, float logType, string output); ====&lt;br /&gt;
&lt;br /&gt;
:This is the script counterpart to DM_LOG&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;max&#039;&#039;&#039;(float x, float y); ====&lt;br /&gt;
&lt;br /&gt;
:returns the larger of two provided float values.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;min&#039;&#039;&#039;(float x, float y); ====&lt;br /&gt;
&lt;br /&gt;
:returns the smaller of two provided float values.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;music&#039;&#039;&#039;(string shaderName); ====&lt;br /&gt;
&lt;br /&gt;
:Starts playing background music.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;offsetRelation&#039;&#039;&#039;(float team1, float team2, float val); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;onSignal&#039;&#039;&#039;(float signalNum, entity ent, string functionName); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a script callback function for when the given signal is raised on the given entity.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;pause&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Pauses the current thread.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;pointInLiquid&#039;&#039;&#039;(vector point, entity ignoreEntity); ====&lt;br /&gt;
&lt;br /&gt;
:Checks if a point is in a liquid, returns 1 if this is the case.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;pointIsInBounds&#039;&#039;&#039;(vector point, vector mins, vector maxs); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the point is within the bounds specified.&lt;br /&gt;
::&#039;&#039;point&#039;&#039;: test whether this point is in the bounds&lt;br /&gt;
::&#039;&#039;mins&#039;&#039;: minimal corner of the bounds&lt;br /&gt;
::&#039;&#039;maxs&#039;&#039;: maximal corner of the bounds&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;pow&#039;&#039;&#039;(float x, float y); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the power of x to y.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;print&#039;&#039;&#039;(string text); ====&lt;br /&gt;
&lt;br /&gt;
:Prints the given string to the console.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;println&#039;&#039;&#039;(string text); ====&lt;br /&gt;
&lt;br /&gt;
:Prints the given line to the console.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;projectDecal&#039;&#039;&#039;(vector traceOrigin, vector traceEnd, entity passEntity, string decal, float decalSize, float angle); ====&lt;br /&gt;
&lt;br /&gt;
:Performs a trace from the specified origin and end positions, then projects a decal in that direction.&lt;br /&gt;
::&#039;&#039;traceOrigin&#039;&#039;: Start of the trace.&lt;br /&gt;
::&#039;&#039;traceEnd&#039;&#039;: End of the trace.&lt;br /&gt;
::&#039;&#039;passEntity&#039;&#039;: This entity will be considered non-solid by the trace.&lt;br /&gt;
::&#039;&#039;decal&#039;&#039;: Decal to be projected.&lt;br /&gt;
::&#039;&#039;decalSize&#039;&#039;: Size of the decal quad.&lt;br /&gt;
::&#039;&#039;angle&#039;&#039;: Angle of the decal quad.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;radiusDamage&#039;&#039;&#039;(vector origin, entity inflictor, entity attacker, entity ignore, string damageDefName, float dmgPower); ====&lt;br /&gt;
&lt;br /&gt;
:damages entities within a radius defined by the damageDef.  inflictor is the entity  causing the damage and can be the same as the attacker (in the case   of projectiles, the projectile is the inflictor, while the attacker is the character  that fired the projectile).&lt;br /&gt;
::&#039;&#039;inflictor&#039;&#039;: the entity causing the damage&lt;br /&gt;
::&#039;&#039;ignore&#039;&#039;: an entity to not cause damage to&lt;br /&gt;
::&#039;&#039;dmgPower&#039;&#039;: scales the damage (for cases where damage is dependent on time)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;random&#039;&#039;&#039;(float range); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a random value X where 0 &amp;lt;= X &amp;lt; range.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;saveConDump&#039;&#039;&#039;(string cmd, string cmd); ====&lt;br /&gt;
&lt;br /&gt;
:Saves condump into FM directory; first argument is appended to dump filename, everything before last occurence of second argument is removed&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;say&#039;&#039;&#039;(string text); ====&lt;br /&gt;
&lt;br /&gt;
:Multiplayer - Print this line on the network&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;sessionCommand&#039;&#039;&#039;(string cmd); ====&lt;br /&gt;
&lt;br /&gt;
:Sends the sessioncommand to the game&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setCamera&#039;&#039;&#039;(entity cameraEnt); ====&lt;br /&gt;
&lt;br /&gt;
:Turns over view control to the given camera entity.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setcvar&#039;&#039;&#039;(string name, string value); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a cvar.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setPersistentArg&#039;&#039;&#039;(string key, string value); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a key/value pair that persists between maps&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setPortAISoundLoss&#039;&#039;&#039;(float handle, float value); ====&lt;br /&gt;
&lt;br /&gt;
:AI sound propagation scriptfunction on the sys object&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setPortPlayerSoundLoss&#039;&#039;&#039;(float handle, float value); ====&lt;br /&gt;
&lt;br /&gt;
:Player sound loss scriptfunction on the sys object&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setPortSoundLoss&#039;&#039;&#039;(float handle, float value); ====&lt;br /&gt;
&lt;br /&gt;
:Sound propagation scriptfunction on the sys object&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setRelation&#039;&#039;&#039;(float team1, float team2, float val); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSecretsFound&#039;&#039;&#039;(float secrets); ====&lt;br /&gt;
&lt;br /&gt;
:Set how many secrets the player has found. Use getMissionStatistic() for getting the current value.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSecretsTotal&#039;&#039;&#039;(float secrets); ====&lt;br /&gt;
&lt;br /&gt;
:Set how many secrets exist in the map in total. Use getMissionStatistic() for getting the current value.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setShaderParm&#039;&#039;&#039;(float parm, float value); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the value of the specified shader parm.&lt;br /&gt;
::&#039;&#039;parm&#039;&#039;: shader parm index&lt;br /&gt;
::&#039;&#039;value&#039;&#039;: new value&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSpawnArg&#039;&#039;&#039;(string key, string value); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a key/value pair to be used when a new entity is spawned.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;sin&#039;&#039;&#039;(float degrees); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the sine of the given angle in degrees.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;spawn&#039;&#039;&#039;(string classname); ====&lt;br /&gt;
&lt;br /&gt;
:Creates an entity of the specified classname and returns a reference to the entity.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;SpawnFloat&#039;&#039;&#039;(string key, float default); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the floating point value for the given spawn argument.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;SpawnString&#039;&#039;&#039;(string key, string default); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the string for the given spawn argument.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;SpawnVector&#039;&#039;&#039;(string key, vector default); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the vector for the given spawn argument.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;sqrt&#039;&#039;&#039;(float square); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the square root of the given number.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;strFind&#039;&#039;&#039;(string text, string find, float casesensitive, float start, float end); ====&lt;br /&gt;
&lt;br /&gt;
:Return the position of the given substring, counting from 0, or -1 if not found.&lt;br /&gt;
::&#039;&#039;casesensitive&#039;&#039;: 0&lt;br /&gt;
::&#039;&#039;start&#039;&#039;: 0&lt;br /&gt;
::&#039;&#039;end&#039;&#039;: -1&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;strLeft&#039;&#039;&#039;(string text, float num); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a string composed of the first num characters&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;strLength&#039;&#039;&#039;(string text); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of characters in the string&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;strMid&#039;&#039;&#039;(string text, float start, float num); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a string composed of the characters from start to start + num&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;strRemove&#039;&#039;&#039;(string text, string remove); ====&lt;br /&gt;
&lt;br /&gt;
:Replace all occurances of the given substring with &amp;quot;&amp;quot;. Example: StrRemove(&amp;quot;abba&amp;quot;,&amp;quot;bb&amp;quot;) results in &amp;quot;aa&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;strReplace&#039;&#039;&#039;(string text, string remove, string replace); ====&lt;br /&gt;
&lt;br /&gt;
:Replace all occurances of the given string with the replacement string. Example: StrRemove(&amp;quot;abba&amp;quot;,&amp;quot;bb&amp;quot;,&amp;quot;ccc&amp;quot;) results in &amp;quot;accca&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;strRight&#039;&#039;&#039;(string text, float num); ====&lt;br /&gt;
&lt;br /&gt;
:Returns a string composed of the last num characters&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;strSkip&#039;&#039;&#039;(string text, float num); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the string following the first num characters&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;strToFloat&#039;&#039;&#039;(string text); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the numeric value of the given string.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;strToInt&#039;&#039;&#039;(string text); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the integer value of the given string.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;terminate&#039;&#039;&#039;(float threadNumber); ====&lt;br /&gt;
&lt;br /&gt;
:Terminates a thread.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;threadname&#039;&#039;&#039;(string name); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the name of the current thread.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;trace&#039;&#039;&#039;(vector start, vector end, vector mins, vector maxs, float contents_mask, entity passEntity); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the fraction of movement completed before the box from &#039;mins&#039; to &#039;maxs&#039; hits solid geometry when moving from &#039;start&#039; to &#039;end&#039;. The &#039;passEntity&#039; is considered non-solid during the move.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;tracePoint&#039;&#039;&#039;(vector start, vector end, float contents_mask, entity passEntity); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the fraction of movement completed before the trace hits solid geometry when moving from &#039;start&#039; to &#039;end&#039;. The &#039;passEntity&#039; is considered non-solid during the move.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent string &#039;&#039;&#039;translate&#039;&#039;&#039;(string input); ====&lt;br /&gt;
&lt;br /&gt;
:Translates a string (like #str_12345) into the current language&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;trigger&#039;&#039;&#039;(entity entityToTrigger); ====&lt;br /&gt;
&lt;br /&gt;
:Triggers the given entity.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;vecLength&#039;&#039;&#039;(vector vec); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the length of the given vector.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;vecNormalize&#039;&#039;&#039;(vector vec); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the normalized version of the given vector.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;VecRotate&#039;&#039;&#039;(vector vector, vector angles); ====&lt;br /&gt;
&lt;br /&gt;
:Rotates a vector by the specified angles.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent vector &#039;&#039;&#039;VecToAngles&#039;&#039;&#039;(vector vec); ====&lt;br /&gt;
&lt;br /&gt;
:Returns Euler angles for the given direction.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;wait&#039;&#039;&#039;(float time); ====&lt;br /&gt;
&lt;br /&gt;
:Suspends execution of the current thread for the given number of seconds.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;waitFor&#039;&#039;&#039;(entity mover); ====&lt;br /&gt;
&lt;br /&gt;
:Waits for the given entity to complete its move.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;waitForRender&#039;&#039;&#039;(entity e); ====&lt;br /&gt;
&lt;br /&gt;
:Suspends the current thread until &#039;e&#039; might have been rendered. It&#039;s event based, so it doesn&#039;t waste CPU repeatedly checking inPVS(). e.inPVS() will very likely be true when the thread resumes. If e.inPVS() is true, calling waitForRender() will probably just wait a frame, unless D3 can figure out that the entity doesn&#039;t need to be rendered. Optimizations regarding shadowcasting lights may not apply to this function - it is based purely off whether or not the entity&#039;s bounding box is visible.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;waitForThread&#039;&#039;&#039;(float threadNumber); ====&lt;br /&gt;
&lt;br /&gt;
:Waits for the given thread to terminate.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;waitFrame&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Suspends execution of current thread for one game frame.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;warning&#039;&#039;&#039;(string text); ====&lt;br /&gt;
&lt;br /&gt;
:Issues a warning.&lt;br /&gt;
&lt;br /&gt;
=== idSecurityCamera ===&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;canSee&#039;&#039;&#039;(entity ent); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getEnemy&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getNextEnemy&#039;&#039;&#039;(entity lastMatch); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the next enemy that the security camera can see.&lt;br /&gt;
::&#039;&#039;lastMatch&#039;&#039;: search will start after this entity.Use $null_entity or pass an uninitialized entity variable to start a new search.The first result in a new search will be the player, if the camera can see him.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getSecurityCameraState&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the security camera&#039;s state. 1 = unalerted, 2 = suspicious, 3 = fully alerted, 4 = inactive, 5 = destroyed.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getSpotLight&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the spotlight used by the camera. Returns null_entity if none is used.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Off&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Switches the emitter off.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;On&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Switches the emitter on.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setSightThreshold&#039;&#039;&#039;(float sightThreshold); ====&lt;br /&gt;
&lt;br /&gt;
:Set the sight threshold of the security camera: how lit up the player&#039;s lightgem needs to be in order to be seen. 0.0 to 1.0&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;state_light&#039;&#039;&#039;(float set); ====&lt;br /&gt;
&lt;br /&gt;
:Switches the spotlight on or off. Respects the security camera&#039;s power state.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;state_see_AI&#039;&#039;&#039;(float set); ====&lt;br /&gt;
&lt;br /&gt;
:Set whether the camera can see AIs.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;state_see_animals&#039;&#039;&#039;(float set); ====&lt;br /&gt;
&lt;br /&gt;
:Set whether the camera can see animals. Checked after seeAI or seeBodies.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;state_see_bodies&#039;&#039;&#039;(float set); ====&lt;br /&gt;
&lt;br /&gt;
:Set whether the camera can see bodies.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;state_see_player&#039;&#039;&#039;(float set); ====&lt;br /&gt;
&lt;br /&gt;
:Set whether the camera can see the player.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;state_sweep&#039;&#039;&#039;(float set); ====&lt;br /&gt;
&lt;br /&gt;
:Enables or disables the camera&#039;s sweeping.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;toggle_light&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Toggles the spotlight on/off.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;toggle_see_AI&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Toggles whether the camera can see AIs.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;toggle_see_animals&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Toggles whether the camera can see bodies. Checked after seeAI or seeBodies.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;toggle_see_bodies&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Toggles whether the camera can see bodies.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;toggle_see_player&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Toggles whether the camera can see the player.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;toggle_sweep&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Toggles the camera sweep.&lt;br /&gt;
&lt;br /&gt;
=== Seed ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;cullAll&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Cull (remove from world) all entities.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Disables the mover/trigger&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Enables the mover/trigger&lt;br /&gt;
&lt;br /&gt;
=== idSound ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;Off&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Switches the emitter off.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;On&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Switches the emitter on.&lt;br /&gt;
&lt;br /&gt;
=== idTarget_Remove ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_Show ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_Damage ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_SessionCommand ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_EndLevel ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_WaitForButton ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_SetGlobalShaderTime ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_SetShaderParm ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_SetShaderTime ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_FadeEntity ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_LightFadeIn ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_LightFadeOut ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_Give ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_SetModel ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_SetInfluence ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_SetKeyVal ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_SetFov ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_CallObjectFunction ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_PostScriptEvent ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_EnableLevelWeapons ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_RemoveWeapons ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTarget_FadeSoundClass ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== CTarget_AddObjectives ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== CTarget_SetObjectiveState ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== CTarget_SetObjectiveVisibility ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== CTarget_SetObjectiveComponentState ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== CTarget_StartConversation ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== CTarget_SetFrobable ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== CTarget_CallScriptFunction ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== CTarget_ChangeLockState ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== CTarget_ChangeTarget ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== CTarget_InterMissionTrigger ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== CTarget_SetTeam ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== CTarget_ItemRemove ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTrigger ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Disables the mover/trigger&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;enable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Enables the mover/trigger&lt;br /&gt;
&lt;br /&gt;
=== idTrigger_Multi ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTrigger_EntityName ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTrigger_Timer ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTrigger_Count ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTrigger_Hurt ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTrigger_Fade ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTrigger_Touch ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;activate&#039;&#039;&#039;(entity activator); ====&lt;br /&gt;
&lt;br /&gt;
:Activates this entity as if it was activated by a trigger.&lt;br /&gt;
::&#039;&#039;activator&#039;&#039;: the entity that caused the action (usually the player)&lt;br /&gt;
&lt;br /&gt;
=== idTurret ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;attack&#039;&#039;&#039;(entity enemy, float ignoreCollisions); ====&lt;br /&gt;
&lt;br /&gt;
:Direct the turret to manually attack the specified entity. Use disableManualAttack() to disable.&lt;br /&gt;
::&#039;&#039;enemy&#039;&#039;: enemy to attack&lt;br /&gt;
::&#039;&#039;ignoreCollisions&#039;&#039;: whether to ignore obstacles in the way to the enemy when planning to attack&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;attackPosition&#039;&#039;&#039;(vector targetPos, float ignoreCollisions); ====&lt;br /&gt;
&lt;br /&gt;
:Direct the turret to manually attack a position. Use disableManualAttack() to disable.&lt;br /&gt;
::&#039;&#039;targetPos&#039;&#039;: position to attack&lt;br /&gt;
::&#039;&#039;ignoreCollisions&#039;&#039;: whether to ignore obstacles in the way to the target position when planning to attack. Recommended true for this event.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;disableManualAttack&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Stop attacking the manually specified enemy or position and return to automatic target acquisition mode.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getTurretState&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the turret&#039;s state.  0 = passive: no active security cameras connected. 1 = unalerted, 2 = suspicious, 3 = fully alerted, 4 = power off, 5 = destroyed.&lt;br /&gt;
&lt;br /&gt;
=== idWeapon ===&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;addToClip&#039;&#039;&#039;(float amount); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;allowDrop&#039;&#039;&#039;(float allow); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;ammoAvailable&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Number of shots left in inventory&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;ammoInClip&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;animDone&#039;&#039;&#039;(float channel, float blendOutFrames); ====&lt;br /&gt;
&lt;br /&gt;
:Returns true if the animation playing on the given channel is completed considering a number of blend frames.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;animIsPaused&#039;&#039;&#039;(float channel); ====&lt;br /&gt;
&lt;br /&gt;
:Return whether the given anim channel is paused&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;clipSize&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;createProjectile&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;ejectBrass&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;flashlight&#039;&#039;&#039;(float enable); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getBlendFrames&#039;&#039;&#039;(float channel); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the number of frames to blend between animations on the given channel.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;getLightParm&#039;&#039;&#039;(float parmNum); ====&lt;br /&gt;
&lt;br /&gt;
:Gets a shader parameter.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getOwner&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the owning entity&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent entity &#039;&#039;&#039;getWorldModel&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Returns the entity that controls the world model&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;isInvisible&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;launchProjectiles&#039;&#039;&#039;(float num_projectiles, float spread, float fuseOffset, float launchPower, float dmgPower); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;melee&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;netEndReload&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;netReload&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;nextWeapon&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:No description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;pauseAnim&#039;&#039;&#039;(float channel, float bPause); ====&lt;br /&gt;
&lt;br /&gt;
:Pause all animations playing on the given channel. NOTE: Can also be used used by idWeapons&lt;br /&gt;
::&#039;&#039;bPause&#039;&#039;: true = pause, false = unpause&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;playAnim&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Do not use, this is part of TDM&#039;s internal mechanics. Use playCustomAnim() on AI.in scripts instead of this. Plays the given animation on the given channel. Returns false if anim doesn&#039;t exist.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;playCycle&#039;&#039;&#039;(float channel, string animName); ====&lt;br /&gt;
&lt;br /&gt;
:Continuously repeats the given animation on the given channel.  Returns false if anim doesn&#039;t exist.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setBlendFrames&#039;&#039;&#039;(float channel, float blendFrame); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the number of frames to blend between animations on the given channel.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setLightParm&#039;&#039;&#039;(float parmNum, float value); ====&lt;br /&gt;
&lt;br /&gt;
:Sets a shader parameter.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;setLightParms&#039;&#039;&#039;(float parm0, float parm1, float parm2, float parm3); ====&lt;br /&gt;
&lt;br /&gt;
:Sets the red/green/blue/alpha shader parms on the light and the model.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;showAttachment&#039;&#039;&#039;(string attName, float show); ====&lt;br /&gt;
&lt;br /&gt;
:Show or hide an attachment.&lt;br /&gt;
::&#039;&#039;show&#039;&#039;: 1 shows attachment, 0 hides it.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;showAttachmentInd&#039;&#039;&#039;(float index, float show); ====&lt;br /&gt;
&lt;br /&gt;
:Show or hide an attachment by array index.&lt;br /&gt;
::&#039;&#039;index&#039;&#039;: starts at 0&lt;br /&gt;
::&#039;&#039;show&#039;&#039;: 1 shows attachment, 0 hides it.&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent float &#039;&#039;&#039;totalAmmoCount&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:Amount of ammo in inventory. since each shot may use more than 1 ammo, this is different than ammoAvailable()&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;useAmmo&#039;&#039;&#039;(float amount); ====&lt;br /&gt;
&lt;br /&gt;
:Eats the specified amount of ammo&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;weaponHolstered&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;weaponLowering&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;weaponOutOfAmmo&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;weaponReady&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;weaponReloading&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;weaponRising&#039;&#039;&#039;(); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
==== scriptEvent void &#039;&#039;&#039;weaponState&#039;&#039;&#039;(string stateFunction, float blendFrames); ====&lt;br /&gt;
&lt;br /&gt;
:no description&lt;br /&gt;
&lt;br /&gt;
[[Category:Scripting]]&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=Mission_Database&amp;diff=33526</id>
		<title>Mission Database</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=Mission_Database&amp;diff=33526"/>
		<updated>2024-07-17T18:41:41Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: Some updates for unpacked missions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;All released missions are stored in FM database, which defines what is available in mission downloader in-game.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Requirements =&lt;br /&gt;
&lt;br /&gt;
In order for a mission to be included in the database, it must satisfy the following conditions:&lt;br /&gt;
# It has gone through [[Your Mission - From Beta Testing to Release and Beyond|beta-testing]] by several forum members who did not take part in its creation.&lt;br /&gt;
#* As a rare exceptional case, a mission can be rejected from the database if the majority of beta-testers come to conclusion that it is unplayable or its quality is way too low.&lt;br /&gt;
# Does not contain any questionable material, potential intellectual property infridgements. Including:&lt;br /&gt;
#* using names from the original Thief games&lt;br /&gt;
#* using assets from other games&lt;br /&gt;
#* having content which is so bad that it is forbidden even on our forums ([https://forums.thedarkmod.com/index.php?/topic/16117-forum-rules/ link to forum rules])&lt;br /&gt;
&lt;br /&gt;
A very few missions are installed along with the game, like Saint Lucia or Training Mission.&lt;br /&gt;
These official missions are considered to be part of the game, and are &#039;&#039;&#039;not&#039;&#039;&#039; included in the database.&lt;br /&gt;
&lt;br /&gt;
= SVN =&lt;br /&gt;
&lt;br /&gt;
Starting from 2021, the FM database is stored in SVN repository ([https://bugs.thedarkmod.com/view.php?id=5551 #5551]).&lt;br /&gt;
Only TDM team members have access to this SVN.&lt;br /&gt;
&lt;br /&gt;
Here is the SVN address:&lt;br /&gt;
:: https://svn.thedarkmod.com/project/missions_unpacked/trunk/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;But please don&#039;t rush to checkout the whole repo yet!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Checkout everything ===&lt;br /&gt;
&lt;br /&gt;
Yes, you can simply copy the link above to SVN Checkout and get single working copy with all the FMs. But keep in mind that you will have to download ~35 GB of data and the working copy will take ~70 GB of space. In most cases you don&#039;t need everything in order to work with the database.&lt;br /&gt;
&lt;br /&gt;
The typical reasons to checkout the whole repo are:&lt;br /&gt;
* You want to run automated search or tests over all released FMs.&lt;br /&gt;
* You are regular committer of the FM database, added a lot of new missions and updates, so the investment is worth it.&lt;br /&gt;
&lt;br /&gt;
[[File:TortoiseSVN RepoBrowser.png|thumb|TortoiseSVN Repo-browser]]&lt;br /&gt;
[[File:FmDatabase_RepoBrowser.png|thumb|Accountant 2 FM in SVN]]&lt;br /&gt;
&lt;br /&gt;
=== Checkout as needed ===&lt;br /&gt;
&lt;br /&gt;
Instead of checking out the whole repo, you can checkout only the few FMs you are going to modify.&lt;br /&gt;
This is the recommended approach.&lt;br /&gt;
&lt;br /&gt;
With this approach, you need the Repo-browser feature of TortoiseSVN.&lt;br /&gt;
It allows to look through all the directories and files on remote SVN without checking it out first.&lt;br /&gt;
&lt;br /&gt;
The directory structure of SVN is show on the picture.&lt;br /&gt;
Most importantly, all information about FM with internal name &amp;quot;qwerty&amp;quot; is stored in &amp;lt;tt&amp;gt;fms/qwerty&amp;lt;/tt&amp;gt; subdirectory of the repo.&lt;br /&gt;
You can checkout only this directory in order to work with FM, just put this checkout address:&lt;br /&gt;
&lt;br /&gt;
:: https://svn.thedarkmod.com/project/missions_unpacked/trunk/fms/qwerty&lt;br /&gt;
&lt;br /&gt;
Or find the FM directory in Repo-browser, right-click and select Checkout.&lt;br /&gt;
&lt;br /&gt;
Detailed instructions in the rest of the article assume this approach.&lt;br /&gt;
&lt;br /&gt;
= Add New Mission =&lt;br /&gt;
&lt;br /&gt;
[[File:FmDatabase_AddDirectory.png|thumb|x100px|Add FM directory in Repo-browser]]&lt;br /&gt;
[[File:FmDatabase_FmCheckout.png|thumb|x80px|Checkout FM]]&lt;br /&gt;
[[File:FmDatabase_Commit2.png|thumb|x70px|Commit changes in FM directory]]&lt;br /&gt;
[[File:FmDatabase_CommitAddFiles.png|x120px|thumb|Add new files in Commit dialog]]&lt;br /&gt;
[[File:FmDatabase_PrecommitHookFailed.png|x120px|thumb|Precommit hook failed due to wrong value of &amp;quot;type&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
Before adding new FM, negotiate internal name with FM author.&lt;br /&gt;
It must be different from names of all existing FMs, consist of only lowercase letters and digits, be rather short (aim for 10-20 letters).&lt;br /&gt;
Among many words in the mission title, prefer rare words and proper nouns over common words when composing the internal name.&lt;br /&gt;
&lt;br /&gt;
Open SVN in Repo-browser, find &amp;lt;/tt&amp;gt;fms&amp;lt;/tt&amp;gt; directory which contains all the FMs.&lt;br /&gt;
Right-click on it and choose Add folder in the context menu.&lt;br /&gt;
Then enter the internal name of FM as the name of the new directory and proceed with commit.&lt;br /&gt;
Now that the directory has been created, you can checkout it: find the directory in Repo-browser, right-click it and Checkout.&lt;br /&gt;
&lt;br /&gt;
The second step is to upload pk4 contents.&lt;br /&gt;
Create subdirectory named &amp;lt;tt&amp;gt;mission-name.pk4_dir&amp;lt;/tt&amp;gt; under the mission checkout directory (replace mission-name with internal name).&lt;br /&gt;
Unpack all the pk4 files of FM pack into this subdirectory of the working copy directory (i.e. checkout directory).&lt;br /&gt;
Open the directory in Windows Explorer, right-click the parent folder and select SVN commit.&lt;br /&gt;
Select all files with Shift, right-click and select Add.&lt;br /&gt;
Also set checkboxes for these files.&lt;br /&gt;
Write commit message in the text area above: it should start with internal name of FM in brackets.&lt;br /&gt;
When everything is done, hit OK to do the actual commit.&lt;br /&gt;
&lt;br /&gt;
While the pk4 contents are already in the repository, they are not yet visible in the database.&lt;br /&gt;
A mission is only added when its directory contains &amp;lt;tt&amp;gt;fminfo.xml&amp;lt;/tt&amp;gt; file, so now you need to add it.&lt;br /&gt;
You can take this file from another FM (find it in Repo-browser, right-click, Open with, select text editor), and adjust it for the FM being added.&lt;br /&gt;
Here is explanation for some fields:&lt;br /&gt;
* &#039;&#039;&#039;internalName&#039;&#039;&#039; defines name of the directory and pk4 file.&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039; is the name seen by players in-game.&lt;br /&gt;
* &#039;&#039;&#039;author&#039;&#039;&#039; is one or several people who made the mission.&lt;br /&gt;
* &#039;&#039;&#039;releaseDate&#039;&#039;&#039; shows when the very first version of the mission was added.&lt;br /&gt;
* &#039;&#039;&#039;type&#039;&#039;&#039; is &amp;lt;tt&amp;gt;multi&amp;lt;/tt&amp;gt; if mission contains several playable .map files (i.e. is campaign), and &amp;lt;tt&amp;gt;single&amp;lt;/tt&amp;gt; otherwise.&lt;br /&gt;
* &#039;&#039;&#039;size&#039;&#039;&#039; is size of the main pk4 file in megabytes displayed to users.&lt;br /&gt;
* &#039;&#039;&#039;version&#039;&#039;&#039; is natural number used by in-game downloader to decide whether update is available or not. Starts with 1.&lt;br /&gt;
* &#039;&#039;&#039;description&#039;&#039;&#039; contains text displayed in in-game downloader when player inspects mission details.&lt;br /&gt;
* &#039;&#039;&#039;mainPack&#039;&#039;&#039; points to the main pk4 file of the mission. Note that the name of file is fully determined by internal name.&lt;br /&gt;
* &#039;&#039;&#039;localisationPack&#039;&#039;&#039; points to _l10n.pk4 file if it exists.&lt;br /&gt;
&lt;br /&gt;
Note that XML cannot directly contain some characters, thus they must be escaped:&lt;br /&gt;
* Ampersand (&amp;lt;tt&amp;gt;&amp;amp;amp;amp;&amp;lt;/tt&amp;gt;) quotes (&amp;lt;tt&amp;gt;&amp;amp;amp;quot;&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;&amp;amp;amp;apos;&amp;lt;/tt&amp;gt;) and angle brackets (&amp;lt;tt&amp;gt;&amp;amp;amp;lt;&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;&amp;amp;amp;gt;&amp;lt;/tt&amp;gt;): [https://stackoverflow.com/questions/1091945/what-characters-do-i-need-to-escape-in-xml-documents reference]&lt;br /&gt;
* Line break symbol can be inserted as &amp;lt;tt&amp;gt;&amp;amp;amp;#10;&amp;lt;/tt&amp;gt; according to [https://stackoverflow.com/questions/2004386/how-to-save-newlines-in-xml-attribute reference]&lt;br /&gt;
&amp;lt;br&amp;gt;Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;fminfo&amp;gt;&lt;br /&gt;
  &amp;lt;mission title=&amp;quot;Closemouthed Shadows&amp;quot; releaseDate=&amp;quot;2012-01-15&amp;quot; size=&amp;quot;2.3&amp;quot; version=&amp;quot;2&amp;quot; internalName=&amp;quot;closemouthed_shadows&amp;quot; type=&amp;quot;single&amp;quot; author=&amp;quot;LordSavage, Bikerdude&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;description&amp;gt;Find Dougal&#039;s key, enter his place and kill him. Find the golden plate and key he stole from his neighbor. Get some loot including Lord Julian&#039;s Scepter.&amp;amp;amp;#13;&amp;amp;amp;#10;&amp;amp;amp;#13;&amp;amp;amp;#10;This is the original mission from 2008 (modified to run with TDM Version 1.07). Big thanks to b1k3rdude who has helped me to bring Closemouthed Shadows to TDM 1.07 (and improved some text and visuals).&amp;lt;/description&amp;gt;&lt;br /&gt;
    &amp;lt;mainPack filename=&amp;quot;closemouthed_shadows.pk4&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;localisationPack filename=&amp;quot;closemouthed_shadows_l10n.pk4&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/mission&amp;gt;&lt;br /&gt;
&amp;lt;/fminfo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When you have created &amp;lt;tt&amp;gt;fminfo.xml&amp;lt;/tt&amp;gt; file, double-check that all properties are correct.&lt;br /&gt;
Then use SVN to add and commit the file, just like you did with pk4 contents.&lt;br /&gt;
&lt;br /&gt;
If you did something wrong (most likely), then you will see an error saying that &amp;quot;Commit blocked by pre-commit hook&amp;quot;.&lt;br /&gt;
A long stacktrace from Python script is included, and the meaningful message should be at the end of it.&lt;br /&gt;
Typically, it is either XML validation error saying that something in fminfo.xml is wrong, or a message from some custom failed check.&lt;br /&gt;
You need to fix the errors and try to commit again --- until you manage to commit successfully.&lt;br /&gt;
&lt;br /&gt;
As the last step, create subdirectory named &amp;lt;tt&amp;gt;screenshots&amp;lt;/tt&amp;gt; in the working copy directory.&lt;br /&gt;
Put screenshots in .jpg or .png format into the directory: they will be displayed in in-game mission downloader.&lt;br /&gt;
Then add and commit all the screenshot files into the repository.&lt;br /&gt;
&lt;br /&gt;
= Update Mission =&lt;br /&gt;
&lt;br /&gt;
This section covers the case if mission has already been released, but new version should be uploaded.&lt;br /&gt;
&lt;br /&gt;
First of all, make sure you have up-to-date working copy of the FM directory.&lt;br /&gt;
&amp;lt;br&amp;gt;If you already have working copy, do right-click and SVN Update in it in Windows Explorer.&lt;br /&gt;
&amp;lt;br&amp;gt;If you don&#039;t have it yet, then open Repo-browser, find the directory named by FM&#039;s internal name, right-click and select Checkout.&lt;br /&gt;
&amp;lt;br&amp;gt;If you don&#039;t know the internal name, you can learn it like this: install the FM in the game, &lt;br /&gt;
&amp;lt;br&amp;gt;then look what is written in the &amp;lt;tt&amp;gt;currentfm.txt&amp;lt;/tt&amp;gt; file. &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Suppose internal name is &amp;quot;qwerty&amp;quot;.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;If you know the author didn&#039;t remove any files from the new version, just extract the contents of the new PK4 to the query.pk4_dir and overwrite the contents.&lt;br /&gt;
&amp;lt;br&amp;gt;Then browse the sub-folders for any un-versioned new items ( usually will have a question mark indicator ) and right-click them and select SVN Add&lt;br /&gt;
&amp;lt;br&amp;gt;Then update the version number in the FM XML file as well as the file size&lt;br /&gt;
&amp;lt;br&amp;gt;Make sure no files or folders have spaces or special characters in their names&lt;br /&gt;
&amp;lt;br&amp;gt;Navigate to the parent directory of the querty folder and right-click querty then choose commit&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;If the mission author removed files or you are unsure, you will need to compare the existing copy to the new version prior to merging&lt;br /&gt;
&amp;lt;br&amp;gt;For Windows users the program WinMerge is a good tool, Linux users can use &amp;quot;diff -r folderA, folderB&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;Identify additions and removals then overwrite the contents of the query.pk4_dir then perform SVN Add and SVN Delete actions to all relevant items&lt;br /&gt;
&amp;lt;br&amp;gt;Then update the FM XML and commit as described above&lt;br /&gt;
&lt;br /&gt;
= RabbitVCS Steps =&lt;br /&gt;
&lt;br /&gt;
Since TortoiseSVN does not have a Linux version, a good alternative is RabbitVCS.&lt;br /&gt;
&amp;lt;br&amp;gt;You will need to install the shell integration script that is compatible with your GUI File Manager&lt;br /&gt;
&amp;lt;br&amp;gt;If none exist you will need to install a secondary GUI File manager that is compatible with RabbitVCS integration&lt;br /&gt;
&lt;br /&gt;
Here is a quick summary of the Mission management process on RabbitVCS&lt;br /&gt;
&lt;br /&gt;
1) Create a parent folder such as mission-name_new&lt;br /&gt;
&lt;br /&gt;
2) Inside the folder create a sub-folder named after the pk4 name ( eg if the mission name is elixir.pk4 the folder is &amp;quot;elixir&amp;quot; )&lt;br /&gt;
&lt;br /&gt;
3) Insider the sub-folder will be 3 things:&lt;br /&gt;
&lt;br /&gt;
An fminfo.xml with details about the mission ( see attached example)&lt;br /&gt;
&lt;br /&gt;
A folder named &amp;quot;screenshots&amp;quot;&lt;br /&gt;
&lt;br /&gt;
A folder named mission-name.pk4_dir which contains the unpacked data from the mission pack ( eg elixir.pk4_dir )&lt;br /&gt;
&lt;br /&gt;
4) Right click on the parent folder and perform an SVN &amp;quot;Import&amp;quot; and choose https://svn.thedarkmod.com/project/missions_unpacked/trunk/fms/   as the Repository where you are importing&lt;br /&gt;
&lt;br /&gt;
5) Visit the mission URL after the import has completed https://www.thedarkmod.com/missiondetails/?internalName=&amp;lt;mission-name&amp;gt;  ( replace mission-name with whatever the pk4 name )&lt;br /&gt;
&lt;br /&gt;
To update the mission it&#039;s best to delete the folder then create a new parent folder mission-name_update then perform an SVN checkout of https://svn.thedarkmod.com/project/missions_unpacked/trunk/fms/&amp;lt;mission-name&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Use &amp;quot;diff -r /path/to/checkout_dir/mission-name /path/to/extracted/new_pk4_folder/mission-name&amp;quot; in the console to identify changes&lt;br /&gt;
&lt;br /&gt;
= References =&lt;br /&gt;
* Thread on developer subforum: https://forums.thedarkmod.com/index.php?/topic/20624-store-missions-archive-in-svn/&lt;br /&gt;
* Mission Database Management thread: https://forums.thedarkmod.com/index.php?/topic/11393-mission-archive-administration&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=What%27s_new_in_TDM_2.12&amp;diff=31087</id>
		<title>What&#039;s new in TDM 2.12</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=What%27s_new_in_TDM_2.12&amp;diff=31087"/>
		<updated>2024-02-25T12:55:57Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: Removed words in parentheses which were originally links.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- keywords whats new --&amp;gt;&lt;br /&gt;
{{notreleasedyet|2.12}}&lt;br /&gt;
See the [http://bugs.thedarkmod.com/roadmap_page.php roadmap] on our bugtracker.&lt;br /&gt;
&amp;lt;!-- See the [https://bugs.thedarkmod.com/changelog_page.php?version_id=96 changelog] on our bugtracker. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- {{released|2.12|XXXX-XX-XX}} --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;font size=&amp;quot;5&amp;quot;&amp;gt;The Dark Mod 2.12 Performance Edition!&amp;lt;/font&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;3&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
A major focus for The Dark Mod 2.12 was to better handle light and shadow culling.&lt;br /&gt;
&amp;lt;br&amp;gt;Mappers often have to carefully arrange visportals and adjust light radius values to ensure&lt;br /&gt;
that invisible lights are not stealing performance from the scene.&lt;br /&gt;
&amp;lt;br&amp;gt;Many times such optimization work looks nonsensical or requires mappers to rebuild their scene until&lt;br /&gt;
they can make a sensible portal design.&lt;br /&gt;
&amp;lt;br&amp;gt;The new culling optimizations make TDM far more resilient to maps with poor portal design and bad lighting practices.&lt;br /&gt;
&amp;lt;br&amp;gt;With this new optimization in place, new mappers shouldn&#039;t need to reach out to veteran mappers for assistance with performance so often.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;A special thanks must go out to community member &#039;&#039;&#039;Geeps&#039;&#039;&#039;! &lt;br /&gt;
&amp;lt;br&amp;gt;Over the course of 2.12 development, this user has created Subtitles for nearly all AI barks &lt;br /&gt;
&amp;lt;br&amp;gt;along with developing testing tools and procedures for this gargantuan task!&lt;br /&gt;
&amp;lt;br&amp;gt;Geeps also provided substantial feedback for our GUI and Subtitle design process and edited font data to improve text quality overall&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Joebarnin identified a 2.11 bug that prevented arrows from colliding with AI and objects at certain angles and sent us a patch to fix it.&lt;br /&gt;
&amp;lt;br&amp;gt;Daft Mugi has taken on the task of improving movement, mantling, and frob operations to make them more seamless and closer to Thief 1/2 behavior&lt;br /&gt;
&amp;lt;br&amp;gt;Dragofer has added native support for Turrets to TDM 2.12, in addition to many asset and code change submissions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;br&amp;gt;&amp;lt;br&amp;gt; &amp;lt;font size=&amp;quot;4&amp;quot;&amp;gt;&#039;&#039;&#039;Important CVARS&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font size=&amp;quot;4&amp;quot;&amp;gt;PLAYER&amp;lt;/font&amp;gt; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
tdm_holdfrob_* --- set of variables that affect the reworked frob controls.&lt;br /&gt;
&lt;br /&gt;
tdm_autosearch_bodies --- automatically take items attached to unconscious bodies on frob.&lt;br /&gt;
&lt;br /&gt;
pm_headbob_mod, pm_lean_* --- allows to reduce some player movements.&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font size=&amp;quot;4&amp;quot;&amp;gt;HELPER&amp;lt;/font&amp;gt; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tdm_show_viewpos, screenshot_viewpos --- embedding viewpos into screenshot for better bug reports.&lt;br /&gt;
&lt;br /&gt;
tdm_open_doors, tdm_close_doors --- cheats to make mission testing faster. &lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;font size=&amp;quot;4&amp;quot;&amp;gt;TROUBLESHOOTING&amp;lt;/font&amp;gt; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
r_useLightPortalFlow, r_useLightPortalFlowCulling --- improved light-entity interaction culling. Most major effect on shadows. This cvar is responsible for causing light leaks with stencil shadows, please report all of them! (thread)&lt;br /&gt;
&lt;br /&gt;
r_useNewRenderPasses --- selects from several renderer backend code paths. This is similar to the old r_useNewBackend cvar which has been deleted.&lt;br /&gt;
&lt;br /&gt;
r_shadowMapSinglePass --- faster code path for filling shadow maps.&lt;br /&gt;
&lt;br /&gt;
r_useEntityScissors, r_animationBounds --- improved bounds estimates for rendered entities.&lt;br /&gt;
&lt;br /&gt;
r_postprocess_dither --- new dithering in tonemap postprocessing for less color banding.&lt;br /&gt;
&lt;br /&gt;
r_shadowMapAlphaTested --- experimental mode for alpha-tested surfaces with shadow maps, where transparent areas of texture don&#039;t cast shadows.&lt;br /&gt;
&lt;br /&gt;
s_realTimeDecoding --- selects code path for decoding sound samples.&lt;br /&gt;
&lt;br /&gt;
tdm_subtitles_* --- many cvars for subtitle improvements (location cue, duration extension, debug text).&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Graphics&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
* Optimized generation of light-entity interactions in rendering frontend. Also greatly optimized shadow processing, especially for moving lights. Unfortunately, many existing missions are not compatible with these changes, so you might see light leaking through walls (mainly with stencil shadows). Please report all such cases, we&#039;ll apply workaround on case by case basis.&lt;br /&gt;
&lt;br /&gt;
* The &amp;quot;old&amp;quot; and &amp;quot;new&amp;quot; rendering backends are finally merged into one. It is as nice to program as the new backend, and as old-fashioned and reliable as the old backend. Single-pass shadow maps enabled by default and now respect noselfshadow.&lt;br /&gt;
&lt;br /&gt;
* Materials with polygonoffset now interact with lights. So static decals can have bumpmap and specular lighting. Note however: dynamic decals still don&#039;t interact with lights.&lt;br /&gt;
&lt;br /&gt;
* Revised parallelSky lights and marked shadowing parallel lights as deprecated.&lt;br /&gt;
&lt;br /&gt;
* PNG image format now behaves equally to other supported formats. In particular, it is not required to explicitly specify its extension, and it can be referenced directly in GUI code.&lt;br /&gt;
&lt;br /&gt;
* Added functions min/max to material expressions, which can be useful for clamping.&lt;br /&gt;
&lt;br /&gt;
* Fixed minor culling bugs on animated entities and enabled entity scissors by default.&lt;br /&gt;
&lt;br /&gt;
* Reduced color banding for fog with some dithering at tonemapping stage.&lt;br /&gt;
&lt;br /&gt;
* Fixed and revised underwater &amp;quot;double vision&amp;quot; effect.&lt;br /&gt;
&lt;br /&gt;
* Finally our C++ code can compress and decompress all texture formats we use, meaning that we no longer depend on occasionally buggy/slow vendor implementations. &lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;AI&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
* Added automatic turrets, to be combined with security cameras (Thread).&lt;br /&gt;
* Fixed some issues with moor AI (6345).&lt;br /&gt;
* Added canCloseDoors spawnarg on AI, which allows to block closing only (6460).&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Mapping&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
* Now light entities support noPortalFog spawnarg (6282).&lt;br /&gt;
* Extended dmap diagnostics to info_portalSettings, improved editor descriptions (6224).&lt;br /&gt;
* r_showportals 2 is easier to understand now&lt;br /&gt;
* Added r_skipEntities cvar, similar to &amp;quot;filter entities&amp;quot; in DR.&lt;br /&gt;
* Added editor spawnargs for volumetric light properties (6322).&lt;br /&gt;
* Added &amp;quot;forceShadowBehindOpaque&amp;quot; hack to workaround shadow leaks in old missions (5172).&lt;br /&gt;
* Can set spawnarg &amp;quot;douse 0&amp;quot; on damageDef to not extinguish lights from splash damage.&lt;br /&gt;
* Added setFrobMaster script event.&lt;br /&gt;
* Added script-based stim type, which triggers only when stimEmit script event is called.&lt;br /&gt;
* Added on/off script events to func_emitter entity.&lt;br /&gt;
* Added setSmoke script event to change particle decl for a func_smoke.&lt;br /&gt;
* Added hasInvItem script event to check if player has some item.&lt;br /&gt;
* Added launchGuided script event to start guided projectiles.&lt;br /&gt;
* Added getInterceptTime script event for shooting projectile and running target.&lt;br /&gt;
* Added &amp;quot;bounce_sound_min|max_velocity&amp;quot; spawnargs to control projectile bounce sounds.&lt;br /&gt;
* Added &amp;quot;postbounce_*&amp;quot; spawnargs to change projectile properties after bounce.&lt;br /&gt;
* Added mission.cfg as a temporary way for mission to override non-archived cvars (5453).&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Coding&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
* Upgraded libpng and rebuilt third-party packages.&lt;br /&gt;
* Fixed some uninitialized values, float overflows and NaNs across the code.&lt;br /&gt;
* Now several script addons can coexist and work independently (thread).&lt;br /&gt;
* Default value of com_maxfps increased from 144 to 300.&lt;br /&gt;
* Improved idEntityPtr, fixed some warnings.&lt;br /&gt;
* Simplified flee script event, supported fleeing from non-actor entity and fleeFromPoint.&lt;br /&gt;
* CFrobLock now supports script events: Lock, Unlock, ToggleLock, IsLocked, IsPickable (6329).&lt;br /&gt;
* Added cvar to modify all head bobbing settings (6310).&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Assets&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
* Added automatic turrets, to be combined with security cameras (Thread).&lt;br /&gt;
&lt;br /&gt;
* Added more covered furniture models (6289).&lt;br /&gt;
&lt;br /&gt;
* Added wall models from Seeking Lady Leicester (6293).&lt;br /&gt;
&lt;br /&gt;
* New and fixed versions of atdm:lamp_electric_square_3_lit_unattached (6315).&lt;br /&gt;
&lt;br /&gt;
* Fixed UV map on Stove models (6312).&lt;br /&gt;
&lt;br /&gt;
* Added forest models from The Valley abandoned mission.&lt;br /&gt;
&lt;br /&gt;
* Improved Merry Chest prefabs (6459).&lt;br /&gt;
&lt;br /&gt;
* Improved normal map of long banners (6355).&lt;br /&gt;
&lt;br /&gt;
* Fixed overbright skins for nature bushes (6478).&lt;br /&gt;
&lt;br /&gt;
* Fixed Grandfather_clock_victorian_01 model (6383).&lt;br /&gt;
&lt;br /&gt;
* Tweaked fogging of health potion.&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Gameplay&#039;&#039;&#039; ==&lt;br /&gt;
     &lt;br /&gt;
* Frob controls have been reworked completely. Previously players were annoyed by having to do three presses to extinguish a light. Also, some player didn&#039;t even know that bodies could be shouldered and were limited with dragging bodies. Now simply clicking the frob button performs the action player needs most of the time, and pressing-and-holding the same button performs alternative actions like dragging bodies and extinguishing candles (thread).&lt;br /&gt;
&lt;br /&gt;
* Several aspects of mantling has been improved: overhead mantling has become faster, mantling over low obstacles is allowed while carrying an item or a body. Also it is possible to switch weapon while being on rope/ladder or mantling. Pressing crouch button on rope/ladder now starts slide-down immediately.&lt;br /&gt;
&lt;br /&gt;
* Some aspects of gameplay can be further simplified. Auto-search bodies is for players who don&#039;t want to waste time searching for keys and purses on guard bodies. Lockpicking &amp;quot;Auto&amp;quot; difficulty now indeed trivializes lockpicking (thread).&lt;br /&gt;
&lt;br /&gt;
* Leaning animation has been improved with lower head tilt (thread).&lt;br /&gt;
&lt;br /&gt;
* More settings to reduce camera bobbing/rolling/shaking, which is good for players who feel motion sickness from default camera animations.&lt;br /&gt;
&lt;br /&gt;
* Added vine arrows to the Training Mission (4352).&lt;br /&gt;
&lt;br /&gt;
* Optimized and fixed some issues with Tears of Saint Lucia&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;GUIs&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Subtitles have been added to all AI barks ( Courtesy of Geeps with a few additions by Datiswous and MirceaKitsune )&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Further improvements of subtitles: revised location and font to avoid overlapping with other GUI elements, added directional cue, better slot allocation. Each subtitle is now displayed for at least one second even if the sound is very short.&lt;br /&gt;
&lt;br /&gt;
* Supported -durationExtend for inline subtitles (6262).&lt;br /&gt;
&lt;br /&gt;
* Fixed text &amp;amp; background alignment in mission lists (6337)&lt;br /&gt;
&lt;br /&gt;
* Support fonts aspect ratio correction (6283).&lt;br /&gt;
&lt;br /&gt;
* Added 30 FPS option to max FPS selection in settings menu. &lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Sound&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
* Fixed bug that stereo sample plays for 2x duration due to length confusion.&lt;br /&gt;
* Fixed WAV sounds playing in main menu, all sounds are streaming now (6330)&lt;br /&gt;
* Fixed wench AI sounds (6284).&lt;br /&gt;
* Player footstep sounds have been rebalanced. Metal and water sounds were especially painful previously.&lt;br /&gt;
* Removed pause from looping sound machinery/machines/m3_loop (6384).&lt;br /&gt;
* Added EFX Reverb to the Training Mission&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
{{whatsnew|sort=212}}&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=New_light_leaks_in_2.12&amp;diff=31025</id>
		<title>New light leaks in 2.12</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=New_light_leaks_in_2.12&amp;diff=31025"/>
		<updated>2024-02-24T21:25:30Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: soc3_sacricide fixed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There is major change in TDM 2.12 regarding how shadows are generated due to issue [https://bugs.thedarkmod.com/view.php?id=5172 #5172].&lt;br /&gt;
As the result, some we might see some &#039;&#039;&#039;major light leaks&#039;&#039;&#039; in the old missions.&lt;br /&gt;
&lt;br /&gt;
=== Description ===&lt;br /&gt;
&lt;br /&gt;
As far as I know, the problem happens only with stencil shadows, because stencil shadows are cast from back faces only (shadow maps are generated by front faces too).&lt;br /&gt;
The shape of such light leaks does &#039;&#039;&#039;not&#039;&#039;&#039; depend on the camera position.&lt;br /&gt;
Usually the problem is caused by using caulk on brushes: light leaks through the caulk.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;New behavior&#039;&#039;&#039; (default in TDM 2.12 and after):&lt;br /&gt;
* r_useLightPortalFlow = 2&lt;br /&gt;
* r_useLightPortalFlowCulling = 1&lt;br /&gt;
&lt;br /&gt;
The shadows are computed differently for world areas and for models:&lt;br /&gt;
# Any worldspawn brush within light volume always casts shadow. Even if it is behind walls and closed portals.&lt;br /&gt;
# A model casts shadow only if light beams from the light origin might reach it through visportals. No shadows behind walls and closed portals!&lt;br /&gt;
&lt;br /&gt;
As an exception, some models switch from p.2 to p.1 and cast shadows everywhere.&lt;br /&gt;
For instance, this happens in case of parallel lights, and when entities are explicitly marked with the workaround spawnarg &amp;quot;forceShadowBehindOpaque&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Old behavior&#039;&#039;&#039; (default in TDM 2.11 and before):&lt;br /&gt;
* r_useLightPortalFlow = 1&lt;br /&gt;
* r_useLightPortalFlowCulling = 0&lt;br /&gt;
&lt;br /&gt;
The behavior here is different depending on the type of light:&lt;br /&gt;
* &#039;&#039;&#039;Static&#039;&#039;&#039; lights use the new TDM 2.12 behavior, so models don&#039;t cast shadows behind walls.&lt;br /&gt;
* &#039;&#039;&#039;Dynamic&#039;&#039;&#039; lights: everything within light volume casts shadows, regardless of whether it&#039;s area/brush or model.&lt;br /&gt;
&lt;br /&gt;
The light is static if it has not moved since game start.&lt;br /&gt;
That&#039;s the case when engine uses precomputed shadow volumes for world geometry.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Validation ===&lt;br /&gt;
&lt;br /&gt;
Before adding an issue here, please make sure to check the following steps:&lt;br /&gt;
&lt;br /&gt;
* Start game afresh, install mission, setviewpos and verify that light leak indeed happens. Perhaps you need to open some doors nearby.&lt;br /&gt;
* Restart game afresh, set &amp;quot;r_useLightPortalFlow 1&amp;quot; and &amp;quot;r_useLightPortalFlowCulling 0&amp;quot;, start mission. Check that light leak no longer happens.&lt;br /&gt;
&lt;br /&gt;
The light leak can be caused by this issue only if both points are true.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== List of issues ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Mission name !! getviewpos coordinates !! Links to forums !! Applied fixes&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| ws1_north&lt;br /&gt;
| -1153.92 3523.22 -955.75 29.8 -145.6 0.0&lt;br /&gt;
-664.04 2894.9 -635.75 10.2 9.9 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/ 1]&lt;br /&gt;
[https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=488509 2]&lt;br /&gt;
| svn rev 241: global workaround&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| ws2_homeagain&lt;br /&gt;
|&lt;br /&gt;
 4385 420 -410 -30 -110 0 &lt;br /&gt;
 4178.12 391.47 -94.56 -28.8 43.6 0.0&lt;br /&gt;
 4347.92 -271.22 57.53 -0.8 18.4 0.0 &lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=490582 1]&lt;br /&gt;
| svn rev 267: global workaround&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| cos3_sacricide&lt;br /&gt;
|&lt;br /&gt;
 -1283.53 -380.68 83.25   15.2 -38.6 0.0&lt;br /&gt;
 -1044.74 -488.21 -74.51   0.1 89.2 0.0&lt;br /&gt;
 -1354.18 -806.16 76.39   11.0 -149.0 0.0&lt;br /&gt;
 -1077.75 240.02 -39.05   9.1 142.6 -0.0&lt;br /&gt;
 -216.02 -157.15 74.66   -8.8 -43.7 -0.0&lt;br /&gt;
 -86.51 380.53 87.05   -13.3 -65.1 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=489895 1]&lt;br /&gt;
| svn rev 275: global workaround&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| poets&lt;br /&gt;
| 1768.4 76.97 60.25   4.17 156.92 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22294-beta-testing-212/&amp;amp;do=findComment&amp;amp;comment=492045 1]&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/page/3/#comment-492137 in beta212-06]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| heartv2&lt;br /&gt;
| 1736.48 3691.68 -137.75 -5.4 101.1 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=492047 1]&lt;br /&gt;
| svn rev 274: workaround on func_static_46&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| gatehouse1_3&lt;br /&gt;
| -940.97 270.14 66.25 -3.97 146.34 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=492373 1]&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=492510 other issue]&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=New_light_leaks_in_2.12&amp;diff=31024</id>
		<title>New light leaks in 2.12</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=New_light_leaks_in_2.12&amp;diff=31024"/>
		<updated>2024-02-24T21:16:48Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: /* List of issues */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There is major change in TDM 2.12 regarding how shadows are generated due to issue [https://bugs.thedarkmod.com/view.php?id=5172 #5172].&lt;br /&gt;
As the result, some we might see some &#039;&#039;&#039;major light leaks&#039;&#039;&#039; in the old missions.&lt;br /&gt;
&lt;br /&gt;
=== Description ===&lt;br /&gt;
&lt;br /&gt;
As far as I know, the problem happens only with stencil shadows, because stencil shadows are cast from back faces only (shadow maps are generated by front faces too).&lt;br /&gt;
The shape of such light leaks does &#039;&#039;&#039;not&#039;&#039;&#039; depend on the camera position.&lt;br /&gt;
Usually the problem is caused by using caulk on brushes: light leaks through the caulk.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;New behavior&#039;&#039;&#039; (default in TDM 2.12 and after):&lt;br /&gt;
* r_useLightPortalFlow = 2&lt;br /&gt;
* r_useLightPortalFlowCulling = 1&lt;br /&gt;
&lt;br /&gt;
The shadows are computed differently for world areas and for models:&lt;br /&gt;
# Any worldspawn brush within light volume always casts shadow. Even if it is behind walls and closed portals.&lt;br /&gt;
# A model casts shadow only if light beams from the light origin might reach it through visportals. No shadows behind walls and closed portals!&lt;br /&gt;
&lt;br /&gt;
As an exception, some models switch from p.2 to p.1 and cast shadows everywhere.&lt;br /&gt;
For instance, this happens in case of parallel lights, and when entities are explicitly marked with the workaround spawnarg &amp;quot;forceShadowBehindOpaque&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Old behavior&#039;&#039;&#039; (default in TDM 2.11 and before):&lt;br /&gt;
* r_useLightPortalFlow = 1&lt;br /&gt;
* r_useLightPortalFlowCulling = 0&lt;br /&gt;
&lt;br /&gt;
The behavior here is different depending on the type of light:&lt;br /&gt;
* &#039;&#039;&#039;Static&#039;&#039;&#039; lights use the new TDM 2.12 behavior, so models don&#039;t cast shadows behind walls.&lt;br /&gt;
* &#039;&#039;&#039;Dynamic&#039;&#039;&#039; lights: everything within light volume casts shadows, regardless of whether it&#039;s area/brush or model.&lt;br /&gt;
&lt;br /&gt;
The light is static if it has not moved since game start.&lt;br /&gt;
That&#039;s the case when engine uses precomputed shadow volumes for world geometry.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Validation ===&lt;br /&gt;
&lt;br /&gt;
Before adding an issue here, please make sure to check the following steps:&lt;br /&gt;
&lt;br /&gt;
* Start game afresh, install mission, setviewpos and verify that light leak indeed happens. Perhaps you need to open some doors nearby.&lt;br /&gt;
* Restart game afresh, set &amp;quot;r_useLightPortalFlow 1&amp;quot; and &amp;quot;r_useLightPortalFlowCulling 0&amp;quot;, start mission. Check that light leak no longer happens.&lt;br /&gt;
&lt;br /&gt;
The light leak can be caused by this issue only if both points are true.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== List of issues ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Mission name !! getviewpos coordinates !! Links to forums !! Applied fixes&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| ws1_north&lt;br /&gt;
| -1153.92 3523.22 -955.75 29.8 -145.6 0.0&lt;br /&gt;
-664.04 2894.9 -635.75 10.2 9.9 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/ 1]&lt;br /&gt;
[https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=488509 2]&lt;br /&gt;
| svn rev 241: global workaround&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| ws2_homeagain&lt;br /&gt;
|&lt;br /&gt;
 4385 420 -410 -30 -110 0 &lt;br /&gt;
 4178.12 391.47 -94.56 -28.8 43.6 0.0&lt;br /&gt;
 4347.92 -271.22 57.53 -0.8 18.4 0.0 &lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=490582 1]&lt;br /&gt;
| svn rev 267: global workaround&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| cos3_sacricide&lt;br /&gt;
|&lt;br /&gt;
 -1283.53 -380.68 83.25   15.2 -38.6 0.0&lt;br /&gt;
 -1044.74 -488.21 -74.51   0.1 89.2 0.0&lt;br /&gt;
 -1354.18 -806.16 76.39   11.0 -149.0 0.0&lt;br /&gt;
 -1077.75 240.02 -39.05   9.1 142.6 -0.0&lt;br /&gt;
 -216.02 -157.15 74.66   -8.8 -43.7 -0.0&lt;br /&gt;
 -86.51 380.53 87.05   -13.3 -65.1 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=489895 1]&lt;br /&gt;
| (not yet)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| poets&lt;br /&gt;
| 1768.4 76.97 60.25   4.17 156.92 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22294-beta-testing-212/&amp;amp;do=findComment&amp;amp;comment=492045 1]&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/page/3/#comment-492137 in beta212-06]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| heartv2&lt;br /&gt;
| 1736.48 3691.68 -137.75 -5.4 101.1 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=492047 1]&lt;br /&gt;
| svn rev 274: workaround on func_static_46&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| gatehouse1_3&lt;br /&gt;
| -940.97 270.14 66.25 -3.97 146.34 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=492373 1]&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=492510 other issue]&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=New_light_leaks_in_2.12&amp;diff=31023</id>
		<title>New light leaks in 2.12</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=New_light_leaks_in_2.12&amp;diff=31023"/>
		<updated>2024-02-24T21:16:30Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: /* List of issues */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There is major change in TDM 2.12 regarding how shadows are generated due to issue [https://bugs.thedarkmod.com/view.php?id=5172 #5172].&lt;br /&gt;
As the result, some we might see some &#039;&#039;&#039;major light leaks&#039;&#039;&#039; in the old missions.&lt;br /&gt;
&lt;br /&gt;
=== Description ===&lt;br /&gt;
&lt;br /&gt;
As far as I know, the problem happens only with stencil shadows, because stencil shadows are cast from back faces only (shadow maps are generated by front faces too).&lt;br /&gt;
The shape of such light leaks does &#039;&#039;&#039;not&#039;&#039;&#039; depend on the camera position.&lt;br /&gt;
Usually the problem is caused by using caulk on brushes: light leaks through the caulk.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;New behavior&#039;&#039;&#039; (default in TDM 2.12 and after):&lt;br /&gt;
* r_useLightPortalFlow = 2&lt;br /&gt;
* r_useLightPortalFlowCulling = 1&lt;br /&gt;
&lt;br /&gt;
The shadows are computed differently for world areas and for models:&lt;br /&gt;
# Any worldspawn brush within light volume always casts shadow. Even if it is behind walls and closed portals.&lt;br /&gt;
# A model casts shadow only if light beams from the light origin might reach it through visportals. No shadows behind walls and closed portals!&lt;br /&gt;
&lt;br /&gt;
As an exception, some models switch from p.2 to p.1 and cast shadows everywhere.&lt;br /&gt;
For instance, this happens in case of parallel lights, and when entities are explicitly marked with the workaround spawnarg &amp;quot;forceShadowBehindOpaque&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Old behavior&#039;&#039;&#039; (default in TDM 2.11 and before):&lt;br /&gt;
* r_useLightPortalFlow = 1&lt;br /&gt;
* r_useLightPortalFlowCulling = 0&lt;br /&gt;
&lt;br /&gt;
The behavior here is different depending on the type of light:&lt;br /&gt;
* &#039;&#039;&#039;Static&#039;&#039;&#039; lights use the new TDM 2.12 behavior, so models don&#039;t cast shadows behind walls.&lt;br /&gt;
* &#039;&#039;&#039;Dynamic&#039;&#039;&#039; lights: everything within light volume casts shadows, regardless of whether it&#039;s area/brush or model.&lt;br /&gt;
&lt;br /&gt;
The light is static if it has not moved since game start.&lt;br /&gt;
That&#039;s the case when engine uses precomputed shadow volumes for world geometry.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Validation ===&lt;br /&gt;
&lt;br /&gt;
Before adding an issue here, please make sure to check the following steps:&lt;br /&gt;
&lt;br /&gt;
* Start game afresh, install mission, setviewpos and verify that light leak indeed happens. Perhaps you need to open some doors nearby.&lt;br /&gt;
* Restart game afresh, set &amp;quot;r_useLightPortalFlow 1&amp;quot; and &amp;quot;r_useLightPortalFlowCulling 0&amp;quot;, start mission. Check that light leak no longer happens.&lt;br /&gt;
&lt;br /&gt;
The light leak can be caused by this issue only if both points are true.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== List of issues ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Mission name !! getviewpos coordinates !! Links to forums !! Applied fixes&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| ws1_north&lt;br /&gt;
| -1153.92 3523.22 -955.75 29.8 -145.6 0.0&lt;br /&gt;
-664.04 2894.9 -635.75 10.2 9.9 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/ 1]&lt;br /&gt;
[https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=488509 2]&lt;br /&gt;
| svn rev 241: global workaround&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| ws2_homeagain&lt;br /&gt;
|&lt;br /&gt;
 4385 420 -410 -30 -110 0 &lt;br /&gt;
 4178.12 391.47 -94.56 -28.8 43.6 0.0&lt;br /&gt;
 4347.92 -271.22 57.53 -0.8 18.4 0.0 &lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=490582 1]&lt;br /&gt;
| svn rev 267: global workaround&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| cos3_sacricide&lt;br /&gt;
|&lt;br /&gt;
-1283.53 -380.68 83.25   15.2 -38.6 0.0&lt;br /&gt;
-1044.74 -488.21 -74.51   0.1 89.2 0.0&lt;br /&gt;
-1354.18 -806.16 76.39   11.0 -149.0 0.0&lt;br /&gt;
-1077.75 240.02 -39.05   9.1 142.6 -0.0&lt;br /&gt;
-216.02 -157.15 74.66   -8.8 -43.7 -0.0&lt;br /&gt;
-86.51 380.53 87.05   -13.3 -65.1 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=489895 1]&lt;br /&gt;
| (not yet)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| poets&lt;br /&gt;
| 1768.4 76.97 60.25   4.17 156.92 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22294-beta-testing-212/&amp;amp;do=findComment&amp;amp;comment=492045 1]&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/page/3/#comment-492137 in beta212-06]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| heartv2&lt;br /&gt;
| 1736.48 3691.68 -137.75 -5.4 101.1 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=492047 1]&lt;br /&gt;
| svn rev 274: workaround on func_static_46&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| gatehouse1_3&lt;br /&gt;
| -940.97 270.14 66.25 -3.97 146.34 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=492373 1]&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=492510 other issue]&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=New_light_leaks_in_2.12&amp;diff=31022</id>
		<title>New light leaks in 2.12</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=New_light_leaks_in_2.12&amp;diff=31022"/>
		<updated>2024-02-24T21:16:17Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: cos3: more locations&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There is major change in TDM 2.12 regarding how shadows are generated due to issue [https://bugs.thedarkmod.com/view.php?id=5172 #5172].&lt;br /&gt;
As the result, some we might see some &#039;&#039;&#039;major light leaks&#039;&#039;&#039; in the old missions.&lt;br /&gt;
&lt;br /&gt;
=== Description ===&lt;br /&gt;
&lt;br /&gt;
As far as I know, the problem happens only with stencil shadows, because stencil shadows are cast from back faces only (shadow maps are generated by front faces too).&lt;br /&gt;
The shape of such light leaks does &#039;&#039;&#039;not&#039;&#039;&#039; depend on the camera position.&lt;br /&gt;
Usually the problem is caused by using caulk on brushes: light leaks through the caulk.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;New behavior&#039;&#039;&#039; (default in TDM 2.12 and after):&lt;br /&gt;
* r_useLightPortalFlow = 2&lt;br /&gt;
* r_useLightPortalFlowCulling = 1&lt;br /&gt;
&lt;br /&gt;
The shadows are computed differently for world areas and for models:&lt;br /&gt;
# Any worldspawn brush within light volume always casts shadow. Even if it is behind walls and closed portals.&lt;br /&gt;
# A model casts shadow only if light beams from the light origin might reach it through visportals. No shadows behind walls and closed portals!&lt;br /&gt;
&lt;br /&gt;
As an exception, some models switch from p.2 to p.1 and cast shadows everywhere.&lt;br /&gt;
For instance, this happens in case of parallel lights, and when entities are explicitly marked with the workaround spawnarg &amp;quot;forceShadowBehindOpaque&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Old behavior&#039;&#039;&#039; (default in TDM 2.11 and before):&lt;br /&gt;
* r_useLightPortalFlow = 1&lt;br /&gt;
* r_useLightPortalFlowCulling = 0&lt;br /&gt;
&lt;br /&gt;
The behavior here is different depending on the type of light:&lt;br /&gt;
* &#039;&#039;&#039;Static&#039;&#039;&#039; lights use the new TDM 2.12 behavior, so models don&#039;t cast shadows behind walls.&lt;br /&gt;
* &#039;&#039;&#039;Dynamic&#039;&#039;&#039; lights: everything within light volume casts shadows, regardless of whether it&#039;s area/brush or model.&lt;br /&gt;
&lt;br /&gt;
The light is static if it has not moved since game start.&lt;br /&gt;
That&#039;s the case when engine uses precomputed shadow volumes for world geometry.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Validation ===&lt;br /&gt;
&lt;br /&gt;
Before adding an issue here, please make sure to check the following steps:&lt;br /&gt;
&lt;br /&gt;
* Start game afresh, install mission, setviewpos and verify that light leak indeed happens. Perhaps you need to open some doors nearby.&lt;br /&gt;
* Restart game afresh, set &amp;quot;r_useLightPortalFlow 1&amp;quot; and &amp;quot;r_useLightPortalFlowCulling 0&amp;quot;, start mission. Check that light leak no longer happens.&lt;br /&gt;
&lt;br /&gt;
The light leak can be caused by this issue only if both points are true.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== List of issues ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Mission name !! getviewpos coordinates !! Links to forums !! Applied fixes&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| ws1_north&lt;br /&gt;
| -1153.92 3523.22 -955.75 29.8 -145.6 0.0&lt;br /&gt;
-664.04 2894.9 -635.75 10.2 9.9 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/ 1]&lt;br /&gt;
[https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=488509 2]&lt;br /&gt;
| svn rev 241: global workaround&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| ws2_homeagain&lt;br /&gt;
|&lt;br /&gt;
 4385 420 -410 -30 -110 0 &lt;br /&gt;
 4178.12 391.47 -94.56 -28.8 43.6 0.0&lt;br /&gt;
 4347.92 -271.22 57.53 -0.8 18.4 0.0 &lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=490582 1]&lt;br /&gt;
| svn rev 267: global workaround&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| cos3_sacricide&lt;br /&gt;
| -1283.53 -380.68 83.25   15.2 -38.6 0.0&lt;br /&gt;
-1044.74 -488.21 -74.51   0.1 89.2 0.0&lt;br /&gt;
-1354.18 -806.16 76.39   11.0 -149.0 0.0&lt;br /&gt;
-1077.75 240.02 -39.05   9.1 142.6 -0.0&lt;br /&gt;
-216.02 -157.15 74.66   -8.8 -43.7 -0.0&lt;br /&gt;
-86.51 380.53 87.05   -13.3 -65.1 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=489895 1]&lt;br /&gt;
| (not yet)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| poets&lt;br /&gt;
| 1768.4 76.97 60.25   4.17 156.92 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22294-beta-testing-212/&amp;amp;do=findComment&amp;amp;comment=492045 1]&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/page/3/#comment-492137 in beta212-06]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| heartv2&lt;br /&gt;
| 1736.48 3691.68 -137.75 -5.4 101.1 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=492047 1]&lt;br /&gt;
| svn rev 274: workaround on func_static_46&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| gatehouse1_3&lt;br /&gt;
| -940.97 270.14 66.25 -3.97 146.34 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=492373 1]&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=492510 other issue]&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=New_light_leaks_in_2.12&amp;diff=31021</id>
		<title>New light leaks in 2.12</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=New_light_leaks_in_2.12&amp;diff=31021"/>
		<updated>2024-02-24T20:46:02Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: /* List of issues */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There is major change in TDM 2.12 regarding how shadows are generated due to issue [https://bugs.thedarkmod.com/view.php?id=5172 #5172].&lt;br /&gt;
As the result, some we might see some &#039;&#039;&#039;major light leaks&#039;&#039;&#039; in the old missions.&lt;br /&gt;
&lt;br /&gt;
=== Description ===&lt;br /&gt;
&lt;br /&gt;
As far as I know, the problem happens only with stencil shadows, because stencil shadows are cast from back faces only (shadow maps are generated by front faces too).&lt;br /&gt;
The shape of such light leaks does &#039;&#039;&#039;not&#039;&#039;&#039; depend on the camera position.&lt;br /&gt;
Usually the problem is caused by using caulk on brushes: light leaks through the caulk.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;New behavior&#039;&#039;&#039; (default in TDM 2.12 and after):&lt;br /&gt;
* r_useLightPortalFlow = 2&lt;br /&gt;
* r_useLightPortalFlowCulling = 1&lt;br /&gt;
&lt;br /&gt;
The shadows are computed differently for world areas and for models:&lt;br /&gt;
# Any worldspawn brush within light volume always casts shadow. Even if it is behind walls and closed portals.&lt;br /&gt;
# A model casts shadow only if light beams from the light origin might reach it through visportals. No shadows behind walls and closed portals!&lt;br /&gt;
&lt;br /&gt;
As an exception, some models switch from p.2 to p.1 and cast shadows everywhere.&lt;br /&gt;
For instance, this happens in case of parallel lights, and when entities are explicitly marked with the workaround spawnarg &amp;quot;forceShadowBehindOpaque&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Old behavior&#039;&#039;&#039; (default in TDM 2.11 and before):&lt;br /&gt;
* r_useLightPortalFlow = 1&lt;br /&gt;
* r_useLightPortalFlowCulling = 0&lt;br /&gt;
&lt;br /&gt;
The behavior here is different depending on the type of light:&lt;br /&gt;
* &#039;&#039;&#039;Static&#039;&#039;&#039; lights use the new TDM 2.12 behavior, so models don&#039;t cast shadows behind walls.&lt;br /&gt;
* &#039;&#039;&#039;Dynamic&#039;&#039;&#039; lights: everything within light volume casts shadows, regardless of whether it&#039;s area/brush or model.&lt;br /&gt;
&lt;br /&gt;
The light is static if it has not moved since game start.&lt;br /&gt;
That&#039;s the case when engine uses precomputed shadow volumes for world geometry.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Validation ===&lt;br /&gt;
&lt;br /&gt;
Before adding an issue here, please make sure to check the following steps:&lt;br /&gt;
&lt;br /&gt;
* Start game afresh, install mission, setviewpos and verify that light leak indeed happens. Perhaps you need to open some doors nearby.&lt;br /&gt;
* Restart game afresh, set &amp;quot;r_useLightPortalFlow 1&amp;quot; and &amp;quot;r_useLightPortalFlowCulling 0&amp;quot;, start mission. Check that light leak no longer happens.&lt;br /&gt;
&lt;br /&gt;
The light leak can be caused by this issue only if both points are true.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== List of issues ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Mission name !! getviewpos coordinates !! Links to forums !! Applied fixes&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| ws1_north&lt;br /&gt;
| -1153.92 3523.22 -955.75 29.8 -145.6 0.0&lt;br /&gt;
-664.04 2894.9 -635.75 10.2 9.9 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/ 1]&lt;br /&gt;
[https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=488509 2]&lt;br /&gt;
| svn rev 241: global workaround&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| ws2_homeagain&lt;br /&gt;
|&lt;br /&gt;
 4385 420 -410 -30 -110 0 &lt;br /&gt;
 4178.12 391.47 -94.56 -28.8 43.6 0.0&lt;br /&gt;
 4347.92 -271.22 57.53 -0.8 18.4 0.0 &lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=490582 1]&lt;br /&gt;
| svn rev 267: global workaround&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| cos3_sacricide&lt;br /&gt;
| -1283.53 -380.68 83.25   15.2 -38.6 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=489895 1]&lt;br /&gt;
| (not yet)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| poets&lt;br /&gt;
| 1768.4 76.97 60.25   4.17 156.92 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22294-beta-testing-212/&amp;amp;do=findComment&amp;amp;comment=492045 1]&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/page/3/#comment-492137 in beta212-06]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| heartv2&lt;br /&gt;
| 1736.48 3691.68 -137.75 -5.4 101.1 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=492047 1]&lt;br /&gt;
| svn rev 274: workaround on func_static_46&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| gatehouse1_3&lt;br /&gt;
| -940.97 270.14 66.25 -3.97 146.34 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=492373 1]&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=492510 other issue]&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=New_light_leaks_in_2.12&amp;diff=31020</id>
		<title>New light leaks in 2.12</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=New_light_leaks_in_2.12&amp;diff=31020"/>
		<updated>2024-02-24T20:18:00Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There is major change in TDM 2.12 regarding how shadows are generated due to issue [https://bugs.thedarkmod.com/view.php?id=5172 #5172].&lt;br /&gt;
As the result, some we might see some &#039;&#039;&#039;major light leaks&#039;&#039;&#039; in the old missions.&lt;br /&gt;
&lt;br /&gt;
=== Description ===&lt;br /&gt;
&lt;br /&gt;
As far as I know, the problem happens only with stencil shadows, because stencil shadows are cast from back faces only (shadow maps are generated by front faces too).&lt;br /&gt;
The shape of such light leaks does &#039;&#039;&#039;not&#039;&#039;&#039; depend on the camera position.&lt;br /&gt;
Usually the problem is caused by using caulk on brushes: light leaks through the caulk.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;New behavior&#039;&#039;&#039; (default in TDM 2.12 and after):&lt;br /&gt;
* r_useLightPortalFlow = 2&lt;br /&gt;
* r_useLightPortalFlowCulling = 1&lt;br /&gt;
&lt;br /&gt;
The shadows are computed differently for world areas and for models:&lt;br /&gt;
# Any worldspawn brush within light volume always casts shadow. Even if it is behind walls and closed portals.&lt;br /&gt;
# A model casts shadow only if light beams from the light origin might reach it through visportals. No shadows behind walls and closed portals!&lt;br /&gt;
&lt;br /&gt;
As an exception, some models switch from p.2 to p.1 and cast shadows everywhere.&lt;br /&gt;
For instance, this happens in case of parallel lights, and when entities are explicitly marked with the workaround spawnarg &amp;quot;forceShadowBehindOpaque&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Old behavior&#039;&#039;&#039; (default in TDM 2.11 and before):&lt;br /&gt;
* r_useLightPortalFlow = 1&lt;br /&gt;
* r_useLightPortalFlowCulling = 0&lt;br /&gt;
&lt;br /&gt;
The behavior here is different depending on the type of light:&lt;br /&gt;
* &#039;&#039;&#039;Static&#039;&#039;&#039; lights use the new TDM 2.12 behavior, so models don&#039;t cast shadows behind walls.&lt;br /&gt;
* &#039;&#039;&#039;Dynamic&#039;&#039;&#039; lights: everything within light volume casts shadows, regardless of whether it&#039;s area/brush or model.&lt;br /&gt;
&lt;br /&gt;
The light is static if it has not moved since game start.&lt;br /&gt;
That&#039;s the case when engine uses precomputed shadow volumes for world geometry.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Validation ===&lt;br /&gt;
&lt;br /&gt;
Before adding an issue here, please make sure to check the following steps:&lt;br /&gt;
&lt;br /&gt;
* Start game afresh, install mission, setviewpos and verify that light leak indeed happens. Perhaps you need to open some doors nearby.&lt;br /&gt;
* Restart game afresh, set &amp;quot;r_useLightPortalFlow 1&amp;quot; and &amp;quot;r_useLightPortalFlowCulling 0&amp;quot;, start mission. Check that light leak no longer happens.&lt;br /&gt;
&lt;br /&gt;
The light leak can be caused by this issue only if both points are true.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== List of issues ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Mission name !! getviewpos coordinates !! Links to forums !! Applied fixes&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| ws1_north&lt;br /&gt;
| -1153.92 3523.22 -955.75 29.8 -145.6 0.0&lt;br /&gt;
-664.04 2894.9 -635.75 10.2 9.9 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/ 1]&lt;br /&gt;
[https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=488509 2]&lt;br /&gt;
| svn rev 241: global workaround&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| ws2_homeagain&lt;br /&gt;
|&lt;br /&gt;
 4385 420 -410 -30 -110 0 &lt;br /&gt;
 4178.12 391.47 -94.56 -28.8 43.6 0.0&lt;br /&gt;
 4347.92 -271.22 57.53 -0.8 18.4 0.0 &lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=490582 1]&lt;br /&gt;
| svn rev 267: global workaround&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| cos3_sacricide&lt;br /&gt;
| -1283.53 -380.68 83.25   15.2 -38.6 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=489895 1]&lt;br /&gt;
| (not yet)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| poets&lt;br /&gt;
| 1768.4 76.97 60.25   4.17 156.92 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22294-beta-testing-212/&amp;amp;do=findComment&amp;amp;comment=492045 1]&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/page/3/#comment-492137 in beta212-06]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| heartv2&lt;br /&gt;
| 1736.48 3691.68 -137.75 -5.4 101.1 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=492047 1]&lt;br /&gt;
| svn rev 274: workaround on func_static_46&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| gatehouse1_3&lt;br /&gt;
| -940.97 270.14 66.25 -3.97 146.34 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=492373 1]&lt;br /&gt;
| (not yet)&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=New_light_leaks_in_2.12&amp;diff=31019</id>
		<title>New light leaks in 2.12</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=New_light_leaks_in_2.12&amp;diff=31019"/>
		<updated>2024-02-24T20:13:58Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: Fixed heartv2&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There is major change in TDM 2.12 regarding how shadows are generated due to issue [https://bugs.thedarkmod.com/view.php?id=5172 #5172].&lt;br /&gt;
As the result, some we might see some &#039;&#039;&#039;major light leaks&#039;&#039;&#039; in the old missions.&lt;br /&gt;
&lt;br /&gt;
=== Description ===&lt;br /&gt;
&lt;br /&gt;
As far as I know, the problem happens only with stencil shadows, because stencil shadows are cast from back faces only (shadow maps are generated by front faces too).&lt;br /&gt;
The shape of such light leaks does &#039;&#039;&#039;not&#039;&#039;&#039; depend on the camera position.&lt;br /&gt;
Usually the problem is caused by using caulk on brushes: light leaks through the caulk.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;New behavior&#039;&#039;&#039; (default in TDM 2.12 and after):&lt;br /&gt;
* r_useLightPortalFlow = 2&lt;br /&gt;
* r_useLightPortalFlowCulling = 1&lt;br /&gt;
&lt;br /&gt;
The shadows are computed differently for world areas and for models:&lt;br /&gt;
# Any worldspawn brush within light volume always casts shadow. Even if it is behind walls and closed portals.&lt;br /&gt;
# A model casts shadow only if light beams from the light origin might reach it through visportals. No shadows behind walls and closed portals!&lt;br /&gt;
&lt;br /&gt;
As an exception, some models switch from p.2 to p.1 and cast shadows everywhere.&lt;br /&gt;
For instance, this happens in case of parallel lights, and when entities are explicitly marked with the workaround spawnarg &amp;quot;forceShadowBehindOpaque&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Old behavior&#039;&#039;&#039; (default in TDM 2.11 and before):&lt;br /&gt;
* r_useLightPortalFlow = 1&lt;br /&gt;
* r_useLightPortalFlowCulling = 0&lt;br /&gt;
&lt;br /&gt;
The behavior here is different depending on the type of light:&lt;br /&gt;
* &#039;&#039;&#039;Static&#039;&#039;&#039; lights use the new TDM 2.12 behavior, so models don&#039;t cast shadows behind walls.&lt;br /&gt;
* &#039;&#039;&#039;Dynamic&#039;&#039;&#039; lights: everything within light volume casts shadows, regardless of whether it&#039;s area/brush or model.&lt;br /&gt;
&lt;br /&gt;
The light is static if it has not moved since game start.&lt;br /&gt;
That&#039;s the case when engine uses precomputed shadow volumes for world geometry.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Validation ===&lt;br /&gt;
&lt;br /&gt;
Before adding an issue here, please make sure to check the following steps:&lt;br /&gt;
&lt;br /&gt;
* Start game afresh, install mission, setviewpos and verify that light leak indeed happens. Perhaps you need to open some doors nearby.&lt;br /&gt;
* Restart game afresh, set &amp;quot;r_useLightPortalFlow 1&amp;quot; and &amp;quot;r_useLightPortalFlowCulling 0&amp;quot;, start mission. Check that light leak no longer happens.&lt;br /&gt;
&lt;br /&gt;
The light leak can be caused by this issue only if both points are true.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== List of issues ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Mission name !! getviewpos coordinates !! Links to forums !! Applied fixes&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| ws1_north&lt;br /&gt;
| -1153.92 3523.22 -955.75 29.8 -145.6 0.0&lt;br /&gt;
-664.04 2894.9 -635.75 10.2 9.9 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/ 1]&lt;br /&gt;
[https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=488509 2]&lt;br /&gt;
| svn rev 241: global workaround&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| ws2_homeagain&lt;br /&gt;
|&lt;br /&gt;
 4385 420 -410 -30 -110 0 &lt;br /&gt;
 4178.12 391.47 -94.56 -28.8 43.6 0.0&lt;br /&gt;
 4347.92 -271.22 57.53 -0.8 18.4 0.0 &lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=490582 1]&lt;br /&gt;
| svn rev 267: global workaround&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| cos3_sacricide&lt;br /&gt;
| -1283.53 -380.68 83.25   15.2 -38.6 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=489895 1]&lt;br /&gt;
| (not yet)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| poets&lt;br /&gt;
| 1768.4 76.97 60.25   4.17 156.92 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22294-beta-testing-212/&amp;amp;do=findComment&amp;amp;comment=492045 1]&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/page/3/#comment-492137 in beta212-06]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| heartv2&lt;br /&gt;
| 1736.48 3691.68 -137.75 -5.4 101.1 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=492047 1]&lt;br /&gt;
| svn rev 274: workaround on func_static_46&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| gatehouse1_3&lt;br /&gt;
| 940.97 270.14 66.25 -3.97 146.34 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=492373 1]&lt;br /&gt;
| (not yet)&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=New_light_leaks_in_2.12&amp;diff=31014</id>
		<title>New light leaks in 2.12</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=New_light_leaks_in_2.12&amp;diff=31014"/>
		<updated>2024-02-11T12:26:29Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: poets is fixed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There is major change in TDM 2.12 regarding how shadows are generated due to issue [https://bugs.thedarkmod.com/view.php?id=5172 #5172].&lt;br /&gt;
As the result, some we might see some &#039;&#039;&#039;major light leaks&#039;&#039;&#039; in the old missions.&lt;br /&gt;
&lt;br /&gt;
=== Description ===&lt;br /&gt;
&lt;br /&gt;
As far as I know, the problem happens only with stencil shadows, because stencil shadows are cast from back faces only (shadow maps are generated by front faces too).&lt;br /&gt;
The shape of such light leaks does &#039;&#039;&#039;not&#039;&#039;&#039; depend on the camera position.&lt;br /&gt;
Usually the problem is caused by using caulk on brushes: light leaks through the caulk.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;New behavior&#039;&#039;&#039; (default in TDM 2.12 and after):&lt;br /&gt;
* r_useLightPortalFlow = 2&lt;br /&gt;
* r_useLightPortalFlowCulling = 1&lt;br /&gt;
&lt;br /&gt;
The shadows are computed differently for world areas and for models:&lt;br /&gt;
# Any worldspawn brush within light volume always casts shadow. Even if it is behind walls and closed portals.&lt;br /&gt;
# A model casts shadow only if light beams from the light origin might reach it through visportals. No shadows behind walls and closed portals!&lt;br /&gt;
&lt;br /&gt;
As an exception, some models switch from p.2 to p.1 and cast shadows everywhere.&lt;br /&gt;
For instance, this happens in case of parallel lights, and when entities are explicitly marked with the workaround spawnarg &amp;quot;forceShadowBehindOpaque&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Old behavior&#039;&#039;&#039; (default in TDM 2.11 and before):&lt;br /&gt;
* r_useLightPortalFlow = 1&lt;br /&gt;
* r_useLightPortalFlowCulling = 0&lt;br /&gt;
&lt;br /&gt;
The behavior here is different depending on the type of light:&lt;br /&gt;
* &#039;&#039;&#039;Static&#039;&#039;&#039; lights use the new TDM 2.12 behavior, so models don&#039;t cast shadows behind walls.&lt;br /&gt;
* &#039;&#039;&#039;Dynamic&#039;&#039;&#039; lights: everything within light volume casts shadows, regardless of whether it&#039;s area/brush or model.&lt;br /&gt;
&lt;br /&gt;
The light is static if it has not moved since game start.&lt;br /&gt;
That&#039;s the case when engine uses precomputed shadow volumes for world geometry.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Validation ===&lt;br /&gt;
&lt;br /&gt;
Before adding an issue here, please make sure to check the following steps:&lt;br /&gt;
&lt;br /&gt;
* Start game afresh, install mission, setviewpos and verify that light leak indeed happens. Perhaps you need to open some doors nearby.&lt;br /&gt;
* Restart game afresh, set &amp;quot;r_useLightPortalFlow 1&amp;quot; and &amp;quot;r_useLightPortalFlowCulling 0&amp;quot;, start mission. Check that light leak no longer happens.&lt;br /&gt;
&lt;br /&gt;
The light leak can be caused by this issue only if both points are true.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== List of issues ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Mission name !! getviewpos coordinates !! Links to forums !! Applied fixes&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| ws1_north&lt;br /&gt;
| -1153.92 3523.22 -955.75 29.8 -145.6 0.0&lt;br /&gt;
-664.04 2894.9 -635.75 10.2 9.9 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/ 1]&lt;br /&gt;
[https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=488509 2]&lt;br /&gt;
| svn rev 241: global workaround&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| ws2_homeagain&lt;br /&gt;
|&lt;br /&gt;
 4385 420 -410 -30 -110 0 &lt;br /&gt;
 4178.12 391.47 -94.56 -28.8 43.6 0.0&lt;br /&gt;
 4347.92 -271.22 57.53 -0.8 18.4 0.0 &lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=490582 1]&lt;br /&gt;
| svn rev 267: global workaround&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| cos3_sacricide&lt;br /&gt;
| -1283.53 -380.68 83.25   15.2 -38.6 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=489895 1]&lt;br /&gt;
| (not yet)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| poets&lt;br /&gt;
| 1768.4 76.97 60.25   4.17 156.92 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22294-beta-testing-212/&amp;amp;do=findComment&amp;amp;comment=492045 1]&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/page/3/#comment-492137 in beta212-06]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| heartv2&lt;br /&gt;
| 1736.48 3691.68 -137.75 -5.4 101.1 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=492047 1]&lt;br /&gt;
| (not yet)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=New_light_leaks_in_2.12&amp;diff=31013</id>
		<title>New light leaks in 2.12</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=New_light_leaks_in_2.12&amp;diff=31013"/>
		<updated>2024-02-10T20:23:44Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: ws2 fixed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There is major change in TDM 2.12 regarding how shadows are generated due to issue [https://bugs.thedarkmod.com/view.php?id=5172 #5172].&lt;br /&gt;
As the result, some we might see some &#039;&#039;&#039;major light leaks&#039;&#039;&#039; in the old missions.&lt;br /&gt;
&lt;br /&gt;
=== Description ===&lt;br /&gt;
&lt;br /&gt;
As far as I know, the problem happens only with stencil shadows, because stencil shadows are cast from back faces only (shadow maps are generated by front faces too).&lt;br /&gt;
The shape of such light leaks does &#039;&#039;&#039;not&#039;&#039;&#039; depend on the camera position.&lt;br /&gt;
Usually the problem is caused by using caulk on brushes: light leaks through the caulk.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;New behavior&#039;&#039;&#039; (default in TDM 2.12 and after):&lt;br /&gt;
* r_useLightPortalFlow = 2&lt;br /&gt;
* r_useLightPortalFlowCulling = 1&lt;br /&gt;
&lt;br /&gt;
The shadows are computed differently for world areas and for models:&lt;br /&gt;
# Any worldspawn brush within light volume always casts shadow. Even if it is behind walls and closed portals.&lt;br /&gt;
# A model casts shadow only if light beams from the light origin might reach it through visportals. No shadows behind walls and closed portals!&lt;br /&gt;
&lt;br /&gt;
As an exception, some models switch from p.2 to p.1 and cast shadows everywhere.&lt;br /&gt;
For instance, this happens in case of parallel lights, and when entities are explicitly marked with the workaround spawnarg &amp;quot;forceShadowBehindOpaque&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Old behavior&#039;&#039;&#039; (default in TDM 2.11 and before):&lt;br /&gt;
* r_useLightPortalFlow = 1&lt;br /&gt;
* r_useLightPortalFlowCulling = 0&lt;br /&gt;
&lt;br /&gt;
The behavior here is different depending on the type of light:&lt;br /&gt;
* &#039;&#039;&#039;Static&#039;&#039;&#039; lights use the new TDM 2.12 behavior, so models don&#039;t cast shadows behind walls.&lt;br /&gt;
* &#039;&#039;&#039;Dynamic&#039;&#039;&#039; lights: everything within light volume casts shadows, regardless of whether it&#039;s area/brush or model.&lt;br /&gt;
&lt;br /&gt;
The light is static if it has not moved since game start.&lt;br /&gt;
That&#039;s the case when engine uses precomputed shadow volumes for world geometry.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Validation ===&lt;br /&gt;
&lt;br /&gt;
Before adding an issue here, please make sure to check the following steps:&lt;br /&gt;
&lt;br /&gt;
* Start game afresh, install mission, setviewpos and verify that light leak indeed happens. Perhaps you need to open some doors nearby.&lt;br /&gt;
* Restart game afresh, set &amp;quot;r_useLightPortalFlow 1&amp;quot; and &amp;quot;r_useLightPortalFlowCulling 0&amp;quot;, start mission. Check that light leak no longer happens.&lt;br /&gt;
&lt;br /&gt;
The light leak can be caused by this issue only if both points are true.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== List of issues ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Mission name !! getviewpos coordinates !! Links to forums !! Applied fixes&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| ws1_north&lt;br /&gt;
| -1153.92 3523.22 -955.75 29.8 -145.6 0.0&lt;br /&gt;
-664.04 2894.9 -635.75 10.2 9.9 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/ 1]&lt;br /&gt;
[https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=488509 2]&lt;br /&gt;
| svn rev 241: global workaround&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| ws2_homeagain&lt;br /&gt;
|&lt;br /&gt;
 4385 420 -410 -30 -110 0 &lt;br /&gt;
 4178.12 391.47 -94.56 -28.8 43.6 0.0&lt;br /&gt;
 4347.92 -271.22 57.53 -0.8 18.4 0.0 &lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=490582 1]&lt;br /&gt;
| svn rev 267: global workaround&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| cos3_sacricide&lt;br /&gt;
| -1283.53 -380.68 83.25   15.2 -38.6 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=489895 1]&lt;br /&gt;
| (not yet)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| poets&lt;br /&gt;
| 1768.4 76.97 60.25   4.17 156.92 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22294-beta-testing-212/&amp;amp;do=findComment&amp;amp;comment=492045 1]&lt;br /&gt;
| (not yet)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| heartv2&lt;br /&gt;
| 1736.48 3691.68 -137.75 -5.4 101.1 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=492047 1]&lt;br /&gt;
| (not yet)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=Profiling&amp;diff=30993</id>
		<title>Profiling</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=Profiling&amp;diff=30993"/>
		<updated>2024-01-29T19:47:36Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: Added reference to timeline profiler, added Windows sampling profiler instructions, deleted non-universal TIMING_BUILD and M_TIMINGS (use Tracy instead).&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Profiling ==&lt;br /&gt;
&lt;br /&gt;
To find code parts that are too slow, The Dark Mod can be run under a profiler.&lt;br /&gt;
&lt;br /&gt;
The two main types of profilers are:&lt;br /&gt;
* Sampling profiler: use platform tools&lt;br /&gt;
* Timeline profiler: see [[Tracy: timeline profiler]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sampling ==&lt;br /&gt;
&lt;br /&gt;
=== Windows ===&lt;br /&gt;
&lt;br /&gt;
Sampling profiler is integrated into Visual C++ today:&lt;br /&gt;
&lt;br /&gt;
* Run Release build of the game under debugger.&lt;br /&gt;
* Go to menu &amp;lt;tt&amp;gt;Debug -&amp;gt; Windows -&amp;gt; Diagnostic Tools&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Switch to &amp;lt;tt&amp;gt;CPU Usage&amp;lt;/tt&amp;gt; tab. &lt;br /&gt;
* Enable &amp;lt;tt&amp;gt;Record CPU Profile&amp;lt;/tt&amp;gt; to start profiling.&lt;br /&gt;
* Break/pause execution to see profiling results since start. Preferably click on &amp;lt;tt&amp;gt;Open Details&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Linux ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note: This section is outdated!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== gprof ====&lt;br /&gt;
&lt;br /&gt;
gprof is part of the GNU tools just like gcc is, and is an application-level profiler.&lt;br /&gt;
&lt;br /&gt;
To compile the TDM source for profiling, you can use&lt;br /&gt;
&lt;br /&gt;
 ./linuxBuild BUILD=profile&lt;br /&gt;
&lt;br /&gt;
Then run TDM normally:&lt;br /&gt;
&lt;br /&gt;
 cd .doom3/&lt;br /&gt;
 ./thedarkmod.x86&lt;br /&gt;
&lt;br /&gt;
This will produce a file named &amp;quot;gmon.out&amp;quot;, which can then after TDM exits, be analyzed with gprof:&lt;br /&gt;
&lt;br /&gt;
 gprof&lt;br /&gt;
&lt;br /&gt;
For further information see the man page of &amp;lt;tt&amp;gt;gprof&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== oprofile ====&lt;br /&gt;
&lt;br /&gt;
Another method of profiling is by using &#039;&#039;&#039;oprofile&#039;&#039;&#039;. &#039;&#039;&#039;oprofile&#039;&#039;&#039; is a system-wide profiler, that can also profile the Linux kernel. It will by default profile everything that is running, so to avoid noise it is better to close as many applications (chat, Firefox etc) and shut down as many system services (f.i. Mysql, Postgres, Apache) as possible.&lt;br /&gt;
&lt;br /&gt;
===== Preparing oprofile =====&lt;br /&gt;
&lt;br /&gt;
* First, install the nec. packages:&lt;br /&gt;
&lt;br /&gt;
 sudo aptitude install oprofile oprofile-gui&lt;br /&gt;
&lt;br /&gt;
The next step is not nec., so you could f.i. also profile a release build, however, the output will be less informative  without symbols.&lt;br /&gt;
&lt;br /&gt;
* Then, recompile the TDM source with debug to get symbol names. &lt;br /&gt;
&lt;br /&gt;
 ./linuxBuild BUILD=debug&lt;br /&gt;
&lt;br /&gt;
Note: &#039;&#039;&#039;&amp;quot;debug&amp;quot;&#039;&#039;&#039;, not &amp;quot;release&amp;quot; nor &amp;quot;profile&amp;quot;!&lt;br /&gt;
&lt;br /&gt;
There are two ways to use oprofile:&lt;br /&gt;
&lt;br /&gt;
===== Using tdm_profile.sh =====&lt;br /&gt;
&lt;br /&gt;
Instead of using tdm_launcher.linux, open a shell, change to the darkmod directory and run:&lt;br /&gt;
&lt;br /&gt;
 sudo ./tdm_profile.sh fm_name&lt;br /&gt;
&lt;br /&gt;
where fm_name is a &#039;&#039;&#039;previously installed FM&#039;&#039;&#039;, e.g. the directory it resides in, f.i:&lt;br /&gt;
&lt;br /&gt;
 sudo ./tdm_profile.sh builders_influence&lt;br /&gt;
&lt;br /&gt;
It has not nec. to be the current installed FM, but it must have been installed already! &lt;br /&gt;
&lt;br /&gt;
After loading a game, running around a bit and exiting TDM again, you can find a report in the file &#039;&#039;&#039;tdm_profile_report.txt&#039;&#039;&#039; inside the darkmod directory.&lt;br /&gt;
&lt;br /&gt;
The disadvantage of this method is that you will also profile the mission load time, and for big missions that will easily swamp any work done during the mission run time unless you spent minutes there.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Sample output:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CPU: AMD64 processors, speed 1800 MHz (estimated)&lt;br /&gt;
Counted CPU_CLK_UNHALTED events (Cycles outside of halt state) with a unit mask of 0x00 (No unit mask) count 100000&lt;br /&gt;
samples  %        image name               app name                 symbol name&lt;br /&gt;
2034319  38.8674  doom.x86                 doom.x86                 /home/te/games/doom3/doom.x86&lt;br /&gt;
1303104  24.8969  libGLcore.so.185.18.36   doom.x86                 /usr/lib32/libGLcore.so.185.18.36&lt;br /&gt;
154842    2.9584  libmozjs.so              firefox                  /usr/lib/xulrunner-1.9.1.9/libmozjs.so&lt;br /&gt;
139323    2.6619  libasound_module_rate_speexrate.so doom.x86                 /usr/lib32/alsa-lib/libasound_module_rate_speexrate.so&lt;br /&gt;
124850    2.3854  gamex86.so               doom.x86                 CImage::LoadImage(CRenderPipe*)&lt;br /&gt;
80195     1.5322  gamex86.so               doom.x86                 iReadLump&lt;br /&gt;
66593     1.2723  libxul.so                firefox                  /usr/lib/xulrunner-1.9.1.9/libxul.so&lt;br /&gt;
62445     1.1931  gamex86.so               doom.x86                 idClip::ClipModelsTouchingBounds_r(clipSector_s const*, listParms_s&amp;amp;) const&lt;br /&gt;
56680     1.0829  zero                     doom.x86                 /dev/zero&lt;br /&gt;
43315     0.8276  libc-2.10.1.so           doom.x86                 memcpy&lt;br /&gt;
41921     0.8009  libGLcore.so.185.18.36   kwin                     /usr/lib/libGLcore.so.185.18.36&lt;br /&gt;
38338     0.7325  firefox                  firefox                  /usr/lib/firefox-3.5.9/firefox&lt;br /&gt;
35118     0.6710  [vdso] (tgid:2583 range:0x7fffe1fff000-0x7fffe2000000) kwin [vdso] (tgid:2583 range:0x7fffe1fff000-0x7fffe2000000)&lt;br /&gt;
33020     0.6309  libc-2.10.1.so           doom.x86                 memset&lt;br /&gt;
30151     0.5761  gamex86.so               doom.x86                 idGameLocal::AnalyzeRenderImage(CRenderPipe*, float*)&lt;br /&gt;
27437     0.5242  no-vmlinux               no-vmlinux               /no-vmlinux&lt;br /&gt;
26936     0.5146  libasound.so.2.0.0       doom.x86                 /usr/lib32/libasound.so.2.0.0&lt;br /&gt;
23572     0.4504  libQtCore.so.4.5.2       kwin                     /usr/lib/libQtCore.so.4.5.2&lt;br /&gt;
23031     0.4400  Xorg                     Xorg                     /usr/bin/Xorg&lt;br /&gt;
21347     0.4079  libQtGui.so.4.5.2        kdeinit4                 /usr/lib/libQtGui.so.4.5.2&lt;br /&gt;
20301     0.3879  oprofiled                oprofiled                /usr/bin/oprofiled&lt;br /&gt;
19825     0.3788  gamex86.so               doom.x86                 idInterpreter::Execute()&lt;br /&gt;
19785     0.3780  libGL.so.185.18.36       doom.x86                 /usr/lib32/libGL.so.185.18.36&lt;br /&gt;
19583     0.3742  gamex86.so               doom.x86                 idGameLocal::ProcessStimResponse(unsigned long)&lt;br /&gt;
18508     0.3536  nvidia_drv.so            Xorg                     /usr/lib/xorg/modules/drivers/nvidia_drv.so&lt;br /&gt;
13580     0.2595  gamex86.so               doom.x86                 idGameLocal::RunFrame(usercmd_t const*)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Using opcontrol manually =====&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;opcontrol&#039;&#039;&#039; utility can be used to toggle the profiling on and off during runtime. Just start it, start TDM normally and after loading a mission, toggle back to a text-mode console with {{CTRL}}+{{ALT}}+{{F2}}, use:&lt;br /&gt;
&lt;br /&gt;
 opcontrol --init&lt;br /&gt;
 opcontrol --start&lt;br /&gt;
 opcontrol --reset&lt;br /&gt;
&lt;br /&gt;
to start profiling, switch back to the desktop ({{CTRL}}+{{ALT}}+{{F7}}), then wait a bit, then turn profiling off again.&lt;br /&gt;
&lt;br /&gt;
 opcontrol --dump&lt;br /&gt;
 opcontrol --stop&lt;br /&gt;
 opreport --symbols --demangle=smart &amp;gt;tdm_profile_report.txt&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Sample output:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
After ack:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
samples  %        image name   app name   symbol name&lt;br /&gt;
&lt;br /&gt;
67453     2.4265  gamex86.so   doom.x86   CImage::LoadImage(CRenderPipe*)&lt;br /&gt;
42819     1.5403  gamex86.so   doom.x86   iReadLump&lt;br /&gt;
31089     1.1184  gamex86.so   doom.x86   idClip::ClipModelsTouchingBounds_r(clipSector_s const*, listParms_s&amp;amp;) const&lt;br /&gt;
16156     0.5812  gamex86.so   doom.x86   idGameLocal::AnalyzeRenderImage(CRenderPipe*, float*)&lt;br /&gt;
10535     0.3790  gamex86.so   doom.x86   idInterpreter::Execute()&lt;br /&gt;
10438     0.3755  gamex86.so   doom.x86   idGameLocal::ProcessStimResponse(unsigned long)&lt;br /&gt;
7241      0.2605  gamex86.so   doom.x86   idMD5Anim::GetInterpolatedFrame(frameBlend_t&amp;amp;, idJointQuat*, int const*, int) const&lt;br /&gt;
7134      0.2566  gamex86.so   doom.x86   idGameLocal::RunFrame(usercmd_t const*)&lt;br /&gt;
6680      0.2403  gamex86.so   doom.x86   idMoveable::Think()&lt;br /&gt;
5641      0.2029  gamex86.so   doom.x86   idClipModel::Link_r(clipSector_s*)&lt;br /&gt;
5133      0.1846  gamex86.so   doom.x86   idAnimator::CreateFrame(int, bool)&lt;br /&gt;
4836      0.1740  gamex86.so   doom.x86   darkModLAS::updateLASState()&lt;br /&gt;
4725      0.1700  gamex86.so   doom.x86   idQuat::Slerp(idQuat const&amp;amp;, idQuat const&amp;amp;, float)&lt;br /&gt;
4719      0.1698  gamex86.so   doom.x86   idEntity::RunPhysics()&lt;br /&gt;
4501      0.1619  gamex86.so   doom.x86   __i686.get_pc_thunk.bx&lt;br /&gt;
4365      0.1570  gamex86.so   doom.x86   idSIMD_Generic::TransformJoints(idJointMat*, int const*, int, int)&lt;br /&gt;
4265      0.1534  gamex86.so   doom.x86   idEntity::Present()&lt;br /&gt;
3844      0.1383  gamex86.so   doom.x86   idStr::Icmp(char const*, char const*)&lt;br /&gt;
3755      0.1351  gamex86.so   doom.x86   idAF::ChangePose(idEntity*, int)&lt;br /&gt;
3663      0.1318  gamex86.so   doom.x86   idAnim::Name() const&lt;br /&gt;
3540      0.1273  gamex86.so   doom.x86   idQuat::ToMat3() const&lt;br /&gt;
2953      0.1062  gamex86.so   doom.x86   idInterpreter::CallEvent(function_t const*, int)&lt;br /&gt;
2755      0.0991  gamex86.so   doom.x86   idEntity::Think()&lt;br /&gt;
2562      0.0922  gamex86.so   doom.x86   idPhysics_RigidBody::SaveState()&lt;br /&gt;
2440      0.0878  gamex86.so   doom.x86   idDict::FindKey(char const*) const&lt;br /&gt;
2429      0.0874  gamex86.so   doom.x86   idIK_Walk::Evaluate()&lt;br /&gt;
2302      0.0828  gamex86.so   doom.x86   idAnimator::SetJointAxis(jointHandle_t, jointModTransform_t, idMat3 const&amp;amp;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Tips ====&lt;br /&gt;
&lt;br /&gt;
Use [http://search.cpan.org/~petdance/ack/ ack] (or grep) on the tdm_profile_report.txt to filter out anything not mentioning gamex86.so, this reduces the clutter:&lt;br /&gt;
&lt;br /&gt;
 ack gamex86.so tdm_profile_report.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== g_frametime ==&lt;br /&gt;
&lt;br /&gt;
Set this [[CVAR]] to 1, and the code will emit how many milliseconds it took to do all the calculations for one frame, minus the render time. The output on the console will be something like this:&lt;br /&gt;
&lt;br /&gt;
 game 28080: all:0.2 th:0.2 ev:0.0 28 ents&lt;br /&gt;
&lt;br /&gt;
The numbers are:&lt;br /&gt;
&lt;br /&gt;
* game: The current frame time (always increasing from map start)&lt;br /&gt;
* all: The complete time to think + event handling&lt;br /&gt;
* th: The thinking time (without event handling)&lt;br /&gt;
* ev: The event handling time&lt;br /&gt;
* ents: The number of entities that did thinking&lt;br /&gt;
&lt;br /&gt;
== g_timeentities ==&lt;br /&gt;
&lt;br /&gt;
When set to &amp;gt; 0, shows entities whose &amp;lt;tt&amp;gt;Think()&amp;lt;/tt&amp;gt; functions exceeded the number of milliseconds specified. Set it for instance to 2, and all entities that think longer than 2ms will be shown on the console.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Coding in the SDK]]&lt;br /&gt;
&lt;br /&gt;
{{coding}}&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=Reporting_Problem&amp;diff=30992</id>
		<title>Reporting Problem</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=Reporting_Problem&amp;diff=30992"/>
		<updated>2024-01-29T19:14:44Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: Added some new ways to get viewpos coordinates.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;If TDM does not work properly for you, the best thing to do would be to report the problem.&lt;br /&gt;
&lt;br /&gt;
You are welcome to post in Tech Support section of the [[The_Dark_Mod#Dark_Mod_Forums|forums]], even if you suspect the problem is with your machine or you want to get some help/clarifications.&lt;br /&gt;
When there is clearly a problem with TDM itself, an issue is usually created in the [[The_Dark_Mod#Bugtracker|bugtracker]].&lt;br /&gt;
But since the bugtracker is a rather technical place, it is more advised to report problems in the forum.&lt;br /&gt;
Sooner or later someone will create the issue anyway if it is really needed.&lt;br /&gt;
&lt;br /&gt;
This article describes some general information typically requested from everyone who reports a problem.&lt;br /&gt;
&lt;br /&gt;
== Baseline ==&lt;br /&gt;
&lt;br /&gt;
This pieces of information are almost mandatory:&lt;br /&gt;
&lt;br /&gt;
# Contents of &amp;lt;tt&amp;gt;darkmod.cfg&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Contents of game console at some moment (known as &amp;quot;condump&amp;quot;).&lt;br /&gt;
# In case of graphical issue, a screenshot showing the problem is often needed.&lt;br /&gt;
&lt;br /&gt;
You can omit this information when writing a post on the forums: maybe your issue is trivial and someone will quickly explain what&#039;s wrong.&lt;br /&gt;
If it is not obvious, then you will soon be asked for it anyway =)&lt;br /&gt;
&lt;br /&gt;
However, when creating an issue on the bugtracker, it is highly desirable to include all of these things, as well as the steps to reproduce.&lt;br /&gt;
&lt;br /&gt;
=== darkmod.cfg ===&lt;br /&gt;
&lt;br /&gt;
The file named &amp;lt;tt&amp;gt;darkmod.cfg&amp;lt;/tt&amp;gt; should be located in the root directory of TDM installation.&lt;br /&gt;
If in doubt, you can locate this directory by checking what executable is run when you start the game: it is in the same directory.&lt;br /&gt;
Let&#039;s assume for the rest of the article that root directory is &amp;lt;tt&amp;gt;C:\games\thedarkmod&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This file stores the values of all switches and tweaks that player can change.&lt;br /&gt;
The game may work in completely different ways depending on these values, thus they are very important for reproducing the problem.&lt;br /&gt;
&lt;br /&gt;
When reporting the problem on forums, you can do one of:&lt;br /&gt;
* Attach it to a forum post. In this case rename it to something like &amp;lt;tt&amp;gt;darkmod_cfg.txt&amp;lt;/tt&amp;gt;, the forum forbids anything except txt files.&lt;br /&gt;
* Copy/paste the full contents of the file into the post. In this case, please wrap it into &amp;quot;spoiler&amp;quot; tag, so that readers don&#039;t have to always scroll across the 5 pages of it.&lt;br /&gt;
&lt;br /&gt;
When reporting on bugtracker, just attach the &amp;lt;tt&amp;gt;darkmod.cfg&amp;lt;/tt&amp;gt; file to the issue.&lt;br /&gt;
&lt;br /&gt;
=== condump ===&lt;br /&gt;
&lt;br /&gt;
The term &amp;quot;condump&amp;quot; means all the text written to the game console.&lt;br /&gt;
You can usually open game console by pressing either Tilde(~) key or Ctrl+Alt+Tilde combo.&lt;br /&gt;
&lt;br /&gt;
There are two ways to save the contents of game console into a file:&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;1) condump.&#039;&#039;&#039; Open game console, type the following and hit Enter: &amp;lt;tt&amp;gt;condump unwrap my_nasty_issue&amp;lt;/tt&amp;gt;&lt;br /&gt;
:Then find file named &amp;lt;tt&amp;gt;my_nasty_issue.txt&amp;lt;/tt&amp;gt; in &amp;lt;tt&amp;gt;C:\games\thedarkmod&amp;lt;/tt&amp;gt; (root TDM directory).&lt;br /&gt;
:Note: execute the command soon after the issue manifests itself.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;2) logfile.&#039;&#039;&#039; Open file &amp;lt;tt&amp;gt;darkmod.cfg&amp;lt;/tt&amp;gt; in text editor.&lt;br /&gt;
:Find or create new line containing: &amp;lt;tt&amp;gt;seta logFile &amp;quot;?&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
:Instead of the question mark, set digit 2 if you experience a crash. Otherwise digit 1 is also OK.&lt;br /&gt;
:Save the file, start TDM and reproduce the issue.&lt;br /&gt;
:Now find the file named &amp;lt;tt&amp;gt;qconsole.log&amp;lt;/tt&amp;gt; in the directory of the currently installed FM, for instance in &amp;lt;tt&amp;gt;C:\games\thedarkmod\fms\newjob&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The first approach is better, but it is useless if TDM crashes or you cannot even get into game console.&lt;br /&gt;
In any of these cases, use the second approach.&lt;br /&gt;
&lt;br /&gt;
When you have got the file, add it to your report just as you did with &amp;lt;tt&amp;gt;darkmod.cfg&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Screenshot ===&lt;br /&gt;
&lt;br /&gt;
If something looks wrong for you, posting screenshot is a good thing to do.&lt;br /&gt;
Otherwise, the guy who tries to reproduce your issue and fails will have hard time guessing if he sees the same picture as you.&lt;br /&gt;
You can of course try to explain what you see with words, but it is vague and subjective.&lt;br /&gt;
&lt;br /&gt;
There are two ways to get a screenshot:&lt;br /&gt;
# Press a key in-game (F12 by default). Then find the screenshot in &amp;lt;tt&amp;gt;C:\games\thedarkmod\screenshots&amp;lt;/tt&amp;gt;&lt;br /&gt;
# Ensure that you run game in Windowed mode. Press Print-Screen key to copy screen to clipboard. Start Paint and paste (Ctrl+V) it there. Trim the TDM window in it and save.&lt;br /&gt;
The first approach is preferred, but sometimes it fails to capture the glitch.&lt;br /&gt;
&lt;br /&gt;
When you want to share a picture on the forums, you can do one of:&lt;br /&gt;
* Add it as attachment to your forum post.&lt;br /&gt;
* Upload it to some free image hosting, and insert a link to it (click on Image icon) into the post. Surround the link/picture in spoiler tag (unless it is low-resolution) !&lt;br /&gt;
&lt;br /&gt;
When reporting on bugtracker, simply attach the file to the issue and mention it somewhere in the text.&lt;br /&gt;
&lt;br /&gt;
=== Coordinates ===&lt;br /&gt;
&lt;br /&gt;
Typically, a problem happens in-game on at least one of the released fan missions. In such case, please write the name of the FM and the world coordinates where the problem happens.&lt;br /&gt;
&lt;br /&gt;
In order to find world coordinates, execute &amp;lt;tt&amp;gt;getviewpos&amp;lt;/tt&amp;gt; in the game console.&lt;br /&gt;
The coordinates will be printed in response: the first three are the coordinates, and the last three are the viewing angles. Copy them all to your report.&lt;br /&gt;
Since you cannot copy text directly from the game console, use [[Reporting Problem#condump|one of the methods described above to get a condump]].&lt;br /&gt;
In fact, it is a good idea to run &amp;lt;tt&amp;gt;getviewpos&amp;lt;/tt&amp;gt; just before creating a condump.&lt;br /&gt;
By the way, you can execute &amp;lt;tt&amp;gt;setviewpos&amp;lt;/tt&amp;gt; with these six arguments to teleport yourself to this specific location, e.g. to ensure that you have copied coords correctly.&lt;br /&gt;
&lt;br /&gt;
Alternatively, you can set &amp;lt;tt&amp;gt;tdm_show_viewpos 1&amp;lt;/tt&amp;gt; to display current coordinates on screen, so that they can be captured in screenshot.&lt;br /&gt;
Or you can call command &amp;lt;tt&amp;gt;screenshot_viewpos&amp;lt;/tt&amp;gt; to make a special screenshot with coordinates visible on it.&lt;br /&gt;
&lt;br /&gt;
== Advanced ==&lt;br /&gt;
&lt;br /&gt;
Here are few more advanced tricks which may help debugging issues.&lt;br /&gt;
&lt;br /&gt;
=== Crashdump ===&lt;br /&gt;
&lt;br /&gt;
When TDM crashes, you can record a &amp;quot;memory dump&amp;quot; or &amp;quot;crash dump&amp;quot; of it.&lt;br /&gt;
It often contains information invaluable for coders, but it is only useful for debugging crashes.&lt;br /&gt;
&lt;br /&gt;
The article [[Save a Memory Dump for debugging Crashes]] explains in detail how to record it.&lt;br /&gt;
&lt;br /&gt;
=== Video ===&lt;br /&gt;
&lt;br /&gt;
Some graphical issues are very obvious in dynamics, but when you take a still screenshot, it does not capture the tragedy well enough.&lt;br /&gt;
&lt;br /&gt;
In such case you can record a video of the problem.&lt;br /&gt;
[https://obsproject.com/ Open Broadcast Software] is a free program which can easily record a high-quality and high-FPS game footage.&lt;br /&gt;
The program is quite complicated, but the main thing you need is to add a &amp;quot;source&amp;quot;: either &amp;quot;Game Capture&amp;quot;, or &amp;quot;Window Capture&amp;quot;, or &amp;quot;Screen Capture&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
When you have a video, you can either upload it to video hosting (like YouTube) and post a link, or upload it to cloud storage (like Google Drive) and post a shared link.&lt;br /&gt;
If you copy/paste a link to YouTube video into a forum post, the forum will show embedded player automatically.&lt;br /&gt;
&lt;br /&gt;
=== Installation state ===&lt;br /&gt;
&lt;br /&gt;
Sometimes there is a chance that your TDM installation is corrupt.&lt;br /&gt;
In such case it is great to give people a brief overview of it.&amp;lt;br&amp;gt;&lt;br /&gt;
Like generating a filelist of the gamefolder.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
To create a filelisting of the TDM gamefolder, in windows 10&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Open file explorer, navigate to the tdm gamefolder. &lt;br /&gt;
# click &amp;quot;file&amp;quot; (menu) &amp;gt; &amp;quot;open in powershell&amp;quot; and a blue window will appear.&lt;br /&gt;
# Fill in the following command line in that window and hit the enter-key: dir /s &amp;gt; mytmdfolderandfiles.txt&amp;lt;br&amp;gt;This command generate a textfile in your gamefolder.&lt;br /&gt;
# the content of this file mytmdfolderandfiles.txt you can give to people for research. &lt;br /&gt;
After this, just run the TDM installer to download the original files.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;: write some simple way to get good textual representation of TDM installation directory.&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=Console_Useful_Controls&amp;diff=30991</id>
		<title>Console Useful Controls</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=Console_Useful_Controls&amp;diff=30991"/>
		<updated>2024-01-29T19:10:19Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: r_showSurfaceInfo added&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
This is a list of common console commands and cvars that are of use to Dark Mod mappers and developers for testing etc. It is in order of key words and meaning. The console can be called by hitting &amp;quot;{{key|CTRL}}+{{key|ALT}}+{{key|~}}&amp;quot; (&amp;quot;{{key|CTRL}}+{{key|ALT}}+{{key|Key left of number 1}}&amp;quot; in general, e.g. &amp;quot;{{key|CTRL}}+{{key|ALT}}+{{key|^}}&amp;quot; on a German keyboard).&lt;br /&gt;
&lt;br /&gt;
This will open the console to cover the upper 50% of the screen. To cover more (80%), also hold down the {{key|SHIFT}} key.&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
* Where a cvar or command is followed by a 1 (parameter) it can be taken that it is enabled by 1 and disabled by 0 unless otherwise stated. &#039;&#039;&#039;N&#039;&#039;&#039; indicates a range of values.&lt;br /&gt;
* The current value of a cvar can be shown by entering its name without a value.&lt;br /&gt;
* Parameters can be toggled between values by preceding the control with &#039;toggle&#039; and following it with eg, 1 0. Example : toggle r_showtris 3 0&lt;br /&gt;
* Controls can be bound to keys to be used in-game, including the toggle command, eg, &amp;lt;tt&amp;gt;bind &amp;quot;v&amp;quot; &amp;quot;toggle r_showportals 1 0&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Many controls can be included in the file &#039;&#039;&#039;Doomconfig.cfg&#039;&#039;&#039; in the darkmod folder so they are automatically effective.&lt;br /&gt;
* Some controls are disabled on exit from a map; others are permanent until manually changed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot; border=1 style=&amp;quot;border-color: grey; border-collapse: collapse; font-size: 92%; margin-left: 1em&amp;quot; cellspacing=0 cellpadding=3&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!bgcolor=#ffdead|Command&lt;br /&gt;
!bgcolor=#ffdead|Description&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|noclip&lt;br /&gt;
|Player flies through everything.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|notarget&lt;br /&gt;
|AI will not know the player is there.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|invisible&lt;br /&gt;
|AI will not see the player, but can still hear him.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|inaudible&lt;br /&gt;
|AI will not hear the player, but can still see him.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|god&lt;br /&gt;
|Player cannot be harmed.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|killmonsters&lt;br /&gt;
|Removes all AI from a map.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|tdm_open_doors&lt;br /&gt;
|Opens all doors on map: even locked and unpickable ones!&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|tdm_close_doors&lt;br /&gt;
|Closes all doors on map&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|tdm_show_loot&lt;br /&gt;
|Shows loot items through walls for a short time.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|tdm_show_keys&lt;br /&gt;
|Shows keys through walls for a short time.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|g_dragentity 1&lt;br /&gt;
|Aim at entity and hold attack control then pull back.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|pm_noclipspeed N&lt;br /&gt;
|Changes the speed of player noclip movement.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|g_fov N&lt;br /&gt;
|N=angle of field of view, eg, &#039;&#039;&#039;&amp;lt;code&amp;gt;g_fov 30&amp;lt;/code&amp;gt;&#039;&#039;&#039; = zoom in to restrict field of view to 30 degrees. Default = 90.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|g_showEntityInfo 1&lt;br /&gt;
|Show info about near entities (as box with classname).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|com_showfps 1&lt;br /&gt;
|Show fps to test performance.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|com_numQuickSaves N&lt;br /&gt;
|How many quicksaves to retain. Reducing the number won&#039;t delete any that you already have.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|g_frametime 1&lt;br /&gt;
|Timing info for each frame, see [[Profiling#g_frametime|Profiling]].&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|r_showPrimitives 1&lt;br /&gt;
|Show info about number of [[drawcalls]] and tris/shadow tris rendered.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|con_noprint 0&lt;br /&gt;
|Prints console messages to the screen as an overlay.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|r_showSurfaceInfo 1&lt;br /&gt;
|Show info about closest rendered surface under crosshair: model name, index of surface in model, material name&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|r_showskel 1&lt;br /&gt;
|Shows skeleton in-game with joint names.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|g_showCollisionModels 1&lt;br /&gt;
|Shows collision models. Use &#039;&#039;&#039;g_maxShowDistance N&#039;&#039;&#039; to increase the distance where they are shown to.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|r_showtris N&lt;br /&gt;
|(1) Shows triangles being rendered directly.&amp;lt;br&amp;gt;(2) Shows overdrawn tri&#039;s.&amp;lt;br&amp;gt;(3) Shows all tri&#039;s in scene, direct and indirect.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|r_showportals N&lt;br /&gt;
|(1) Shows all portals in scene (red=closed, green=open). If your portals don&#039;t show up they are most likely not sealing. Yellow indicates a portal that is effectively closed but which connects to a visleaf visible through another portal.&lt;br /&gt;
(2) Also prints area numbers, mainly where player&#039;s eye is right now.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|r_showlightcount 1&lt;br /&gt;
|Using colours, shows the number of lights hitting a surface, black = 0, red = 1, blue = 2... etc.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|seta tdm_showsprop 1&lt;br /&gt;
|Shows the volume of sounds heard by AI.  &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|tdm_ai_showbark 1&lt;br /&gt;
|Gives the def name (not the soundshader) of barks used by AI.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|tdm_ai_showalert 1&lt;br /&gt;
|Shows the AI&#039;s current alert total and alert state.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|tdm_ai_showdest 1&lt;br /&gt;
|Shows the AI&#039;s current path destination.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|bind &amp;quot;f1&amp;quot; &amp;quot;_impulse27&amp;quot; &lt;br /&gt;
|Pressing F1 shows the AAS regions.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|timescale 2&lt;br /&gt;
|Double speed, good for testing pathing, 1 = normal speed, 2 = double, 0.5 = half speed. To have an effect, the &amp;quot;Uncapped FPS&amp;quot; setting must be Off.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|g_timeModifier 2&lt;br /&gt;
|Same as timescale 2 but somewhat different&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|g_stopTime 1&lt;br /&gt;
|Stops gameplay time, but player can move normally.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|teleport &amp;quot;entity name&amp;quot;&lt;br /&gt;
|teleports the player to the named entity&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|teleportArea N&lt;br /&gt;
|teleports the player into the area with number N&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|getviewpos&lt;br /&gt;
|get player&#039;s position and orientation [[Reporting_Problem#Coordinates|coordinates]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|setviewpos X Y Z [P Y R]&lt;br /&gt;
|teleports the player to the coordinates and optionally sets camera orientation.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Spawning entities ==&lt;br /&gt;
&lt;br /&gt;
Spawns entity in front of the player. Look up if entity gets spawned under the floor. &lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot; border=1 style=&amp;quot;border-color: grey; border-collapse: collapse; font-size: 92%; margin-left: 1em&amp;quot; cellspacing=0 cellpadding=3&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!bgcolor=#ffdead|Command&lt;br /&gt;
!bgcolor=#ffdead|Description&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:weapon_blackjack&lt;br /&gt;
|Spawns blackjack.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:weapon_shortsword&lt;br /&gt;
|Spawns a sword.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_broadhead&lt;br /&gt;
|Spawns one arrow.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_broadhead inv_ammo_amount 50&lt;br /&gt;
|Spawns 50 arrows (one entity with 50 ammo). Similar technique can be used for other ammo types.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_firearrow&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_gasarrow&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_mossarrow&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_noisemaker&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_ropearrow&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_waterarrow&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
With the TDM console you can press tab after typing something to autocomplete. For example &amp;lt;tt&amp;gt;spawn atdm:&amp;lt;tab&amp;gt;&amp;lt;/tt&amp;gt; will cycle through the various spawnables. You can also add additional spawnargs using the following syntax: &amp;lt;tt&amp;gt;spawn classname [key value] [key value] ...&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Diagnostic information ==&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot; border=1 style=&amp;quot;border-color: grey; border-collapse: collapse; font-size: 92%; margin-left: 1em&amp;quot; cellspacing=0 cellpadding=3&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!bgcolor=#ffdead|Command&lt;br /&gt;
!bgcolor=#ffdead|Description&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|listEntities&lt;br /&gt;
|lists all current entities followed by a count.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|listEntities GLOB&lt;br /&gt;
|lists all alive entities whose names match given glob/wildcard (e.g. use asterisks like &amp;lt;tt&amp;gt;*func_static*&amp;lt;/tt&amp;gt; to search for substring).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|countEntities&lt;br /&gt;
|displays a count of entities by class. &#039;&#039;TDM 2.03+&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|listCvars GLOB&lt;br /&gt;
|lists all cvars matching the given glob/wildcard (no argument = lists everything).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|listCmds GLOB&lt;br /&gt;
|lists all console commands matching the given glob/wildcard (no argument = lists everything).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|condump [unwrap] &#039;&#039;filename.txt&#039;&#039;&lt;br /&gt;
|Writes the text content of the console to text file &#039;&#039;filename.txt&#039;&#039; (you can use any file name). If optional keyword &#039;&#039;unwrap&#039;&#039; is used, full lines from the console will be stitched together with the following line. Useful when exporting long file paths from the console, that have been broken up by its width limit. &#039;&#039;TDM 2.03+&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
&lt;br /&gt;
[[Cvars in The Dark Mod]]&lt;br /&gt;
&lt;br /&gt;
{{editing}}&lt;br /&gt;
&lt;br /&gt;
[[Category:CVARS]]&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=Console_Useful_Controls&amp;diff=30990</id>
		<title>Console Useful Controls</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=Console_Useful_Controls&amp;diff=30990"/>
		<updated>2024-01-29T19:02:22Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: /* Diagnostic information */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
This is a list of common console commands and cvars that are of use to Dark Mod mappers and developers for testing etc. It is in order of key words and meaning. The console can be called by hitting &amp;quot;{{key|CTRL}}+{{key|ALT}}+{{key|~}}&amp;quot; (&amp;quot;{{key|CTRL}}+{{key|ALT}}+{{key|Key left of number 1}}&amp;quot; in general, e.g. &amp;quot;{{key|CTRL}}+{{key|ALT}}+{{key|^}}&amp;quot; on a German keyboard).&lt;br /&gt;
&lt;br /&gt;
This will open the console to cover the upper 50% of the screen. To cover more (80%), also hold down the {{key|SHIFT}} key.&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
* Where a cvar or command is followed by a 1 (parameter) it can be taken that it is enabled by 1 and disabled by 0 unless otherwise stated. &#039;&#039;&#039;N&#039;&#039;&#039; indicates a range of values.&lt;br /&gt;
* The current value of a cvar can be shown by entering its name without a value.&lt;br /&gt;
* Parameters can be toggled between values by preceding the control with &#039;toggle&#039; and following it with eg, 1 0. Example : toggle r_showtris 3 0&lt;br /&gt;
* Controls can be bound to keys to be used in-game, including the toggle command, eg, &amp;lt;tt&amp;gt;bind &amp;quot;v&amp;quot; &amp;quot;toggle r_showportals 1 0&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Many controls can be included in the file &#039;&#039;&#039;Doomconfig.cfg&#039;&#039;&#039; in the darkmod folder so they are automatically effective.&lt;br /&gt;
* Some controls are disabled on exit from a map; others are permanent until manually changed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot; border=1 style=&amp;quot;border-color: grey; border-collapse: collapse; font-size: 92%; margin-left: 1em&amp;quot; cellspacing=0 cellpadding=3&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!bgcolor=#ffdead|Command&lt;br /&gt;
!bgcolor=#ffdead|Description&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|noclip&lt;br /&gt;
|Player flies through everything.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|notarget&lt;br /&gt;
|AI will not know the player is there.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|invisible&lt;br /&gt;
|AI will not see the player, but can still hear him.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|inaudible&lt;br /&gt;
|AI will not hear the player, but can still see him.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|god&lt;br /&gt;
|Player cannot be harmed.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|killmonsters&lt;br /&gt;
|Removes all AI from a map.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|tdm_open_doors&lt;br /&gt;
|Opens all doors on map: even locked and unpickable ones!&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|tdm_close_doors&lt;br /&gt;
|Closes all doors on map&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|tdm_show_loot&lt;br /&gt;
|Shows loot items through walls for a short time.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|tdm_show_keys&lt;br /&gt;
|Shows keys through walls for a short time.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|g_dragentity 1&lt;br /&gt;
|Aim at entity and hold attack control then pull back.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|pm_noclipspeed N&lt;br /&gt;
|Changes the speed of player noclip movement.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|g_fov N&lt;br /&gt;
|N=angle of field of view, eg, &#039;&#039;&#039;&amp;lt;code&amp;gt;g_fov 30&amp;lt;/code&amp;gt;&#039;&#039;&#039; = zoom in to restrict field of view to 30 degrees. Default = 90.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|g_showEntityInfo 1&lt;br /&gt;
|Show info about near entities (as box with classname).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|com_showfps 1&lt;br /&gt;
|Show fps to test performance.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|com_numQuickSaves N&lt;br /&gt;
|How many quicksaves to retain. Reducing the number won&#039;t delete any that you already have.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|g_frametime 1&lt;br /&gt;
|Timing info for each frame, see [[Profiling#g_frametime|Profiling]].&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|r_showPrimitives 1&lt;br /&gt;
|Show info about number of [[drawcalls]] and tris/shadow tris rendered.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|con_noprint 0&lt;br /&gt;
|Prints console messages to the screen as an overlay.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|r_showskel 1&lt;br /&gt;
|Shows skeleton in-game with joint names.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|g_showCollisionModels 1&lt;br /&gt;
|Shows collision models. Use &#039;&#039;&#039;g_maxShowDistance N&#039;&#039;&#039; to increase the distance where they are shown to.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|r_showtris N&lt;br /&gt;
|(1) Shows triangles being rendered directly.&amp;lt;br&amp;gt;(2) Shows overdrawn tri&#039;s.&amp;lt;br&amp;gt;(3) Shows all tri&#039;s in scene, direct and indirect.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|r_showportals N&lt;br /&gt;
|(1) Shows all portals in scene (red=closed, green=open). If your portals don&#039;t show up they are most likely not sealing. Yellow indicates a portal that is effectively closed but which connects to a visleaf visible through another portal.&lt;br /&gt;
(2) Also prints area numbers, mainly where player&#039;s eye is right now.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|r_showlightcount 1&lt;br /&gt;
|Using colours, shows the number of lights hitting a surface, black = 0, red = 1, blue = 2... etc.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|seta tdm_showsprop 1&lt;br /&gt;
|Shows the volume of sounds heard by AI.  &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|tdm_ai_showbark 1&lt;br /&gt;
|Gives the def name (not the soundshader) of barks used by AI.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|tdm_ai_showalert 1&lt;br /&gt;
|Shows the AI&#039;s current alert total and alert state.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|tdm_ai_showdest 1&lt;br /&gt;
|Shows the AI&#039;s current path destination.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|bind &amp;quot;f1&amp;quot; &amp;quot;_impulse27&amp;quot; &lt;br /&gt;
|Pressing F1 shows the AAS regions.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|timescale 2&lt;br /&gt;
|Double speed, good for testing pathing, 1 = normal speed, 2 = double, 0.5 = half speed. To have an effect, the &amp;quot;Uncapped FPS&amp;quot; setting must be Off.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|g_timeModifier 2&lt;br /&gt;
|Same as timescale 2 but somewhat different&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|g_stopTime 1&lt;br /&gt;
|Stops gameplay time, but player can move normally.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|teleport &amp;quot;entity name&amp;quot;&lt;br /&gt;
|teleports the player to the named entity&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|teleportArea N&lt;br /&gt;
|teleports the player into the area with number N&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|getviewpos&lt;br /&gt;
|get player&#039;s position and orientation [[Reporting_Problem#Coordinates|coordinates]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|setviewpos X Y Z [P Y R]&lt;br /&gt;
|teleports the player to the coordinates and optionally sets camera orientation.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Spawning entities ==&lt;br /&gt;
&lt;br /&gt;
Spawns entity in front of the player. Look up if entity gets spawned under the floor. &lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot; border=1 style=&amp;quot;border-color: grey; border-collapse: collapse; font-size: 92%; margin-left: 1em&amp;quot; cellspacing=0 cellpadding=3&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!bgcolor=#ffdead|Command&lt;br /&gt;
!bgcolor=#ffdead|Description&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:weapon_blackjack&lt;br /&gt;
|Spawns blackjack.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:weapon_shortsword&lt;br /&gt;
|Spawns a sword.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_broadhead&lt;br /&gt;
|Spawns one arrow.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_broadhead inv_ammo_amount 50&lt;br /&gt;
|Spawns 50 arrows (one entity with 50 ammo). Similar technique can be used for other ammo types.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_firearrow&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_gasarrow&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_mossarrow&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_noisemaker&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_ropearrow&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_waterarrow&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
With the TDM console you can press tab after typing something to autocomplete. For example &amp;lt;tt&amp;gt;spawn atdm:&amp;lt;tab&amp;gt;&amp;lt;/tt&amp;gt; will cycle through the various spawnables. You can also add additional spawnargs using the following syntax: &amp;lt;tt&amp;gt;spawn classname [key value] [key value] ...&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Diagnostic information ==&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot; border=1 style=&amp;quot;border-color: grey; border-collapse: collapse; font-size: 92%; margin-left: 1em&amp;quot; cellspacing=0 cellpadding=3&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!bgcolor=#ffdead|Command&lt;br /&gt;
!bgcolor=#ffdead|Description&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|listEntities&lt;br /&gt;
|lists all current entities followed by a count.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|listEntities GLOB&lt;br /&gt;
|lists all alive entities whose names match given glob/wildcard (e.g. use asterisks like &amp;lt;tt&amp;gt;*func_static*&amp;lt;/tt&amp;gt; to search for substring).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|countEntities&lt;br /&gt;
|displays a count of entities by class. &#039;&#039;TDM 2.03+&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|listCvars GLOB&lt;br /&gt;
|lists all cvars matching the given glob/wildcard (no argument = lists everything).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|listCmds GLOB&lt;br /&gt;
|lists all console commands matching the given glob/wildcard (no argument = lists everything).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|condump [unwrap] &#039;&#039;filename.txt&#039;&#039;&lt;br /&gt;
|Writes the text content of the console to text file &#039;&#039;filename.txt&#039;&#039; (you can use any file name). If optional keyword &#039;&#039;unwrap&#039;&#039; is used, full lines from the console will be stitched together with the following line. Useful when exporting long file paths from the console, that have been broken up by its width limit. &#039;&#039;TDM 2.03+&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
&lt;br /&gt;
[[Cvars in The Dark Mod]]&lt;br /&gt;
&lt;br /&gt;
{{editing}}&lt;br /&gt;
&lt;br /&gt;
[[Category:CVARS]]&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=Console_Useful_Controls&amp;diff=30989</id>
		<title>Console Useful Controls</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=Console_Useful_Controls&amp;diff=30989"/>
		<updated>2024-01-29T19:01:45Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: listCvars and listCmds are important: they allow finding other cvars/cmds =)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
This is a list of common console commands and cvars that are of use to Dark Mod mappers and developers for testing etc. It is in order of key words and meaning. The console can be called by hitting &amp;quot;{{key|CTRL}}+{{key|ALT}}+{{key|~}}&amp;quot; (&amp;quot;{{key|CTRL}}+{{key|ALT}}+{{key|Key left of number 1}}&amp;quot; in general, e.g. &amp;quot;{{key|CTRL}}+{{key|ALT}}+{{key|^}}&amp;quot; on a German keyboard).&lt;br /&gt;
&lt;br /&gt;
This will open the console to cover the upper 50% of the screen. To cover more (80%), also hold down the {{key|SHIFT}} key.&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
* Where a cvar or command is followed by a 1 (parameter) it can be taken that it is enabled by 1 and disabled by 0 unless otherwise stated. &#039;&#039;&#039;N&#039;&#039;&#039; indicates a range of values.&lt;br /&gt;
* The current value of a cvar can be shown by entering its name without a value.&lt;br /&gt;
* Parameters can be toggled between values by preceding the control with &#039;toggle&#039; and following it with eg, 1 0. Example : toggle r_showtris 3 0&lt;br /&gt;
* Controls can be bound to keys to be used in-game, including the toggle command, eg, &amp;lt;tt&amp;gt;bind &amp;quot;v&amp;quot; &amp;quot;toggle r_showportals 1 0&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Many controls can be included in the file &#039;&#039;&#039;Doomconfig.cfg&#039;&#039;&#039; in the darkmod folder so they are automatically effective.&lt;br /&gt;
* Some controls are disabled on exit from a map; others are permanent until manually changed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot; border=1 style=&amp;quot;border-color: grey; border-collapse: collapse; font-size: 92%; margin-left: 1em&amp;quot; cellspacing=0 cellpadding=3&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!bgcolor=#ffdead|Command&lt;br /&gt;
!bgcolor=#ffdead|Description&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|noclip&lt;br /&gt;
|Player flies through everything.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|notarget&lt;br /&gt;
|AI will not know the player is there.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|invisible&lt;br /&gt;
|AI will not see the player, but can still hear him.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|inaudible&lt;br /&gt;
|AI will not hear the player, but can still see him.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|god&lt;br /&gt;
|Player cannot be harmed.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|killmonsters&lt;br /&gt;
|Removes all AI from a map.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|tdm_open_doors&lt;br /&gt;
|Opens all doors on map: even locked and unpickable ones!&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|tdm_close_doors&lt;br /&gt;
|Closes all doors on map&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|tdm_show_loot&lt;br /&gt;
|Shows loot items through walls for a short time.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|tdm_show_keys&lt;br /&gt;
|Shows keys through walls for a short time.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|g_dragentity 1&lt;br /&gt;
|Aim at entity and hold attack control then pull back.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|pm_noclipspeed N&lt;br /&gt;
|Changes the speed of player noclip movement.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|g_fov N&lt;br /&gt;
|N=angle of field of view, eg, &#039;&#039;&#039;&amp;lt;code&amp;gt;g_fov 30&amp;lt;/code&amp;gt;&#039;&#039;&#039; = zoom in to restrict field of view to 30 degrees. Default = 90.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|g_showEntityInfo 1&lt;br /&gt;
|Show info about near entities (as box with classname).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|com_showfps 1&lt;br /&gt;
|Show fps to test performance.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|com_numQuickSaves N&lt;br /&gt;
|How many quicksaves to retain. Reducing the number won&#039;t delete any that you already have.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|g_frametime 1&lt;br /&gt;
|Timing info for each frame, see [[Profiling#g_frametime|Profiling]].&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|r_showPrimitives 1&lt;br /&gt;
|Show info about number of [[drawcalls]] and tris/shadow tris rendered.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|con_noprint 0&lt;br /&gt;
|Prints console messages to the screen as an overlay.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|r_showskel 1&lt;br /&gt;
|Shows skeleton in-game with joint names.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|g_showCollisionModels 1&lt;br /&gt;
|Shows collision models. Use &#039;&#039;&#039;g_maxShowDistance N&#039;&#039;&#039; to increase the distance where they are shown to.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|r_showtris N&lt;br /&gt;
|(1) Shows triangles being rendered directly.&amp;lt;br&amp;gt;(2) Shows overdrawn tri&#039;s.&amp;lt;br&amp;gt;(3) Shows all tri&#039;s in scene, direct and indirect.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|r_showportals N&lt;br /&gt;
|(1) Shows all portals in scene (red=closed, green=open). If your portals don&#039;t show up they are most likely not sealing. Yellow indicates a portal that is effectively closed but which connects to a visleaf visible through another portal.&lt;br /&gt;
(2) Also prints area numbers, mainly where player&#039;s eye is right now.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|r_showlightcount 1&lt;br /&gt;
|Using colours, shows the number of lights hitting a surface, black = 0, red = 1, blue = 2... etc.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|seta tdm_showsprop 1&lt;br /&gt;
|Shows the volume of sounds heard by AI.  &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|tdm_ai_showbark 1&lt;br /&gt;
|Gives the def name (not the soundshader) of barks used by AI.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|tdm_ai_showalert 1&lt;br /&gt;
|Shows the AI&#039;s current alert total and alert state.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|tdm_ai_showdest 1&lt;br /&gt;
|Shows the AI&#039;s current path destination.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|bind &amp;quot;f1&amp;quot; &amp;quot;_impulse27&amp;quot; &lt;br /&gt;
|Pressing F1 shows the AAS regions.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|timescale 2&lt;br /&gt;
|Double speed, good for testing pathing, 1 = normal speed, 2 = double, 0.5 = half speed. To have an effect, the &amp;quot;Uncapped FPS&amp;quot; setting must be Off.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|g_timeModifier 2&lt;br /&gt;
|Same as timescale 2 but somewhat different&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|g_stopTime 1&lt;br /&gt;
|Stops gameplay time, but player can move normally.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|teleport &amp;quot;entity name&amp;quot;&lt;br /&gt;
|teleports the player to the named entity&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|teleportArea N&lt;br /&gt;
|teleports the player into the area with number N&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|getviewpos&lt;br /&gt;
|get player&#039;s position and orientation [[Reporting_Problem#Coordinates|coordinates]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|setviewpos X Y Z [P Y R]&lt;br /&gt;
|teleports the player to the coordinates and optionally sets camera orientation.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Spawning entities ==&lt;br /&gt;
&lt;br /&gt;
Spawns entity in front of the player. Look up if entity gets spawned under the floor. &lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot; border=1 style=&amp;quot;border-color: grey; border-collapse: collapse; font-size: 92%; margin-left: 1em&amp;quot; cellspacing=0 cellpadding=3&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!bgcolor=#ffdead|Command&lt;br /&gt;
!bgcolor=#ffdead|Description&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:weapon_blackjack&lt;br /&gt;
|Spawns blackjack.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:weapon_shortsword&lt;br /&gt;
|Spawns a sword.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_broadhead&lt;br /&gt;
|Spawns one arrow.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_broadhead inv_ammo_amount 50&lt;br /&gt;
|Spawns 50 arrows (one entity with 50 ammo). Similar technique can be used for other ammo types.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_firearrow&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_gasarrow&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_mossarrow&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_noisemaker&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_ropearrow&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_waterarrow&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
With the TDM console you can press tab after typing something to autocomplete. For example &amp;lt;tt&amp;gt;spawn atdm:&amp;lt;tab&amp;gt;&amp;lt;/tt&amp;gt; will cycle through the various spawnables. You can also add additional spawnargs using the following syntax: &amp;lt;tt&amp;gt;spawn classname [key value] [key value] ...&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Diagnostic information ==&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot; border=1 style=&amp;quot;border-color: grey; border-collapse: collapse; font-size: 92%; margin-left: 1em&amp;quot; cellspacing=0 cellpadding=3&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!bgcolor=#ffdead|Command&lt;br /&gt;
!bgcolor=#ffdead|Description&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|listCvars GLOB&lt;br /&gt;
|lists all cvars matching the given glob/wildcard (no argument = lists everything).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|listCmds GLOB&lt;br /&gt;
|lists all console commands matching the given glob/wildcard (no argument = lists everything).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|listEntities&lt;br /&gt;
|lists all current entities followed by a count.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|listEntities GLOB&lt;br /&gt;
|lists all alive entities whose names match given glob/wildcard (e.g. use asterisks like &amp;lt;tt&amp;gt;*func_static*&amp;lt;/tt&amp;gt; to search for substring).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|countEntities&lt;br /&gt;
|displays a count of entities by class. &#039;&#039;TDM 2.03+&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|condump [unwrap] &#039;&#039;filename.txt&#039;&#039;&lt;br /&gt;
|Writes the text content of the console to text file &#039;&#039;filename.txt&#039;&#039; (you can use any file name). If optional keyword &#039;&#039;unwrap&#039;&#039; is used, full lines from the console will be stitched together with the following line. Useful when exporting long file paths from the console, that have been broken up by its width limit. &#039;&#039;TDM 2.03+&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
&lt;br /&gt;
[[Cvars in The Dark Mod]]&lt;br /&gt;
&lt;br /&gt;
{{editing}}&lt;br /&gt;
&lt;br /&gt;
[[Category:CVARS]]&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=Console_Useful_Controls&amp;diff=30988</id>
		<title>Console Useful Controls</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=Console_Useful_Controls&amp;diff=30988"/>
		<updated>2024-01-29T18:53:29Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: listEntities accepts glob filter for entity name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
This is a list of common console commands and cvars that are of use to Dark Mod mappers and developers for testing etc. It is in order of key words and meaning. The console can be called by hitting &amp;quot;{{key|CTRL}}+{{key|ALT}}+{{key|~}}&amp;quot; (&amp;quot;{{key|CTRL}}+{{key|ALT}}+{{key|Key left of number 1}}&amp;quot; in general, e.g. &amp;quot;{{key|CTRL}}+{{key|ALT}}+{{key|^}}&amp;quot; on a German keyboard).&lt;br /&gt;
&lt;br /&gt;
This will open the console to cover the upper 50% of the screen. To cover more (80%), also hold down the {{key|SHIFT}} key.&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
* Where a cvar or command is followed by a 1 (parameter) it can be taken that it is enabled by 1 and disabled by 0 unless otherwise stated. &#039;&#039;&#039;N&#039;&#039;&#039; indicates a range of values.&lt;br /&gt;
* The current value of a cvar can be shown by entering its name without a value.&lt;br /&gt;
* Parameters can be toggled between values by preceding the control with &#039;toggle&#039; and following it with eg, 1 0. Example : toggle r_showtris 3 0&lt;br /&gt;
* Controls can be bound to keys to be used in-game, including the toggle command, eg, &amp;lt;tt&amp;gt;bind &amp;quot;v&amp;quot; &amp;quot;toggle r_showportals 1 0&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Many controls can be included in the file &#039;&#039;&#039;Doomconfig.cfg&#039;&#039;&#039; in the darkmod folder so they are automatically effective.&lt;br /&gt;
* Some controls are disabled on exit from a map; others are permanent until manually changed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot; border=1 style=&amp;quot;border-color: grey; border-collapse: collapse; font-size: 92%; margin-left: 1em&amp;quot; cellspacing=0 cellpadding=3&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!bgcolor=#ffdead|Command&lt;br /&gt;
!bgcolor=#ffdead|Description&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|noclip&lt;br /&gt;
|Player flies through everything.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|notarget&lt;br /&gt;
|AI will not know the player is there.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|invisible&lt;br /&gt;
|AI will not see the player, but can still hear him.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|inaudible&lt;br /&gt;
|AI will not hear the player, but can still see him.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|god&lt;br /&gt;
|Player cannot be harmed.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|killmonsters&lt;br /&gt;
|Removes all AI from a map.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|tdm_open_doors&lt;br /&gt;
|Opens all doors on map: even locked and unpickable ones!&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|tdm_close_doors&lt;br /&gt;
|Closes all doors on map&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|tdm_show_loot&lt;br /&gt;
|Shows loot items through walls for a short time.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|tdm_show_keys&lt;br /&gt;
|Shows keys through walls for a short time.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|g_dragentity 1&lt;br /&gt;
|Aim at entity and hold attack control then pull back.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|pm_noclipspeed N&lt;br /&gt;
|Changes the speed of player noclip movement.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|g_fov N&lt;br /&gt;
|N=angle of field of view, eg, &#039;&#039;&#039;&amp;lt;code&amp;gt;g_fov 30&amp;lt;/code&amp;gt;&#039;&#039;&#039; = zoom in to restrict field of view to 30 degrees. Default = 90.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|g_showEntityInfo 1&lt;br /&gt;
|Show info about near entities (as box with classname).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|com_showfps 1&lt;br /&gt;
|Show fps to test performance.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|com_numQuickSaves N&lt;br /&gt;
|How many quicksaves to retain. Reducing the number won&#039;t delete any that you already have.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|g_frametime 1&lt;br /&gt;
|Timing info for each frame, see [[Profiling#g_frametime|Profiling]].&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|r_showPrimitives 1&lt;br /&gt;
|Show info about number of [[drawcalls]] and tris/shadow tris rendered.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|con_noprint 0&lt;br /&gt;
|Prints console messages to the screen as an overlay.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|r_showskel 1&lt;br /&gt;
|Shows skeleton in-game with joint names.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|g_showCollisionModels 1&lt;br /&gt;
|Shows collision models. Use &#039;&#039;&#039;g_maxShowDistance N&#039;&#039;&#039; to increase the distance where they are shown to.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|r_showtris N&lt;br /&gt;
|(1) Shows triangles being rendered directly.&amp;lt;br&amp;gt;(2) Shows overdrawn tri&#039;s.&amp;lt;br&amp;gt;(3) Shows all tri&#039;s in scene, direct and indirect.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|r_showportals N&lt;br /&gt;
|(1) Shows all portals in scene (red=closed, green=open). If your portals don&#039;t show up they are most likely not sealing. Yellow indicates a portal that is effectively closed but which connects to a visleaf visible through another portal.&lt;br /&gt;
(2) Also prints area numbers, mainly where player&#039;s eye is right now.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|r_showlightcount 1&lt;br /&gt;
|Using colours, shows the number of lights hitting a surface, black = 0, red = 1, blue = 2... etc.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|seta tdm_showsprop 1&lt;br /&gt;
|Shows the volume of sounds heard by AI.  &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|tdm_ai_showbark 1&lt;br /&gt;
|Gives the def name (not the soundshader) of barks used by AI.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|tdm_ai_showalert 1&lt;br /&gt;
|Shows the AI&#039;s current alert total and alert state.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|tdm_ai_showdest 1&lt;br /&gt;
|Shows the AI&#039;s current path destination.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|bind &amp;quot;f1&amp;quot; &amp;quot;_impulse27&amp;quot; &lt;br /&gt;
|Pressing F1 shows the AAS regions.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|timescale 2&lt;br /&gt;
|Double speed, good for testing pathing, 1 = normal speed, 2 = double, 0.5 = half speed. To have an effect, the &amp;quot;Uncapped FPS&amp;quot; setting must be Off.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|g_timeModifier 2&lt;br /&gt;
|Same as timescale 2 but somewhat different&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|g_stopTime 1&lt;br /&gt;
|Stops gameplay time, but player can move normally.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|teleport &amp;quot;entity name&amp;quot;&lt;br /&gt;
|teleports the player to the named entity&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|teleportArea N&lt;br /&gt;
|teleports the player into the area with number N&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|getviewpos&lt;br /&gt;
|get player&#039;s position and orientation [[Reporting_Problem#Coordinates|coordinates]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|setviewpos X Y Z [P Y R]&lt;br /&gt;
|teleports the player to the coordinates and optionally sets camera orientation.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Spawning entities ==&lt;br /&gt;
&lt;br /&gt;
Spawns entity in front of the player. Look up if entity gets spawned under the floor. &lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot; border=1 style=&amp;quot;border-color: grey; border-collapse: collapse; font-size: 92%; margin-left: 1em&amp;quot; cellspacing=0 cellpadding=3&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!bgcolor=#ffdead|Command&lt;br /&gt;
!bgcolor=#ffdead|Description&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:weapon_blackjack&lt;br /&gt;
|Spawns blackjack.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:weapon_shortsword&lt;br /&gt;
|Spawns a sword.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_broadhead&lt;br /&gt;
|Spawns one arrow.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_broadhead inv_ammo_amount 50&lt;br /&gt;
|Spawns 50 arrows (one entity with 50 ammo). Similar technique can be used for other ammo types.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_firearrow&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_gasarrow&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_mossarrow&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_noisemaker&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_ropearrow&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_waterarrow&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
With the TDM console you can press tab after typing something to autocomplete. For example &amp;lt;tt&amp;gt;spawn atdm:&amp;lt;tab&amp;gt;&amp;lt;/tt&amp;gt; will cycle through the various spawnables. You can also add additional spawnargs using the following syntax: &amp;lt;tt&amp;gt;spawn classname [key value] [key value] ...&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Diagnostic information ==&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot; border=1 style=&amp;quot;border-color: grey; border-collapse: collapse; font-size: 92%; margin-left: 1em&amp;quot; cellspacing=0 cellpadding=3&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!bgcolor=#ffdead|Command&lt;br /&gt;
!bgcolor=#ffdead|Description&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|listEntities&lt;br /&gt;
|lists all current entities followed by a count.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|listEntities GLOB&lt;br /&gt;
|lists all alive entities whose names match given glob/wildcard (e.g. use asterisks like &amp;lt;tt&amp;gt;*func_static*&amp;lt;/tt&amp;gt; to search for substring).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|countEntities&lt;br /&gt;
|displays a count of entities by class. &#039;&#039;TDM 2.03+&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|condump [unwrap] &#039;&#039;filename.txt&#039;&#039;&lt;br /&gt;
|Writes the text content of the console to text file &#039;&#039;filename.txt&#039;&#039; (you can use any file name). If optional keyword &#039;&#039;unwrap&#039;&#039; is used, full lines from the console will be stitched together with the following line. Useful when exporting long file paths from the console, that have been broken up by its width limit. &#039;&#039;TDM 2.03+&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
&lt;br /&gt;
[[Cvars in The Dark Mod]]&lt;br /&gt;
&lt;br /&gt;
{{editing}}&lt;br /&gt;
&lt;br /&gt;
[[Category:CVARS]]&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=Console_Useful_Controls&amp;diff=30987</id>
		<title>Console Useful Controls</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=Console_Useful_Controls&amp;diff=30987"/>
		<updated>2024-01-29T17:43:34Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: Added tdm_open/close_doors, r_showPortals 2, teleportArea, g_stopTime + minor fixes.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
This is a list of common console commands and cvars that are of use to Dark Mod mappers and developers for testing etc. It is in order of key words and meaning. The console can be called by hitting &amp;quot;{{key|CTRL}}+{{key|ALT}}+{{key|~}}&amp;quot; (&amp;quot;{{key|CTRL}}+{{key|ALT}}+{{key|Key left of number 1}}&amp;quot; in general, e.g. &amp;quot;{{key|CTRL}}+{{key|ALT}}+{{key|^}}&amp;quot; on a German keyboard).&lt;br /&gt;
&lt;br /&gt;
This will open the console to cover the upper 50% of the screen. To cover more (80%), also hold down the {{key|SHIFT}} key.&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
* Where a cvar or command is followed by a 1 (parameter) it can be taken that it is enabled by 1 and disabled by 0 unless otherwise stated. &#039;&#039;&#039;N&#039;&#039;&#039; indicates a range of values.&lt;br /&gt;
* The current value of a cvar can be shown by entering its name without a value.&lt;br /&gt;
* Parameters can be toggled between values by preceding the control with &#039;toggle&#039; and following it with eg, 1 0. Example : toggle r_showtris 3 0&lt;br /&gt;
* Controls can be bound to keys to be used in-game, including the toggle command, eg, &amp;lt;tt&amp;gt;bind &amp;quot;v&amp;quot; &amp;quot;toggle r_showportals 1 0&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Many controls can be included in the file &#039;&#039;&#039;Doomconfig.cfg&#039;&#039;&#039; in the darkmod folder so they are automatically effective.&lt;br /&gt;
* Some controls are disabled on exit from a map; others are permanent until manually changed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot; border=1 style=&amp;quot;border-color: grey; border-collapse: collapse; font-size: 92%; margin-left: 1em&amp;quot; cellspacing=0 cellpadding=3&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!bgcolor=#ffdead|Command&lt;br /&gt;
!bgcolor=#ffdead|Description&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|noclip&lt;br /&gt;
|Player flies through everything.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|notarget&lt;br /&gt;
|AI will not know the player is there.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|invisible&lt;br /&gt;
|AI will not see the player, but can still hear him.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|inaudible&lt;br /&gt;
|AI will not hear the player, but can still see him.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|god&lt;br /&gt;
|Player cannot be harmed.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|killmonsters&lt;br /&gt;
|Removes all AI from a map.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|tdm_open_doors&lt;br /&gt;
|Opens all doors on map: even locked and unpickable ones!&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|tdm_close_doors&lt;br /&gt;
|Closes all doors on map&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|tdm_show_loot&lt;br /&gt;
|Shows loot items through walls for a short time.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|tdm_show_keys&lt;br /&gt;
|Shows keys through walls for a short time.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|g_dragentity 1&lt;br /&gt;
|Aim at entity and hold attack control then pull back.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|pm_noclipspeed N&lt;br /&gt;
|Changes the speed of player noclip movement.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|g_fov N&lt;br /&gt;
|N=angle of field of view, eg, &#039;&#039;&#039;&amp;lt;code&amp;gt;g_fov 30&amp;lt;/code&amp;gt;&#039;&#039;&#039; = zoom in to restrict field of view to 30 degrees. Default = 90.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|g_showEntityInfo 1&lt;br /&gt;
|Show info about near entities (as box with classname).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|com_showfps 1&lt;br /&gt;
|Show fps to test performance.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|com_numQuickSaves N&lt;br /&gt;
|How many quicksaves to retain. Reducing the number won&#039;t delete any that you already have.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|g_frametime 1&lt;br /&gt;
|Timing info for each frame, see [[Profiling#g_frametime|Profiling]].&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|r_showPrimitives 1&lt;br /&gt;
|Show info about number of [[drawcalls]] and tris/shadow tris rendered.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|con_noprint 0&lt;br /&gt;
|Prints console messages to the screen as an overlay.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|r_showskel 1&lt;br /&gt;
|Shows skeleton in-game with joint names.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|g_showCollisionModels 1&lt;br /&gt;
|Shows collision models. Use &#039;&#039;&#039;g_maxShowDistance N&#039;&#039;&#039; to increase the distance where they are shown to.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|r_showtris N&lt;br /&gt;
|(1) Shows triangles being rendered directly.&amp;lt;br&amp;gt;(2) Shows overdrawn tri&#039;s.&amp;lt;br&amp;gt;(3) Shows all tri&#039;s in scene, direct and indirect.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|r_showportals N&lt;br /&gt;
|(1) Shows all portals in scene (red=closed, green=open). If your portals don&#039;t show up they are most likely not sealing. Yellow indicates a portal that is effectively closed but which connects to a visleaf visible through another portal.&lt;br /&gt;
(2) Also prints area numbers, mainly where player&#039;s eye is right now.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|r_showlightcount 1&lt;br /&gt;
|Using colours, shows the number of lights hitting a surface, black = 0, red = 1, blue = 2... etc.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|seta tdm_showsprop 1&lt;br /&gt;
|Shows the volume of sounds heard by AI.  &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|tdm_ai_showbark 1&lt;br /&gt;
|Gives the def name (not the soundshader) of barks used by AI.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|tdm_ai_showalert 1&lt;br /&gt;
|Shows the AI&#039;s current alert total and alert state.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|tdm_ai_showdest 1&lt;br /&gt;
|Shows the AI&#039;s current path destination.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|bind &amp;quot;f1&amp;quot; &amp;quot;_impulse27&amp;quot; &lt;br /&gt;
|Pressing F1 shows the AAS regions.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|timescale 2&lt;br /&gt;
|Double speed, good for testing pathing, 1 = normal speed, 2 = double, 0.5 = half speed. To have an effect, the &amp;quot;Uncapped FPS&amp;quot; setting must be Off.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|g_timeModifier 2&lt;br /&gt;
|Same as timescale 2 but somewhat different&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|g_stopTime 1&lt;br /&gt;
|Stops gameplay time, but player can move normally.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|teleport &amp;quot;entity name&amp;quot;&lt;br /&gt;
|teleports the player to the named entity&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|teleportArea N&lt;br /&gt;
|teleports the player into the area with number N&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|getviewpos&lt;br /&gt;
|get player&#039;s position and orientation [[Reporting_Problem#Coordinates|coordinates]]&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|setviewpos X Y Z [P Y R]&lt;br /&gt;
|teleports the player to the coordinates and optionally sets camera orientation.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Spawning entities ==&lt;br /&gt;
&lt;br /&gt;
Spawns entity in front of the player. Look up if entity gets spawned under the floor. &lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot; border=1 style=&amp;quot;border-color: grey; border-collapse: collapse; font-size: 92%; margin-left: 1em&amp;quot; cellspacing=0 cellpadding=3&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!bgcolor=#ffdead|Command&lt;br /&gt;
!bgcolor=#ffdead|Description&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:weapon_blackjack&lt;br /&gt;
|Spawns blackjack.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:weapon_shortsword&lt;br /&gt;
|Spawns a sword.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_broadhead&lt;br /&gt;
|Spawns one arrow.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_broadhead inv_ammo_amount 50&lt;br /&gt;
|Spawns 50 arrows (one entity with 50 ammo). Similar technique can be used for other ammo types.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_firearrow&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_gasarrow&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_mossarrow&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_noisemaker&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_ropearrow&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|spawn atdm:ammo_waterarrow&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
With the TDM console you can press tab after typing something to autocomplete. For example &amp;lt;tt&amp;gt;spawn atdm:&amp;lt;tab&amp;gt;&amp;lt;/tt&amp;gt; will cycle through the various spawnables. You can also add additional spawnargs using the following syntax: &amp;lt;tt&amp;gt;spawn classname [key value] [key value] ...&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Diagnostic information ==&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot; border=1 style=&amp;quot;border-color: grey; border-collapse: collapse; font-size: 92%; margin-left: 1em&amp;quot; cellspacing=0 cellpadding=3&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!bgcolor=#ffdead|Command&lt;br /&gt;
!bgcolor=#ffdead|Description&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|listEntities&lt;br /&gt;
|lists all current entities followed by a count.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|countEntities&lt;br /&gt;
|displays a count of entities by class. &#039;&#039;TDM 2.03+&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!align=left|condump [unwrap] &#039;&#039;filename.txt&#039;&#039;&lt;br /&gt;
|Writes the text content of the console to text file &#039;&#039;filename.txt&#039;&#039; (you can use any file name). If optional keyword &#039;&#039;unwrap&#039;&#039; is used, full lines from the console will be stitched together with the following line. Useful when exporting long file paths from the console, that have been broken up by its width limit. &#039;&#039;TDM 2.03+&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
&lt;br /&gt;
[[Cvars in The Dark Mod]]&lt;br /&gt;
&lt;br /&gt;
{{editing}}&lt;br /&gt;
&lt;br /&gt;
[[Category:CVARS]]&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=Caulk&amp;diff=30954</id>
		<title>Caulk</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=Caulk&amp;diff=30954"/>
		<updated>2024-01-05T21:22:24Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: Reviewed the section about applying caulk for the sake of performance&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&amp;quot;Caulk&amp;quot; is an old word, in verb form meaning &amp;quot;to make a ship or building watertight by filling the seams between planks with oakum or other material driven snug&amp;quot;. A ship not properly caulked could leak, slow down, and sink. Reputedly, this inspired id co-founder John Carmack to chose the name &amp;quot;caulk&amp;quot; for a substance to seal internal and external leaks. The original purposes of caulk in Doom were likely to help avoid game slow-downs, and to close off any accidental tiny leaks by plastering the whole outside with it. From [https://forums.thedarkmod.com/index.php?/topic/18030-the-origins-of-caulk/&amp;amp;tab=comments#comment-388327 The Origins of Caulk]&lt;br /&gt;
&lt;br /&gt;
In TDM, the noun &amp;quot;caulk&amp;quot; can be used in two senses:&lt;br /&gt;
# as a texture (found in textures/common/caulk), that appears pink/magenta in DR, but is not drawn in-game. Like other textures, it can be applied to the faces of brushes (worldspawns), func_statics, and so on.&lt;br /&gt;
# as a &#039;&#039;&#039;worldspawn brush&#039;&#039;&#039; with the caulk texture applied to one or typically all surfaces.&lt;br /&gt;
&lt;br /&gt;
== Caulk considered dangerous ==&lt;br /&gt;
&lt;br /&gt;
The very idea of caulk contradicts itself:&lt;br /&gt;
* (rendering) It is not rendered and does not cast shadows, thus it does &#039;&#039;&#039;not&#039;&#039;&#039; block neither view nor light.&lt;br /&gt;
* (area-portal graph) It is opaque and thus closes areas, meaning that it blocks both view and light.&lt;br /&gt;
&lt;br /&gt;
It means that when you apply caulk, you cannot expect fully defined behavior in game.&lt;br /&gt;
The exact behavior depends on internal algorithms of the renderer, and may change between TDM versions due to engine improvements.&lt;br /&gt;
&lt;br /&gt;
For example, caulk brushes inside doorway models are known to [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/ break the new light portal flow optimizations] [https://bugs.thedarkmod.com/view.php?id=5172#c16126 #5172]. This issue is caused by the fact that stencil shadows are only generated from backfaces.&lt;br /&gt;
&lt;br /&gt;
A related &#039;&#039;&#039;shadowcaulk material&#039;&#039;&#039; can fix this issue, because it casts shadows and thus blocks light rays in all regards.&lt;br /&gt;
But the contradiction in whether it blocks view or not still remains.&lt;br /&gt;
Perhaps it does not cause undefined behavior if the caulk geometry is fully surrounded by non-translucent geometry...&lt;br /&gt;
&lt;br /&gt;
Another example: if occlusion culling happens in the future, it will most likely use all the world geometry as occluders, but most likely will &#039;&#039;&#039;not&#039;&#039;&#039; use all the models.&lt;br /&gt;
So if you cover a piece of the wall with caulk because it is invisible under a model, the objects behind this caulky hole will not be removed from rendering.&lt;br /&gt;
&lt;br /&gt;
== Main Use of Caulk - for Separating Vis Leafs ==&lt;br /&gt;
It is the second meaning in which caulk is actually most useful: &#039;&#039;&#039;for defining and sealing, in conjunction with visportals, individual &#039;&#039;vis leaf&#039;&#039; areas of your map&#039;&#039;&#039;. This often takes the form of thin caulk-brush sheets sandwiched between non-brush opaque interior walls. Creating vis leafs is important to avoid unnecessary, performance-sucking rendering, and to provide more-plausible sound propagation. For more about this, see [[Visportals]] and [[Sound Propagation: Part 1]].&lt;br /&gt;
&lt;br /&gt;
Other transparent &amp;quot;no draw&amp;quot; textures on brushes do not have the sealing property that caulk has.&lt;br /&gt;
&lt;br /&gt;
== Another Important Use - Caulk Sky ==&lt;br /&gt;
[[Image:Caulk sky with portal sky cube.png|200px|thumb|right|Figure 1a. Looking up at a caulk sky with portal sky cube in DR.]] While most any opaque worldspawn brush can be used to seal against the void (as discussed in [[Performance: Essential Must-Knows]] and other places), to specifically create a sky, the external, void-facing brushes have two choices for texture:&lt;br /&gt;
* portal_sky (found in textures/smf/portal_sky)&lt;br /&gt;
* caulk&lt;br /&gt;
[[Image:Caulk sky in-game.jpg|200px|thumb|right|Figure 1b. Looking up at the same sky in-game.]]For a caulk sky, besides the caulk brushes themselves, you must have at least one surface anywhere in the rendered area with the portal_sky texture. For example, in Figure 1 (from a 2013 example by Obsttorte), this is done using an out-of-the-way portal_sky-textured cube brush. The engine will never render anything on the caulk brush surfaces themselves; they are merely views into the void, and the engine uses the portal_sky texture sample to &amp;quot;fill in&amp;quot; those views. Figure 1b shows the same &amp;quot;pit&amp;quot; scene, but in-game, at a different angle.&lt;br /&gt;
&lt;br /&gt;
There are two main reasons traditionally why caulk sky was useful in TDM.&lt;br /&gt;
&lt;br /&gt;
=== Non-Clipping of Objects that Extend Into the Void ===&lt;br /&gt;
Consider a map object that pierces an external brush of your map. Assume that (in order to compile without leak) its origin is within the rendered volume, either naturally or by adjustment. If the external brush has portal_sky on its interior, the map object (prior to TDM 2.05) will be clipped there. Sometimes, that&#039;s not what you want.&lt;br /&gt;
&lt;br /&gt;
While caulk does not render, it does cut into other textures, but only if they are worldspawn. If you&#039;ve converted them into func_statics, they will be rendered completely and not be cut off at the caulk surface. To ensure this happens, the func_static must reaching into the rendered area a bit. In Figure 1, the roof eaves at the pit lips are part of larger roof wedges that the player can see when jumping up. They are func_statics that extend into the void, but with origins in the pit&#039;s vis leaf. (If the game had multiple vis leafs from which to view the func_statics, they would appear unclipped from all.)&lt;br /&gt;
&lt;br /&gt;
To summarize, caulk is transparent, and in-effect shows the portal_sky through it, as well as any func_statics that pierce it into your vis leaf.  That means you can cut a func_static house in half with a caulk brush, and still see both sides of it.  Using portal_sky, this was not possible until recently. However, since TDM 2.05, the default behavior of portal_sky regarding clipping is now similar to caulk.&lt;br /&gt;
&lt;br /&gt;
For more, see [https://forums.thedarkmod.com/index.php?/topic/10003-so-what-are-you-working-on-right-now/page/178/&amp;amp;tab=comments#comment-311195 this forum post] and [http://bugs.thedarkmod.com/view.php?id=4635 this bug tracker entry about portal sky modes].&lt;br /&gt;
&lt;br /&gt;
=== Atmospheric Fog ===&lt;br /&gt;
Dealing with fog effects is often tricky, particularly at the boundary of fog volume and sky. Portal_sky versus caulk sky can differ. Some starting points:&lt;br /&gt;
* A &#039;&#039;Fog Light&#039;&#039; with spawnarg &amp;quot;noFogBoundary&amp;quot; lets fog paint on solid surfaces, while leaving empty space and caulk sky free of fog effects.&lt;br /&gt;
* For more, see [[Light_Properties#Fog_Light | Fog Light]] and [https://forums.thedarkmod.com/index.php?/topic/15802-simulating-atmospheric-perspective Simulating Atmospheric Perspective].&lt;br /&gt;
&lt;br /&gt;
== Other, Secondary Uses of Caulk as a Texture ==&lt;br /&gt;
=== As a DR Mapper Convenience ===&lt;br /&gt;
[[Image:caulk_image3.png|200px|thumb|right|Figure 2. Benefits of caulking as a mapping tool.]] Some mappers like to caulk the exterior (void-facing) surfaces of their maps. While unnecessary for game play (since the engine ignores those surfaces automatically), it benefits editing. By using the DR Caulk filter, the mapper can easily switch off the exterior surfaces and see inside the map to get a better vantage point. Image 2 shows the view:&lt;br /&gt;
* (&#039;&#039;top&#039;&#039;) if you don&#039;t caulk the exterior (and just leave it as a stone texture). It is difficult to get a good overhead view of the work. Unless you set up caulking (or one of the alternative methods), you have to either select and hide the exterior brushes or fly inside the map.&lt;br /&gt;
* (&#039;&#039;middle&#039;&#039;) if you do caulk the exterior, when the caulk filter is not active.&lt;br /&gt;
* (&#039;&#039;bottom&#039;&#039;) with the caulk filter activated, for a superior overhead view into the work.&lt;br /&gt;
&lt;br /&gt;
Alternative non-caulk methods to do this include:&lt;br /&gt;
* using DR Layers. Move all the exterior brushes into their own Layer, and hide that layer.&lt;br /&gt;
* with any brush used as a Portal Sky, keeping that texture on all faces, and adding a custom DR &amp;quot;Portal Sky&amp;quot; filter&lt;br /&gt;
&lt;br /&gt;
=== To Avoid Cost of Drawing Unseeable Polygons ===&lt;br /&gt;
Caulk can be used to skip drawing of: [[Image:caulk_image.png|200px|thumb|right|Figure 3. Caulk applied to a func_static window.]]&lt;br /&gt;
* back-surface polygons (tris) of a &#039;&#039;prop&#039;&#039; object, such as a door or window as in Figure 3. There, surfaces touching the wall are caulked, so are not drawn in game, saving tris. But GPU immediately drops all backfacing triangles anyway, so you won&#039;t notice any difference. Testing (detailed further below) shows that such caulking is not worth the effort.&lt;br /&gt;
* worldspawn brush surfaces entirely covered by detail work like patches.[[Image:caulk_image2.png|200px|thumb|right|Figure 4. Caulk applied to a unseeable worldspawn brush surface.]] See Figure 4. The player can never see the caulked surface because it&#039;s hidden by the func_static vault. However, stencil shadows can might get broken in this case (see [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/ thread]), and there is no noticeable performance difference anyway.&lt;br /&gt;
&lt;br /&gt;
=== Avoiding Z-Fighting ===&lt;br /&gt;
As just seen with the vault in Figure 4, caulking helps in certain circumstances. The caulked worldspawn surface does not &amp;quot;sparkle&amp;quot; or z-fight through the highest point of the vault, where the vault patch and the worldspawn brush are at equal height.&lt;br /&gt;
&lt;br /&gt;
== Caulking of Hidden Surfaces to Improve Performance? - Discussion, Testing, and Analysis ==&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
Every now and then, caulking arises in debates: is it useful and beneficial to performance to spend a lot of time object-caulking? And if so, how much caulk is required to get a solid impact on fps rate? &lt;br /&gt;
&lt;br /&gt;
As Figure 3 indicated, to save a few polygons (tris), one can apply caulk on surfaces the player can never see in any circumstances, like wall-facing surfaces of prop windows and doors. This reduces the number of tris, and thus could potentially improve performance in some cases. But what does testing reveal?&lt;br /&gt;
&lt;br /&gt;
===  Caulking That Cannot Affect Performance ===&lt;br /&gt;
There is no &#039;&#039;performance&#039;&#039; advantage to using caulk on any of these surfaces:&lt;br /&gt;
* worldspawn surfaces on the outside of the map in contact with the void&lt;br /&gt;
* worldspawn surfaces that are flush against another surface, for instance the bottom of a brush aligned with the floor.&lt;br /&gt;
&lt;br /&gt;
Dmap compiler removes these surfaces automatically, so caulk texture is not needed.&lt;br /&gt;
&lt;br /&gt;
=== Testing and Estimating the Effect of Caulking on Performance ===&lt;br /&gt;
Tests performed in 2010 by Sotha gave the following results.&lt;br /&gt;
&lt;br /&gt;
Caulking a medium complex scene with tens of windows and other objects (Knighton Manor start) did NOT have any effect on fps counts. Caulking did save roughly 1000 tris, but this is not sufficient to cause any fps improvement. Also it was noticed that memory usage decreased : 1000 saved tris saved 0.6MB of memory. This is about the size of one 1K x 1K diffuse texture, so the difference is absolutely negligible.&lt;br /&gt;
&lt;br /&gt;
Testing indicated that on a rather high-end computer (for 2010) an increase of 23000 tris, 75 draws and 2500 shdw reduced the fps count by two (stgatilov: relative to how many? was that additional geometry invisible?).&lt;br /&gt;
If a window consists of 5 brushes and the wall facing surfaces are caulked, this saves 5 surfaces and thus 10 tris per window. This would mean that 2300 windows should be caulked to get an improvement of 2fps. Basically this shows that caulking does not have much impact on modern hardware. However, on an older piece of hardware the amount of caulking needed for performance effect is lower, but even in this case it should be remembered that 1000 tris is roughly 20% of a single AI character.&lt;br /&gt;
&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
Applying caulk on brushes for the purpose of optimization is simply not worth it.&lt;br /&gt;
And given that it can cause problems with TDM updates, better not do it.&lt;br /&gt;
&lt;br /&gt;
{{editing}}&lt;br /&gt;
[[Category:Mapping Tutorials]]&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=Caulk&amp;diff=30953</id>
		<title>Caulk</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=Caulk&amp;diff=30953"/>
		<updated>2024-01-05T17:17:52Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: Added &amp;quot;caulk considered dangerous&amp;quot; section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&amp;quot;Caulk&amp;quot; is an old word, in verb form meaning &amp;quot;to make a ship or building watertight by filling the seams between planks with oakum or other material driven snug&amp;quot;. A ship not properly caulked could leak, slow down, and sink. Reputedly, this inspired id co-founder John Carmack to chose the name &amp;quot;caulk&amp;quot; for a substance to seal internal and external leaks. The original purposes of caulk in Doom were likely to help avoid game slow-downs, and to close off any accidental tiny leaks by plastering the whole outside with it. From [https://forums.thedarkmod.com/index.php?/topic/18030-the-origins-of-caulk/&amp;amp;tab=comments#comment-388327 The Origins of Caulk]&lt;br /&gt;
&lt;br /&gt;
In TDM, the noun &amp;quot;caulk&amp;quot; can be used in two senses:&lt;br /&gt;
# as a texture (found in textures/common/caulk), that appears pink/magenta in DR, but is not drawn in-game. Like other textures, it can be applied to the faces of brushes (worldspawns), func_statics, and so on.&lt;br /&gt;
# as a &#039;&#039;&#039;worldspawn brush&#039;&#039;&#039; with the caulk texture applied to one or typically all surfaces.&lt;br /&gt;
&lt;br /&gt;
== Caulk considered dangerous ==&lt;br /&gt;
&lt;br /&gt;
The very idea of caulk contradicts itself:&lt;br /&gt;
* (rendering) It is not rendered and does not cast shadows, thus it does &#039;&#039;&#039;not&#039;&#039;&#039; block neither view nor light.&lt;br /&gt;
* (area-portal graph) It is opaque and thus closes areas, meaning that it blocks both view and light.&lt;br /&gt;
&lt;br /&gt;
It means that when you apply caulk, you cannot expect fully defined behavior in game.&lt;br /&gt;
The exact behavior depends on internal algorithms of the renderer, and may change between TDM versions due to engine improvements.&lt;br /&gt;
&lt;br /&gt;
For example, caulk brushes inside doorway models are known to [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/ break the new light portal flow optimizations] [https://bugs.thedarkmod.com/view.php?id=5172#c16126 #5172].&lt;br /&gt;
One workaround is to disable the optimizations... which means you lose much more performance than you tried to gain by applying caulk!&lt;br /&gt;
&lt;br /&gt;
A related &#039;&#039;&#039;shadowcaulk material&#039;&#039;&#039; can also fix this issue, because it casts shadows and thus blocks light rays in all regards.&lt;br /&gt;
But the contradiction in blocking view still remains.&lt;br /&gt;
&lt;br /&gt;
Another example: if occlusion culling happens in the future, it will most likely use all the world geometry as occluders, but most likely will &#039;&#039;&#039;not&#039;&#039;&#039; use all the models.&lt;br /&gt;
So if you cover a piece of the wall with caulk because it is invisible under a model, the objects behind caulky hole will not be removed from rendering.&lt;br /&gt;
&lt;br /&gt;
== Main Use of Caulk - for Separating Vis Leafs ==&lt;br /&gt;
It is the second meaning in which caulk is actually most useful: &#039;&#039;&#039;for defining and sealing, in conjunction with visportals, individual &#039;&#039;vis leaf&#039;&#039; areas of your map&#039;&#039;&#039;. This often takes the form of thin caulk-brush sheets sandwiched between non-brush opaque interior walls. Creating vis leafs is important to avoid unnecessary, performance-sucking rendering, and to provide more-plausible sound propagation. For more about this, see [[Visportals]] and [[Sound Propagation: Part 1]].&lt;br /&gt;
&lt;br /&gt;
Other transparent &amp;quot;no draw&amp;quot; textures on brushes do not have the sealing property that caulk has.&lt;br /&gt;
&lt;br /&gt;
== Another Important Use - Caulk Sky ==&lt;br /&gt;
[[Image:Caulk sky with portal sky cube.png|200px|thumb|right|Figure 1a. Looking up at a caulk sky with portal sky cube in DR.]] While most any opaque worldspawn brush can be used to seal against the void (as discussed in [[Performance: Essential Must-Knows]] and other places), to specifically create a sky, the external, void-facing brushes have two choices for texture:&lt;br /&gt;
* portal_sky (found in textures/smf/portal_sky)&lt;br /&gt;
* caulk&lt;br /&gt;
[[Image:Caulk sky in-game.jpg|200px|thumb|right|Figure 1b. Looking up at the same sky in-game.]]For a caulk sky, besides the caulk brushes themselves, you must have at least one surface anywhere in the rendered area with the portal_sky texture. For example, in Figure 1 (from a 2013 example by Obsttorte), this is done using an out-of-the-way portal_sky-textured cube brush. The engine will never render anything on the caulk brush surfaces themselves; they are merely views into the void, and the engine uses the portal_sky texture sample to &amp;quot;fill in&amp;quot; those views. Figure 1b shows the same &amp;quot;pit&amp;quot; scene, but in-game, at a different angle.&lt;br /&gt;
&lt;br /&gt;
There are two main reasons traditionally why caulk sky was useful in TDM.&lt;br /&gt;
&lt;br /&gt;
=== Non-Clipping of Objects that Extend Into the Void ===&lt;br /&gt;
Consider a map object that pierces an external brush of your map. Assume that (in order to compile without leak) its origin is within the rendered volume, either naturally or by adjustment. If the external brush has portal_sky on its interior, the map object (prior to TDM 2.05) will be clipped there. Sometimes, that&#039;s not what you want.&lt;br /&gt;
&lt;br /&gt;
While caulk does not render, it does cut into other textures, but only if they are worldspawn. If you&#039;ve converted them into func_statics, they will be rendered completely and not be cut off at the caulk surface. To ensure this happens, the func_static must reaching into the rendered area a bit. In Figure 1, the roof eaves at the pit lips are part of larger roof wedges that the player can see when jumping up. They are func_statics that extend into the void, but with origins in the pit&#039;s vis leaf. (If the game had multiple vis leafs from which to view the func_statics, they would appear unclipped from all.)&lt;br /&gt;
&lt;br /&gt;
To summarize, caulk is transparent, and in-effect shows the portal_sky through it, as well as any func_statics that pierce it into your vis leaf.  That means you can cut a func_static house in half with a caulk brush, and still see both sides of it.  Using portal_sky, this was not possible until recently. However, since TDM 2.05, the default behavior of portal_sky regarding clipping is now similar to caulk.&lt;br /&gt;
&lt;br /&gt;
For more, see [https://forums.thedarkmod.com/index.php?/topic/10003-so-what-are-you-working-on-right-now/page/178/&amp;amp;tab=comments#comment-311195 this forum post] and [http://bugs.thedarkmod.com/view.php?id=4635 this bug tracker entry about portal sky modes].&lt;br /&gt;
&lt;br /&gt;
=== Atmospheric Fog ===&lt;br /&gt;
Dealing with fog effects is often tricky, particularly at the boundary of fog volume and sky. Portal_sky versus caulk sky can differ. Some starting points:&lt;br /&gt;
* A &#039;&#039;Fog Light&#039;&#039; with spawnarg &amp;quot;noFogBoundary&amp;quot; lets fog paint on solid surfaces, while leaving empty space and caulk sky free of fog effects.&lt;br /&gt;
* For more, see [[Light_Properties#Fog_Light | Fog Light]] and [https://forums.thedarkmod.com/index.php?/topic/15802-simulating-atmospheric-perspective Simulating Atmospheric Perspective].&lt;br /&gt;
&lt;br /&gt;
== Other, Secondary Uses of Caulk as a Texture ==&lt;br /&gt;
=== As a DR Mapper Convenience ===&lt;br /&gt;
[[Image:caulk_image3.png|200px|thumb|right|Figure 2. Benefits of caulking as a mapping tool.]] Some mappers like to caulk the exterior (void-facing) surfaces of their maps. While unnecessary for game play (since the engine ignores those surfaces automatically), it benefits editing. By using the DR Caulk filter, the mapper can easily switch off the exterior surfaces and see inside the map to get a better vantage point. Image 2 shows the view:&lt;br /&gt;
* (&#039;&#039;top&#039;&#039;) if you don&#039;t caulk the exterior (and just leave it as a stone texture). It is difficult to get a good overhead view of the work. Unless you set up caulking (or one of the alternative methods), you have to either select and hide the exterior brushes or fly inside the map.&lt;br /&gt;
* (&#039;&#039;middle&#039;&#039;) if you do caulk the exterior, when the caulk filter is not active.&lt;br /&gt;
* (&#039;&#039;bottom&#039;&#039;) with the caulk filter activated, for a superior overhead view into the work.&lt;br /&gt;
&lt;br /&gt;
Alternative non-caulk methods to do this include:&lt;br /&gt;
* using DR Layers. Move all the exterior brushes into their own Layer, and hide that layer.&lt;br /&gt;
* with any brush used as a Portal Sky, keeping that texture on all faces, and adding a custom DR &amp;quot;Portal Sky&amp;quot; filter&lt;br /&gt;
&lt;br /&gt;
=== To Avoid Drawing Unseeable Polygons ===&lt;br /&gt;
Caulk can be used to skip drawing of: [[Image:caulk_image.png|200px|thumb|right|Figure 3. Caulk applied to a func_static window.]]&lt;br /&gt;
* back-surface polygons (tris) of a &#039;&#039;prop&#039;&#039; object, such as a door or window as in Figure 3. There, surfaces touching the wall are caulked, so are not drawn in game, saving tris. Testing (detailed further below) shows that such caulking is not worth the effort, unless you plan massive cloning of that prop object.&lt;br /&gt;
* worldspawn brush surfaces entirely covered by detail work like patches.[[Image:caulk_image2.png|200px|thumb|right|Figure 4. Caulk applied to a unseeable worldspawn brush surface.]] See Figure 4. The player can never see the caulked surface because it&#039;s hidden by the func_static vault. This not only saves tris (which is not really important), but also removes the &amp;quot;sparkling&amp;quot; of the other texture at the highest point of the vault.&lt;br /&gt;
&lt;br /&gt;
=== Avoiding Z-Fighting ===&lt;br /&gt;
As just seen with the vault in Figure 4, caulking helps in certain circumstances. To reiterate, the caulked worldspawn surface does not &amp;quot;sparkle&amp;quot; or z-fight through the highest point of the vault, where the vault patch and the worldspawn brush are at equal height.&lt;br /&gt;
&lt;br /&gt;
== Caulking of Hidden Surfaces to Improve Performance? - Discussion, Testing, and Analysis ==&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
Every now and then, caulking arises in debates: is it useful and beneficial to performance to spend a lot of time object-caulking? And if so, how much caulk is required to get a solid impact on fps rate? &lt;br /&gt;
&lt;br /&gt;
As Figure 3 indicated, to save a few polygons (tris), one can apply caulk on surfaces the player can never see in any circumstances, like wall-facing surfaces of prop windows and doors. This reduces the number of tris, and thus could potentially improve performance in some cases. But what does testing reveal?&lt;br /&gt;
&lt;br /&gt;
===  Caulking That Cannot Affect Performance ===&lt;br /&gt;
There is no &#039;&#039;performance&#039;&#039; advantage to using caulk on any of these surfaces:&lt;br /&gt;
* worldspawn surfaces on the outside of the map in contact with the void&lt;br /&gt;
* worldspawn surfaces that are flush against another surface, for instance the bottom of a brush aligned with the floor.&lt;br /&gt;
&lt;br /&gt;
The game engine removes these surfaces automatically, so caulk texture is not needed.&lt;br /&gt;
&lt;br /&gt;
=== Testing and Estimating the Effect of Caulking on Performance ===&lt;br /&gt;
Tests performed in 2010 by Sotha gave the following results.&lt;br /&gt;
&lt;br /&gt;
Caulking a medium complex scene with tens of windows and other objects (Knighton Manor start) did NOT have any effect on fps counts. Caulking did save roughly 1000 tris, but this is not sufficient to cause any fps improvement. The main benefit of caulking was the decrease of memory usage: 1000 saved tris saved 0.6MB of memory.&lt;br /&gt;
&lt;br /&gt;
Testing indicated that on a rather high-end computer (for 2010) an increase of 23000 tris, 75 draws and 2500 shdw reduced the fps count by two. If a window consists of 5 brushes and the wall facing surfaces are caulked, this saves 5 surfaces and thus 10 tris per window. This would mean that 2300 windows should be caulked to get an improvement of 2fps. Basically this shows that caulking does not have much impact on modern hardware. However, on an older piece of hardware the amount of caulking needed for performance effect is lower, but even in this case it should be remembered that 1000 tris is roughly 20% of a single AI character.&lt;br /&gt;
&lt;br /&gt;
=== How Should Caulk be Used? Perhaps Before Massive Cloning ===&lt;br /&gt;
Mappers may selectively integrate object-caulking in their ongoing work flow. Suppose the mapper builds a func_static window to be cloned and put everywhere. It is beneficial to use a few seconds to apply caulk on the source func_static and then get the caulking tris-saving effect on all the clones. This adds little work for the mapper, but, in a medium sized scene where the windows and other cloned (but caulked) objects are omnipresent, might easily save a few thousand tris.&lt;br /&gt;
&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
Mappers should not generally take extra trouble to caulk their individual objects, since solid performance increases do not occur with the levels of tris so saved. However, thousands of tris can be saved by simple workflow consideration, when working with objects which are cloned in large numbers.&lt;br /&gt;
&lt;br /&gt;
{{editing}}&lt;br /&gt;
[[Category:Mapping Tutorials]]&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=New_light_leaks_in_2.12&amp;diff=30950</id>
		<title>New light leaks in 2.12</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=New_light_leaks_in_2.12&amp;diff=30950"/>
		<updated>2023-12-22T22:29:48Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There is major change in TDM 2.12 regarding how shadows are generated due to issue [https://bugs.thedarkmod.com/view.php?id=5172 #5172].&lt;br /&gt;
As the result, some we might see some &#039;&#039;&#039;major light leaks&#039;&#039;&#039; in the old missions.&lt;br /&gt;
&lt;br /&gt;
=== Description ===&lt;br /&gt;
&lt;br /&gt;
As far as I know, the problem happens only with stencil shadows, because stencil shadows are cast from back faces only (shadow maps are generated by front faces too).&lt;br /&gt;
The shape of such light leaks does &#039;&#039;&#039;not&#039;&#039;&#039; depend on the camera position.&lt;br /&gt;
Usually the problem is caused by using caulk on brushes: light leaks through the caulk.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;New behavior&#039;&#039;&#039; (default in TDM 2.12 and after):&lt;br /&gt;
* r_useLightPortalFlow = 2&lt;br /&gt;
* r_useLightPortalFlowCulling = 1&lt;br /&gt;
&lt;br /&gt;
The shadows are computed differently for world areas and for models:&lt;br /&gt;
# Any worldspawn brush within light volume always casts shadow. Even if it is behind walls and closed portals.&lt;br /&gt;
# A model casts shadow only if light beams from the light origin might reach it through visportals. No shadows behind walls and closed portals!&lt;br /&gt;
&lt;br /&gt;
As an exception, some models switch from p.2 to p.1 and cast shadows everywhere.&lt;br /&gt;
For instance, this happens in case of parallel lights, and when entities are explicitly marked with the workaround spawnarg &amp;quot;forceShadowBehindOpaque&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Old behavior&#039;&#039;&#039; (default in TDM 2.11 and before):&lt;br /&gt;
* r_useLightPortalFlow = 1&lt;br /&gt;
* r_useLightPortalFlowCulling = 0&lt;br /&gt;
&lt;br /&gt;
The behavior here is different depending on the type of light:&lt;br /&gt;
* &#039;&#039;&#039;Static&#039;&#039;&#039; lights use the new TDM 2.12 behavior, so models don&#039;t cast shadows behind walls.&lt;br /&gt;
* &#039;&#039;&#039;Dynamic&#039;&#039;&#039; lights: everything within light volume casts shadows, regardless of whether it&#039;s area/brush or model.&lt;br /&gt;
&lt;br /&gt;
The light is static if it has not moved since game start.&lt;br /&gt;
That&#039;s the case when engine uses precomputed shadow volumes for world geometry.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Validation ===&lt;br /&gt;
&lt;br /&gt;
Before adding an issue here, please make sure to check the following steps:&lt;br /&gt;
&lt;br /&gt;
* Start game afresh, install mission, setviewpos and verify that light leak indeed happens. Perhaps you need to open some doors nearby.&lt;br /&gt;
* Restart game afresh, set &amp;quot;r_useLightPortalFlow 1&amp;quot; and &amp;quot;r_useLightPortalFlowCulling 0&amp;quot;, start mission. Check that light leak no longer happens.&lt;br /&gt;
&lt;br /&gt;
The light leak can be caused by this issue only if both points are true.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== List of issues ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Mission name !! getviewpos coordinates !! Links to forums !! Applied fixes&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| ws1_north&lt;br /&gt;
| -1153.92 3523.22 -955.75 29.8 -145.6 0.0&lt;br /&gt;
-664.04 2894.9 -635.75 10.2 9.9 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/ 1]&lt;br /&gt;
[https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=488509 2]&lt;br /&gt;
| svn rev 241: global workaround&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| ws2_homeagain&lt;br /&gt;
|&lt;br /&gt;
 4385 420 -410 -30 -110 0 &lt;br /&gt;
 4178.12 391.47 -94.56 -28.8 43.6 0.0&lt;br /&gt;
 4347.92 -271.22 57.53 -0.8 18.4 0.0 &lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=490582 1]&lt;br /&gt;
| (not yet)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| cos3_sacricide&lt;br /&gt;
| -1283.53 -380.68 83.25   15.2 -38.6 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=489895 1]&lt;br /&gt;
| (not yet)&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=New_light_leaks_in_2.12&amp;diff=30949</id>
		<title>New light leaks in 2.12</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=New_light_leaks_in_2.12&amp;diff=30949"/>
		<updated>2023-12-22T22:28:44Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: WS2 added&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There is major change in TDM 2.12 regarding how shadows are generated due to issue [https://bugs.thedarkmod.com/view.php?id=5172 #5172].&lt;br /&gt;
As the result, some we might see some &#039;&#039;&#039;major light leaks&#039;&#039;&#039; in the old missions.&lt;br /&gt;
&lt;br /&gt;
=== Description ===&lt;br /&gt;
&lt;br /&gt;
As far as I know, the problem happens only with stencil shadows, because stencil shadows are cast from back faces only (shadow maps are generated by front faces too).&lt;br /&gt;
The shape of such light leaks does &#039;&#039;&#039;not&#039;&#039;&#039; depend on the camera position.&lt;br /&gt;
Usually the problem is caused by using caulk on brushes: light leaks through the caulk.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;New behavior&#039;&#039;&#039; (default in TDM 2.12 and after):&lt;br /&gt;
* r_useLightPortalFlow = 2&lt;br /&gt;
* r_useLightPortalFlowCulling = 1&lt;br /&gt;
&lt;br /&gt;
The shadows are computed differently for world areas and for models:&lt;br /&gt;
# Any worldspawn brush within light volume always casts shadow. Even if it is behind walls and closed portals.&lt;br /&gt;
# A model casts shadow only if light beams from the light origin might reach it through visportals. No shadows behind walls and closed portals!&lt;br /&gt;
&lt;br /&gt;
As an exception, some models switch from p.2 to p.1 and cast shadows everywhere.&lt;br /&gt;
For instance, this happens in case of parallel lights, and when entities are explicitly marked with the workaround spawnarg &amp;quot;forceShadowBehindOpaque&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Old behavior&#039;&#039;&#039; (default in TDM 2.11 and before):&lt;br /&gt;
* r_useLightPortalFlow = 1&lt;br /&gt;
* r_useLightPortalFlowCulling = 0&lt;br /&gt;
&lt;br /&gt;
The behavior here is different depending on the type of light:&lt;br /&gt;
* &#039;&#039;&#039;Static&#039;&#039;&#039; lights use the new TDM 2.12 behavior, so models don&#039;t cast shadows behind walls.&lt;br /&gt;
* &#039;&#039;&#039;Dynamic&#039;&#039;&#039; lights: everything within light volume casts shadows, regardless of whether it&#039;s area/brush or model.&lt;br /&gt;
&lt;br /&gt;
The light is static if it has not moved since game start.&lt;br /&gt;
That&#039;s the case when engine uses precomputed shadow volumes for world geometry.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Validation ===&lt;br /&gt;
&lt;br /&gt;
Before adding an issue here, please make sure to check the following steps:&lt;br /&gt;
&lt;br /&gt;
* Start game afresh, install mission, setviewpos and verify that light leak indeed happens. Perhaps you need to open some doors nearby.&lt;br /&gt;
* Restart game afresh, set &amp;quot;r_useLightPortalFlow 1&amp;quot; and &amp;quot;r_useLightPortalFlowCulling 0&amp;quot;, start mission. Check that light leak no longer happens.&lt;br /&gt;
&lt;br /&gt;
The light leak can be caused by this issue only if both points are true.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== List of issues ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Mission name !! getviewpos coordinates !! Links to forums !! Applied fixes&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| ws1_north&lt;br /&gt;
| -1153.92 3523.22 -955.75 29.8 -145.6 0.0&lt;br /&gt;
-664.04 2894.9 -635.75 10.2 9.9 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/ 1]&lt;br /&gt;
[https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=488509 2]&lt;br /&gt;
| svn rev 241: global workaround&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| ws2_homeagain&lt;br /&gt;
| 4385 420 -410 -30 -110 0&lt;br /&gt;
4178.12 391.47 -94.56 -28.8 43.6 0.0&lt;br /&gt;
4347.92 -271.22 57.53 -0.8 18.4 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=490582 1]&lt;br /&gt;
| (not yet)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| cos3_sacricide&lt;br /&gt;
| -1283.53 -380.68 83.25   15.2 -38.6 0.0&lt;br /&gt;
| [https://forums.thedarkmod.com/index.php?/topic/22241-new-shadow-leaks-in-212-dev-builds/&amp;amp;do=findComment&amp;amp;comment=489895 1]&lt;br /&gt;
| (not yet)&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
	<entry>
		<id>https://wiki.thedarkmod.com/index.php?title=VMWare:_Virtual_machine_with_Linux&amp;diff=30945</id>
		<title>VMWare: Virtual machine with Linux</title>
		<link rel="alternate" type="text/html" href="https://wiki.thedarkmod.com/index.php?title=VMWare:_Virtual_machine_with_Linux&amp;diff=30945"/>
		<updated>2023-12-16T22:09:14Z</updated>

		<summary type="html">&lt;p&gt;Stgatilov: Added r_gpuBufferNonpersistentUpdateMode node.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This guide is originally written for TDM 2.07.&lt;br /&gt;
&lt;br /&gt;
== Intro ==&lt;br /&gt;
&lt;br /&gt;
It is very convenient for a Windows-centric developer to have a Linux virtual machine in his arcenal.&lt;br /&gt;
&lt;br /&gt;
You can read how to set up VirtualBox VM in the article [[VirtualBox: Virtual machine with Linux for TDM]].&lt;br /&gt;
This article is about setting up a VMware VM, which has some benefits over VirtualBox: better performance and OpenGL support.&lt;br /&gt;
&lt;br /&gt;
== Install VMware ==&lt;br /&gt;
&lt;br /&gt;
While Oracle&#039;s VirtualBox is open-source, the VMware product is proprietary in its full sense. As of year 2019, there is [https://www.vmware.com/products/workstation-player.html VMware Workstation Player], which is &#039;&#039;&#039;free for non-commercial use&#039;&#039;&#039;. You can download it on [https://my.vmware.com/en/web/vmware/free#desktop_end_user_computing/vmware_workstation_player this page] (choose Windows version).&lt;br /&gt;
&lt;br /&gt;
Installation is trivial. Most likely, you do &#039;&#039;&#039;not&#039;&#039;&#039; need the &amp;quot;Enhanced Keyboard Driver&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Create VM ==&lt;br /&gt;
&lt;br /&gt;
Start VMware Workstation, click on &amp;quot;Create a New Virtual Machine&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Point &amp;quot;Installer disc image file&amp;quot; to the ISO image of the Linux distro which you want to install (by default it would be [https://www.ubuntu.com/download/desktop Ubuntu LTS]). Click Next.&lt;br /&gt;
&lt;br /&gt;
Choose a name like &amp;quot;Ubuntu XX.YY x64&amp;quot;, set user and password, click Next. Don&#039;t forget to set Location: a typical VM takes 5-10 GB. Leave Disk Capacity settings in defaults: do &#039;&#039;&#039;not&#039;&#039;&#039; use monolithic disk, because it would make some configuring much harder!&lt;br /&gt;
&lt;br /&gt;
As long as you choose reasonable settings and ISO, you should be eligible for &amp;quot;Easy Install&amp;quot;, which means that you&#039;ll get Ubuntu installed for you automatically, along with open-vm-tools. Make sure you have &#039;&#039;&#039;internet access&#039;&#039;&#039; through the whole process, otherwise your installation will be incomplete.&lt;br /&gt;
&lt;br /&gt;
== Client Tools ==&lt;br /&gt;
&lt;br /&gt;
In order to use shared directories and shared clipboard, you need to install some sort of client tools. Unfortunately, this topic is quite messy in VMware world. First of all, there are two such tools available: &#039;&#039;VMware Tools&#039;&#039; is distributed with VMware Player, and &#039;&#039;open-vm-tools&#039;&#039; is intended to be distributed by Linux package manager. Second, default installations of the tools are often buggy and don&#039;t work.&lt;br /&gt;
&lt;br /&gt;
In my case, open-vm-tools 2:10.2.0-3~ubuntu0.16.04.1 was installed automatically by VMware Player 15.0.2 during Easy Install procedure and it did not work well. It mounted the shared folder properly when I added it, but after a full reboot the shared folder was absent. Installing the patches from [https://askubuntu.com/a/726906/918615 this answer] helped. Of course, you need to do &amp;quot;&amp;lt;tt&amp;gt;sudo apt-get install git&amp;lt;/tt&amp;gt;&amp;quot; first.&lt;br /&gt;
&lt;br /&gt;
In order to create shared folder, open &amp;quot;Virtual Machine Settings&amp;quot; (in &amp;quot;Player&amp;quot; -&amp;gt; &amp;quot;Manage&amp;quot;).&lt;br /&gt;
Go to &amp;quot;Options&amp;quot; -&amp;gt; &amp;quot;Shared Folders&amp;quot;, and set it to &amp;quot;Always enabled&amp;quot;. Now &amp;quot;Add&amp;quot; your TDM root directory to make it accessible from within VM. Check that it is available at &amp;lt;tt&amp;gt;/mnt/hgfs/[name_of_share]&amp;lt;/tt&amp;gt;. If it is not there, then I wish you good luck!&lt;br /&gt;
&lt;br /&gt;
== Configure VM ==&lt;br /&gt;
&lt;br /&gt;
When your VM is &#039;&#039;&#039;not&#039;&#039;&#039; running, right-click on VM and go to &amp;quot;Settings&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Choose &amp;quot;Memory&amp;quot;, and increase the amount of Memory available to 4096 MB.&lt;br /&gt;
&lt;br /&gt;
Choose &amp;quot;Processors&amp;quot;, and increase &amp;quot;Number of processor cores&amp;quot; to make TDM build faster. I advise setting it to the number of physical cores you have (6 for me).&lt;br /&gt;
&lt;br /&gt;
Choose &amp;quot;Display&amp;quot;, increase &amp;quot;Graphics memory&amp;quot; to 2 GB.&lt;br /&gt;
&lt;br /&gt;
Click OK to apply changes.&lt;br /&gt;
&lt;br /&gt;
== Clean backup ==&lt;br /&gt;
&lt;br /&gt;
I prefer having the clean VM backed up so that I could restart with a fresh and configured VM at any moment. VMware Player does not support cloning and snapshots, but you can find the directory with your VM data and simply copy the whole directory.&lt;br /&gt;
&lt;br /&gt;
== Build and run TDM ==&lt;br /&gt;
&lt;br /&gt;
Open terminal, change dir to the root source code directory in the shared folder, e.g.:&lt;br /&gt;
&lt;br /&gt;
 cd /mnt/hgfs/thedarkmod/darkmod_src&lt;br /&gt;
&lt;br /&gt;
From here you can build TDM in the usual way, as described in the [[The Dark Mod - Compilation Guide#Linux]]. Of course, you have to install some packages before first build.&lt;br /&gt;
&lt;br /&gt;
In order to run TDM, go to assets root directory, e.g.:&lt;br /&gt;
&lt;br /&gt;
 cd /mnt/hgfs/thedarkmod/darkmod&lt;br /&gt;
&lt;br /&gt;
Run TDM from there:&lt;br /&gt;
 &lt;br /&gt;
 ./thedarkmod.x64&lt;br /&gt;
&lt;br /&gt;
For TDM 2.07, you also have to do &amp;quot;&amp;lt;tt&amp;gt;sudo apt-get install libopenal1&amp;lt;/tt&amp;gt;&amp;quot; beforehand.&lt;br /&gt;
&lt;br /&gt;
Currently VMware seems to support OpenGL 3.0 in general and OpenGL 3.3 Core profile only.&lt;br /&gt;
&lt;br /&gt;
== Mouse look ==&lt;br /&gt;
&lt;br /&gt;
VMware breaks mouse cursor warping in the same way as VirtualBox does. Warping is critical for mouse-look in FPS games, including TDM. Without it, you won&#039;t be able even to navigate through menus.&lt;br /&gt;
&lt;br /&gt;
There are two ways to fix it in case of VMware Player:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VMware-side solution&#039;&#039;&#039;. Make sure the VM is shutdown, open the &amp;lt;tt&amp;gt;.vmx&amp;lt;/tt&amp;gt;-file of your VM and add the following magic lines to it:&lt;br /&gt;
&lt;br /&gt;
 usb.generic.allowHID = &amp;quot;TRUE&amp;quot;&lt;br /&gt;
 mouse.vusb.useBasicMouse = &amp;quot;FALSE&amp;quot;&lt;br /&gt;
 mouse.vusb.enable = &amp;quot;TRUE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Strangely, this is already enough to fix the problem. If your mouse is crazy in TDM, press Ctrl+Alt and click back to VM, and mouse look should return to normal.&lt;br /&gt;
&lt;br /&gt;
Also with these lines, you can passthrough your mouse and keyboard exclusively to VM. In order to do that, click &amp;quot;Player&amp;quot; -&amp;gt; &amp;quot;Removable Devices&amp;quot;, find your mouse/keyboard there and click &amp;quot;Connect&amp;quot;. Make sure that you have spare USB mouse or keyboard connected to computer so that at least some control is left on the host side.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TDM-side hack&#039;&#039;&#039;. Open game console and set &amp;quot;&amp;lt;tt&amp;gt;in_nowarp 1&amp;lt;/tt&amp;gt;&amp;quot; there. &lt;br /&gt;
After that you have a limited mouse-look. You cannot really play with it, but it is enough for clicking through menu and a bit of in-game testing. Use &amp;quot;turn left/right&amp;quot; keys as additional workaround.&lt;br /&gt;
&lt;br /&gt;
== The game runs very slow ==&lt;br /&gt;
&lt;br /&gt;
I have to set cvar &amp;quot;&amp;lt;tt&amp;gt;r_gpuBufferNonpersistentUpdateMode 1&amp;lt;/tt&amp;gt;&amp;quot; locally to get normal performance (supposedly since TDM 2.09).&lt;br /&gt;
With default value of this cvar, TDM rendering is very slow inside VM for some reason.&lt;br /&gt;
Note that this cvar is internal and does not affect normal installations that much.&lt;br /&gt;
&lt;br /&gt;
[[Category: Coding]]&lt;/div&gt;</summary>
		<author><name>Stgatilov</name></author>
	</entry>
</feed>