<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wolfwiki.anime.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bani</id>
	<title>WolfWiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wolfwiki.anime.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bani"/>
	<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php/Special:Contributions/Bani"/>
	<updated>2026-11-08T12:36:57Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=File:File_graph_GraphVizExtensionDummy_dot.png&amp;diff=3080</id>
		<title>File:File graph GraphVizExtensionDummy dot.png</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=File:File_graph_GraphVizExtensionDummy_dot.png&amp;diff=3080"/>
		<updated>2015-11-25T09:07:43Z</updated>

		<summary type="html">&lt;p&gt;Bani: generated by the GraphViz extension from the File page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=File:ETTV_Server_Configuration_digraph_ettv_dot.png&amp;diff=3079</id>
		<title>File:ETTV Server Configuration digraph ettv dot.png</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=File:ETTV_Server_Configuration_digraph_ettv_dot.png&amp;diff=3079"/>
		<updated>2015-11-25T09:01:12Z</updated>

		<summary type="html">&lt;p&gt;Bani: generated by the GraphViz extension from the ETTV:Server Configuration page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GraphViz]][[Category:GraphViz dot]]&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=File:File_graph_GraphVizExtensionDummy_dot.jpeg&amp;diff=3076</id>
		<title>File:File graph GraphVizExtensionDummy dot.jpeg</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=File:File_graph_GraphVizExtensionDummy_dot.jpeg&amp;diff=3076"/>
		<updated>2015-11-25T09:01:03Z</updated>

		<summary type="html">&lt;p&gt;Bani: generated by the GraphViz extension from the File page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=File:File_graph_GraphVizExtensionDummy_dot.jpg&amp;diff=3075</id>
		<title>File:File graph GraphVizExtensionDummy dot.jpg</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=File:File_graph_GraphVizExtensionDummy_dot.jpg&amp;diff=3075"/>
		<updated>2015-11-25T09:01:02Z</updated>

		<summary type="html">&lt;p&gt;Bani: generated by the GraphViz extension from the File page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=ETTV:Server_Configuration&amp;diff=3074</id>
		<title>ETTV:Server Configuration</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=ETTV:Server_Configuration&amp;diff=3074"/>
		<updated>2015-11-25T08:36:23Z</updated>

		<summary type="html">&lt;p&gt;Bani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;graphviz&amp;gt;&lt;br /&gt;
digraph ettv {&lt;br /&gt;
master -&amp;gt; slave1&lt;br /&gt;
master -&amp;gt; slave2&lt;br /&gt;
slave1 -&amp;gt; &amp;quot;client1..&amp;quot;&lt;br /&gt;
slave1 -&amp;gt; &amp;quot;..client50&amp;quot;&lt;br /&gt;
slave2 -&amp;gt; &amp;quot;client51..&amp;quot;&lt;br /&gt;
slave2 -&amp;gt; &amp;quot;..client100&amp;quot;&lt;br /&gt;
slave1 -&amp;gt; &amp;quot;chained_slave1&amp;quot;&lt;br /&gt;
chained_slave1 -&amp;gt; &amp;quot;client101&amp;quot;&lt;br /&gt;
chained_slave1 -&amp;gt; &amp;quot;...client150&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/graphviz&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Installation - &amp;quot;Master&amp;quot; (gameserver)==&lt;br /&gt;
&lt;br /&gt;
Copy ettv.(x86|exe) to the same directory your etded.(x86|exe) is located.&lt;br /&gt;
Start your gameserver as normal, but run ettv.(x86|exe) instead of etded.(x86|exe).&lt;br /&gt;
&lt;br /&gt;
===Set some cvars===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ettv_sv_maxslaves&#039;&#039;&#039; (default 0, no slave connections allowed)&lt;br /&gt;
:Number of ettv slaves allowed to connect.&lt;br /&gt;
:&#039;&#039;Note:&#039;&#039; Slave slots are always reserved, like private slots.&lt;br /&gt;
&#039;&#039;&#039;ettv_password&#039;&#039;&#039; (default &amp;quot;&amp;quot;, no slave connections allowed) &lt;br /&gt;
:Password for ettv slaves.&lt;br /&gt;
:Must be set, or no slaves will be able to connect!&lt;br /&gt;
&#039;&#039;&#039;b_ettv_flags&#039;&#039;&#039; (default 3)&lt;br /&gt;
:1 = prevent slaves from being callvote kicked&lt;br /&gt;
:2 = grant shoutcaster status to slaves&lt;br /&gt;
:values can be added together, eg 3 for both features.&lt;br /&gt;
&lt;br /&gt;
===Playing on the master===&lt;br /&gt;
Players may now connect to your gameserver as normal.&lt;br /&gt;
&lt;br /&gt;
==Installation - &amp;quot;Slave&amp;quot; (broadcast server)==&lt;br /&gt;
&lt;br /&gt;
Copy ettv.(x86|exe) to the same directory your etded.(x86|exe) is located.&lt;br /&gt;
Copy tvgame.mp.i386.(so|dll) to the same directory as your etpro/qagame.mp.i386.(so|dll) is located.&lt;br /&gt;
&lt;br /&gt;
===Set some cvars===&lt;br /&gt;
&#039;&#039;&#039;sv_maxclients&#039;&#039;&#039;&lt;br /&gt;
:Number of spectator clients to allow. This number is only limited by available cpu and memory.&lt;br /&gt;
:Some guidelines when provisioning a broadcast server:&lt;br /&gt;
:*100 spectator slots will require ~ 128mb ram. Use com_hunkmegs to set this.&lt;br /&gt;
:*100 spectator slots will require ~ 768kbyte/sec (6mbits), roughly 6kbyte/sec per client&lt;br /&gt;
:*100 spectator slots will take ~ 80% cpu of a Xeon 2.2ghz&lt;br /&gt;
:*Each slave will require ~20-40kbyte/sec from the master.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ettv_clientname&#039;&#039;&#039; (default &amp;quot;ETTV&amp;quot;)&lt;br /&gt;
:Playername the slave will use when connecting to the master, eg &amp;quot;ETTV-xyz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ettv_delay&#039;&#039;&#039; (default 0, disabled)&lt;br /&gt;
:number of seconds for slave to delay the master feed. Recording/playback chains should no longer be needed, and slaves should always maintain an exact delay from the master server. &lt;br /&gt;
:&#039;&#039;note&#039;&#039;: this should ONLY be set on the slave.&lt;br /&gt;
:&#039;&#039;note&#039;&#039;: only supported in ettv beta8 and later&lt;br /&gt;
&lt;br /&gt;
===Chat passwords===&lt;br /&gt;
In order to curb the rampant abuse of ettv chat, admins may set &amp;quot;chat passwords&amp;quot; on their servers. If enabled, viewers are not allowed to chat unless they have a password. You can define as many passwords as you like, so you can easily track down individual abusers and limit the damage of stolen passwords.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ettv_chatpasswords&#039;&#039;&#039; (default 0, disabled)&lt;br /&gt;
:number of chat passwords defined.&lt;br /&gt;
&#039;&#039;&#039;ettv_chatpassword&#039;&#039;&#039;(1-99999)&lt;br /&gt;
:individual chat passwords.&lt;br /&gt;
&lt;br /&gt;
viewers use &amp;lt;tt&amp;gt;/chatpassword &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;&amp;lt;password&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/tt&amp;gt; to login.&lt;br /&gt;
&lt;br /&gt;
if logged in, ettv chats will be tagged with a number in parentheses identifying which chat password the viewer is using. &lt;br /&gt;
===Misc commands for viewers===&lt;br /&gt;
;For ettv beta 4 and above&lt;br /&gt;
* spectators may &amp;lt;tt&amp;gt;/ignore&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;/unignore&amp;lt;/tt&amp;gt; other spectators&lt;br /&gt;
* &amp;lt;i&amp;gt;semiadmin&amp;lt;/i&amp;gt; functionality now works for slaves&lt;br /&gt;
* rcon may now mute/unmute specs &lt;br /&gt;
&lt;br /&gt;
===Connect the slave===&lt;br /&gt;
Now start your slave server by running ettv.(x86|exe)&lt;br /&gt;
&lt;br /&gt;
Tell the slave server to connect up to the master server:&lt;br /&gt;
:&amp;lt;tt&amp;gt;tv connect master.ip.address:port &amp;lt;i&amp;gt;&amp;lt;b&amp;gt;ettv_password&amp;lt;/b&amp;gt;(required)&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;&amp;lt;b&amp;gt;g_password&amp;lt;/b&amp;gt;(if the master has a g_password set)&amp;lt;/i&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have configured everything correctly, the slave should connect to the master.&lt;br /&gt;
Clients should now be able to connect to the slave and spectate the game in progress.&lt;br /&gt;
&lt;br /&gt;
This is a &amp;quot;live broadcast&amp;quot; with no delay.&lt;br /&gt;
&lt;br /&gt;
===Disconnect the slave===&lt;br /&gt;
To tell the slave to disconnect from the master:&lt;br /&gt;
:&amp;lt;tt&amp;gt;tv disconnect&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Slave Chaining===&lt;br /&gt;
&lt;br /&gt;
==== What is chaining and why chain slaves? ====&lt;br /&gt;
&lt;br /&gt;
ETTV allows chaining slaves together. This very neat feature lets you connect one ETTV slave to another ETTV slave that is broadcasting a match instead of directly to the game server hosting the match. Apart from the &amp;quot;w00t this is very cool&amp;quot; factor, why is this feature so important for admins? Basicly, working in a chained model allows to broadcast a match to a large number of spectators without too much hastle and too many risks for the master server.&lt;br /&gt;
&lt;br /&gt;
Chaining was developped for a simple reason: if you take into account that one ETTV slave connects at an &#039;&#039;&#039;unlimited&#039;&#039;&#039; rate to a master, you really don&#039;t want to connect 15 or 20 slaves to a game server to broadcast let&#039;s say the &#039;&#039;Atlantic Battle&#039;&#039;. Chances are you will bring down the master game server and thus the game. Chaining slaves firmly alleviates the load on the master game server. 2 or 4 of these &#039;&#039;Hubs&#039;&#039; can do the job of delaying the signal and feeding it to other slaves.&lt;br /&gt;
&lt;br /&gt;
Other benefits might include better network performance. If you can choose to either connect your slave to the game server where your connection is not optimal or to a nearby slave who is on a better connection to the master, it might help the quality of your broadcast. Plus you don&#039;t need to record anything when connecting to a delayed slave.&lt;br /&gt;
&lt;br /&gt;
==== Setting up your slave to allow connections from other slaves ====&lt;br /&gt;
&lt;br /&gt;
This part is actually pretty easy. You need to set up your slave as if you were setting up a master game server. This means that, next to the normal slave parameters, you have to set up the following:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;b_ettv_flags&#039;&#039;&#039;: set this to at least 1&lt;br /&gt;
* &#039;&#039;&#039;ettv_sv_maxslaves&#039;&#039;&#039;: set this to at least 1. Depending on how powerful your machine is you can set this number higher. Don&#039;t set it too high though, a slave still connects at an unlimited rate&lt;br /&gt;
* &#039;&#039;&#039;ettv_password&#039;&#039;&#039;: set to something else than &amp;quot;&amp;quot;. This password is needed by the slaves connecting to your slave (together with g_password of course)&lt;br /&gt;
&lt;br /&gt;
Other settings such as ettv_netblast, ettv_tv_iptos etc... can be set as well. You can even use autorecord if you wish, or just add an extra delay.&lt;br /&gt;
&lt;br /&gt;
==== Pitfalls ====&lt;br /&gt;
&lt;br /&gt;
There are however a few risks associated with slave chaining. One of the biggest issues is &#039;&#039;&#039;PK3 dependancies&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
As you know, a slave needs to have at least all the PK3s of the server it connects too. But a slave can have more PK3s installed, as long as it has the ones on the server&#039;s pure list. This is what complicates things! The further you go down the &amp;quot;chain&amp;quot;, the more the chances exist of PK3 pollution, which makes the job of the last slave very hard. And the viewers connecting to that slave will not be very happy either.&lt;br /&gt;
&lt;br /&gt;
So for those of you venturing into chaining slaves here&#039;s a rule of thumb: &#039;&#039;&#039;always keep the installed PK3s to the bare minimum&#039;&#039;&#039;! Do not add stuff you do not need. If you want to know what PK3s you need and not need, connect your slave to the master or the hub, see which PK3s are on the pure list and rename or remove the PK3s that are not on the list. You will make your viewers and other admins connecting to your slave very happy.&lt;br /&gt;
&lt;br /&gt;
Another risk could be &#039;&#039;&#039;chained lag&#039;&#039;&#039;. If one of the slaves that is higher in the chain starts lagging, the consequenses for the slaves depending on it will be seen immedeatily. So if you offer to be one of the higher slaves in the chain, make sure your machine can handle it! An ETTV chain is much like the food chain ;-).&lt;br /&gt;
&lt;br /&gt;
==== Admin contributions ====&lt;br /&gt;
&lt;br /&gt;
If by now you feel like getting your hands dirty in ETTV chaining madness and you want to see some example of hubs, slaves, broadcasters and scripts to get it all working, you can already start by checking out [[User:Deej|deej&#039;s page]].&lt;br /&gt;
&lt;br /&gt;
==ETTV Demos==&lt;br /&gt;
ETTV can record and playback &#039;&#039;&#039;ETTV demos&#039;&#039;&#039;. ETTV demos have the extension .tv_84 (or .tv_83 for older versions) and are completely different from the .dm_84 demos recorded on clients. &lt;br /&gt;
&lt;br /&gt;
You may record the match in progress to a file, with the command:&lt;br /&gt;
:&amp;lt;tt&amp;gt;record &amp;lt;&#039;&#039;&#039;demo name&#039;&#039;&#039;&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
If you omit the demo name, ettv will start recording using a filename of demoXXXX where XXXX is the first available number starting from 0000.&lt;br /&gt;
&lt;br /&gt;
Demos will stop recording when a map changes.&lt;br /&gt;
&lt;br /&gt;
To stop recording a demo:&lt;br /&gt;
:&amp;lt;tt&amp;gt;stoprecord&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To play back a recorded demo:&lt;br /&gt;
:&amp;lt;tt&amp;gt;demo &amp;lt;&#039;&#039;&#039;demo name&#039;&#039;&#039;&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To check the status of an ettv slave:&lt;br /&gt;
:&amp;lt;tt&amp;gt;tv status&amp;lt;/tt&amp;gt;&lt;br /&gt;
This will tell you if the slave is connected to a master, or if it is currently playing back a demo.&lt;br /&gt;
&lt;br /&gt;
To fastforward a demo:&lt;br /&gt;
:&amp;lt;tt&amp;gt;ff &amp;lt;i&amp;gt;&amp;lt;seconds&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
Eg &amp;lt;tt&amp;gt;ff 30&amp;lt;/tt&amp;gt; will fast foward 30 seconds. Fast forward stops at map restarts, so you can safely ff 999 to fast forward through a warmup. &lt;br /&gt;
:&#039;&#039;note&#039;&#039;: requires ettv beta 7 or later&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Autorecording demos===&lt;br /&gt;
ettv is able to automatically continuously record demos, creating new demofiles when the map changes. To do this, set the cvar ettv_autorecord to 1. ettv will start recording demos with the name demoXXXX where XXXX is a number starting at 0000 and incrementing on each map change.&lt;br /&gt;
&lt;br /&gt;
Server admins may find it useful to use the demo recording feature of ettv to record matches, instead of requiring individual players to record them. An ettv demo records everything that happens on a server, including all player viewpoints.&lt;br /&gt;
&lt;br /&gt;
===How to create demo based delayed feeds===&lt;br /&gt;
Autorecording demos is the first half of the process for delayed feeds. Typically you would run a passworded slave server with the smallest number of sv_maxclients possible. No spectators should connect to this server. The only purpose of this slave is to connect up to the master and record the match to sequentially numbered demofiles.&lt;br /&gt;
&lt;br /&gt;
Now start up a slave, and tell it to broadcast the demo being recorded.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tt&amp;gt;demo demo0000&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you wait approx. 60 seconds after the master begins recording before issuing this command to your slaves, then you have a 60 second delay on your broadcast.&lt;br /&gt;
&lt;br /&gt;
If you want slaves to automatically switch to the next demo when the end of the demo is reached (eg on a map change), you would set the cvar ettv_autoplay to 1. If a slave is playing demo0000 and it reaches the end, it will then try to play demo0001 and so on.&lt;br /&gt;
&lt;br /&gt;
Disadvantage of this method: It is not automated in ettv itself, though admins can script it.&lt;br /&gt;
Advantage of this method: You may run multiple broadcast servers from the same single demo stream.&lt;br /&gt;
&lt;br /&gt;
Automated delayed feeds are supported in ettv beta 8. See the above.&lt;br /&gt;
&lt;br /&gt;
===Playing back previously recorded ETTV demos===&lt;br /&gt;
This is essentially the same as delayed feeds above.&lt;br /&gt;
* Configure your server as described in [[ETTV:Server_Configuration#Installation_-_.22Slave.22_.28broadcast_server.29|Slave Installation]] section&lt;br /&gt;
* Obtain the &amp;lt;tt&amp;gt;.tv_*&amp;lt;/tt&amp;gt; demos and place them in &amp;lt;tt&amp;gt;&#039;&#039;fs_game&#039;&#039;/demos&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Start the ettv executable with pb disabled&lt;br /&gt;
* &amp;lt;tt&amp;gt;set ettv_autoplay 1&amp;lt;/tt&amp;gt; if you want to play back sequential demos named &amp;lt;tt&amp;gt;demo0000.tv_84&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;demo0001.tv_84&amp;lt;/tt&amp;gt; etc.&lt;br /&gt;
* &amp;lt;tt&amp;gt;demo &#039;&#039;&#039;&amp;lt;yourdemoname&amp;gt;&#039;&#039;&#039;&amp;lt;/tt&amp;gt;&lt;br /&gt;
* connect a client and enjoy the show!&lt;br /&gt;
&lt;br /&gt;
==Troubleshooting==&lt;br /&gt;
&lt;br /&gt;
* The slave server must be running the same fs_game setting as the master server.&lt;br /&gt;
* The slave server must have a copy of every map pk3 the master server is using.&lt;br /&gt;
* If the master server loads a map the slave server doesn&#039;t have, the slave will get stuck.&lt;br /&gt;
* Spectators will be forced to download any custom pk3 you are using.&lt;br /&gt;
* It is a good idea to keep the master server pk3 list to a minimum.&lt;br /&gt;
* If you are using the autorecord/autoplay feature for running delayed feeds, you will usually want to make sure you clear out the demos directory first. Autorecording will start numbering demofiles using the first available number, so if you have old recorded demos then ettv might start recording from eg demo0017. If your scripts expect to start playback from demo0000 then you might end up broadcasting a game recorded at some earlier date...&lt;br /&gt;
* If the broadcaster constantly reloads on round starts etc, it&#039;s probably a problem with too many pk3s on the ettv servers.&lt;br /&gt;
&lt;br /&gt;
==Miscellaneous==&lt;br /&gt;
* Slaves may send chats to the master with the command msay&lt;br /&gt;
* Slaves may list players on the master with the command players&lt;br /&gt;
&lt;br /&gt;
==Performance tuning==&lt;br /&gt;
&lt;br /&gt;
Spectator servers with large numbers of clients (eg &amp;gt;100) will push the OS very hard with huge amounts of UDP traffic. The default OS buffer settings for Linux are inadequate and can hurt performance, causing lag and/or disconnects.&lt;br /&gt;
&lt;br /&gt;
If you get messages like&lt;br /&gt;
:&amp;lt;tt&amp;gt;NET_SendPacket ERROR: No buffer space available to 192.168.120.142:27960&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then you definitely need to increase your kernel network buffers.&lt;br /&gt;
&lt;br /&gt;
Large spectator servers should increase the kernel buffers.&lt;br /&gt;
&lt;br /&gt;
The following commands should be issued as root on linux:&lt;br /&gt;
:&amp;lt;tt&amp;gt;echo &amp;quot;524288&amp;quot; &amp;gt; /proc/sys/net/core/rmem_max&amp;lt;/tt&amp;gt;&lt;br /&gt;
:&amp;lt;tt&amp;gt;echo &amp;quot;524288&amp;quot; &amp;gt; /proc/sys/net/core/wmem_max&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These values will be lost on a reboot of your system. A good way to reapply the values upon boot is to include the following in your /etc/sysctl.conf:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tt&amp;gt;net.core.rmem_default = 524288&amp;lt;/tt&amp;gt;&lt;br /&gt;
:&amp;lt;tt&amp;gt;net.core.rmem_max = 524288&amp;lt;/tt&amp;gt;&lt;br /&gt;
:&amp;lt;tt&amp;gt;net.core.wmem_default = 524288&amp;lt;/tt&amp;gt;&lt;br /&gt;
:&amp;lt;tt&amp;gt;net.core.wmem_max = 524288&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FreeBSD can try this:&lt;br /&gt;
:&amp;lt;tt&amp;gt;sysctl -w net.inet.udp.recvspace=65535&amp;lt;/tt&amp;gt;&lt;br /&gt;
:&amp;lt;tt&amp;gt;sysctl -w net.inet.udp.maxdgram=57344&amp;lt;/tt&amp;gt;&lt;br /&gt;
:&amp;lt;tt&amp;gt;sysctl -w kern.ipc.maxsockbuf=8388608&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Network tuning cvars===&lt;br /&gt;
;The following are only available in ettv beta 7 and later.&lt;br /&gt;
By default, et uses small packets of 1400 bytes or less to send to clients. If messages need to be larger, they are &#039;fragmented&#039; and sent over several server frames. ettv slave messages tend to be large and often fragment. ettv normally tries to send slaves all fragments at once to avoid jittery playback, but some networks / OSes handle this badly. ettv beta 7 introduces new controls so admins can optimize ettv for their individual network.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ettv_netblast&#039;&#039;&#039; (default 1)&lt;br /&gt;
:by default, ettv tries to send all fragments at once. some networks may handle this badly. Possible values are:&lt;br /&gt;
:* 0 - disable sending all fragments at once. Warning: setting this to 0 without increasing ettv_mtu will result in severely laggy slave playback.&lt;br /&gt;
:* 1 - send all fragments at once (default behaviour)&lt;br /&gt;
:* 2 - use the old (very broken) beta4 netblast behavior (only applicable for ETTV beta 11 &amp;amp; higher)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ettv_mtu&#039;&#039;&#039; (default 1400)&lt;br /&gt;
:; master only&lt;br /&gt;
:if your network / os supports it, you can set this to large values (eg 16000) to prevent message fragmentation and provide smoother ettv links. this cvar has no effect on normal ET clients. &lt;br /&gt;
:&#039;&#039;note&#039;&#039;: ettv_mtu must currently be set from commandline, it cannot be changed on the fly (yet).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ettv_tv_iptos&#039;&#039;&#039; (default 0)&lt;br /&gt;
:you can set the ip type of service field of ettv link packets. if your network/ISP supports it, you can use a value like 16 (&amp;quot;minimize delay&amp;quot;) to prioritize ettv link packets over others on the network.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ettv_sv_iptos&#039;&#039;&#039; (default 0)&lt;br /&gt;
:same as ettv_tv_iptos, but affects packets for normal ET clients.&lt;br /&gt;
&lt;br /&gt;
===Article Reference===&lt;br /&gt;
(x86|exe) refers to the file extension of the ettv file, for linux use .x86 and for windows use .exe&lt;br /&gt;
(so|dll) refers to the file extension of the slave file, for linux use .so and for windows use .dll&lt;br /&gt;
&lt;br /&gt;
[[Category:ETTV]]&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Talk:Lua_Mod_API&amp;diff=2588</id>
		<title>Talk:Lua Mod API</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Talk:Lua_Mod_API&amp;diff=2588"/>
		<updated>2007-01-03T19:52:31Z</updated>

		<summary type="html">&lt;p&gt;Bani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;- et.G_SlotSound( slotnum, soundindex ) -&amp;gt;  Plays the sound soundindex at for the player @ slotnum only. --[[User:RoadKillPuppy|RoadKillPuppy]] 14:17, 16 December 2005 (PST)&lt;br /&gt;
:you can do this with tempentities and SVF_SINGLECLIENT ...&lt;br /&gt;
:--[[User:Bani|Bani]] 17:32, 16 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
some of this can be done via function et_Print(text).. but this would greatly simplify life,&amp;lt;br&amp;gt;&lt;br /&gt;
my wish list for christmas:&amp;lt;br&amp;gt;&lt;br /&gt;
- getUserEguid(cno) - get a client&#039;s etpro guid?&amp;lt;br&amp;gt;&lt;br /&gt;
- repair gentity_set for vec3 - scotty fix the transporter please&amp;lt;br&amp;gt;&lt;br /&gt;
:[http://bani.anime.net/banimod/forums/viewtopic.php?t=6279 fixed.]--[[User:Bani|Bani]] 17:56, 22 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
trap sen server cmd is a ET engine trap the comand u send it send to the client and recived as a server command no a client command&lt;br /&gt;
&lt;br /&gt;
to add ill well that would be al ot of coding for not much [[User:=FF=im2good4u|=FF=Im2good4u]] 12:12, 20 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
aight thnx.&amp;lt;br&amp;gt;&lt;br /&gt;
heres another api request, i&#039;d like to be able to get a clients xp directly. et.gentity_get(cno, &amp;quot;sess.game_points&amp;quot;) seems to return 0 always (?)&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:Hadr0|Hadr0]] 15:38, 21 December 2005 (PST)&lt;br /&gt;
:oh nevermind, i see this can be done now with xp = et.gentity_get(cno, &amp;quot;ps.stats&amp;quot;, 8)&lt;br /&gt;
:nice... --[[User:Hadr0|Hadr0]] 16:58, 23 December 2005 (PST)&lt;br /&gt;
--------&lt;br /&gt;
add a way to determine if a client is 999, and if possible why he&#039;s 999 (loading, connecting, loosing packets, etc)&amp;lt;br&amp;gt;&lt;br /&gt;
--Gotenks&lt;br /&gt;
&lt;br /&gt;
999 means: server has not been sent data from client for &amp;gt; 1000 ms. So there is no way to certainly tell why.&lt;br /&gt;
The timeoutflag is stored in the pmflags IIRC. Don&#039;t know if lua can read them right now. --[[User:Deus|Deus]] 23:12, 22 December 2005 (PST)&amp;lt;br&amp;gt;&lt;br /&gt;
Still would like access to the ping, or a dummy variable if they are 999, but also the ammount of time they are inactive.&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:Gotenks|Gotenks]] (Sorry for double post) 1:53, 31 December 2005 (CST)&lt;br /&gt;
:[http://bani.anime.net/banimod/forums/viewtopic.php?t=6291 fixed].--[[User:Bani|Bani]] 02:40, 7 February 2006 (PST)&lt;br /&gt;
----&lt;br /&gt;
Access to weapon stats during game similar to end of round stats that are displayed.&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:LethalInjection|LethalInjection]] 23:52, 22 December 2005 (PST)&lt;br /&gt;
:[http://bani.anime.net/banimod/forums/viewtopic.php?t=6291 fixed].--[[User:Bani|Bani]] 02:40, 7 February 2006 (PST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
please call &amp;lt;b&amp;gt;et_Obituary()&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;et_Print()&amp;lt;/b&amp;gt; at the end of the engine function because we can do better output then. example: the engine output (ETPlayer killed himself.) is after the lua output (Hahaha! ETPlayer seems to be a selfkill noob!). thx!! --[[User:Pdi|pdi]] 09:13, 26 December 2006 (PST)&lt;br /&gt;
:It is called at the beginning of the function so lua mods can override obituary and print entirely if they want. I can make a separate lua hook which is called at the end of the function, eg et_ObituaryPost and et_PrintPost. [[User:Bani|Bani]] 11:52, 3 January 2007 (PST)&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== IPC stuff ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
i would like a et_IPCReceive whit an return value so u can send info back on a request&lt;br /&gt;
&lt;br /&gt;
i would like a et_IPCSend that can send to all lua mods then them mods can decide if the wana use that message or not&lt;br /&gt;
[[User:=FF=im2good4u|=FF=Im2good4u]] 12:35, 8 January 2006 (PST)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
  et_IPCReceive wouldn&#039;t send it to the other mod... afaik... so just use another send&lt;br /&gt;
  just et_IPCSend to all modules (afaik, you can even send to ones not there), simple loop function&lt;br /&gt;
[[User:gotenks|gotenks]] 20:04, 8 January 2006 (CST)&lt;br /&gt;
&lt;br /&gt;
yeh probely but its not verry handy its better to get the good vmnumber or to e able to send on mod filenames&lt;br /&gt;
&lt;br /&gt;
apart from that returning a value will be more handy since tnhe u cna contine in 1 funtion else u got to reacise it in the recieve funtion [[User:=FF=im2good4u|=FF=Im2good4u]] 10:45, 9 January 2006 (PST)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
bani i need a console print function on the client that does sepport ascii plz [[User:=FF=im2good4u|=FF=Im2good4u]] 12:49, 12 January 2006 (PST)&lt;br /&gt;
:et.trap_SendServerCommand( clientnum, &amp;quot;print \&amp;quot;hello ascii console on the client\n\&amp;quot; ) ) --[[User:Bani|Bani]] 22:33, 15 January 2006 (PST)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
bani: how about a et_sound(id, sound) event? [[User:gotenks|gotenks]] 20:45, 17 January 2006 (CST)&lt;br /&gt;
:[http://wolfwiki.anime.net/index.php/ETPro:Lua_Mod_API#sound et.G_Sound( entnum, soundindex )] --[[User:Bani|Bani]] 22:07, 18 January 2006 (PST)&lt;br /&gt;
:bani, i was referring to an on event call, so when a sound is played et_sound(id,sound) would be called.[[User:gotenks|gotenks]] 21:45, 20 January 2006 (CST)&lt;br /&gt;
::most sounds are clientside... this would not be of much use. --[[User:Bani|Bani]] 04:42, 22 January 2006 (PST)&lt;br /&gt;
:::except for checking when something like a killing spree sound is activated--[[User:gotenks|gotenks]] 07:54, 23 January 2006 (CST)&lt;br /&gt;
:::::There would be no way for you to know what sound was activated. You can&#039;t get a filename from the soundindex.--[[User:Bani|Bani]] 10:19, 24 January 2006 (PST)&lt;br /&gt;
:::::This is a case where IPCSend/IPCReceive would be useful, so mods can notify each other of specific events.--[[User:Bani|Bani]] 02:40, 7 February 2006 (PST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
== Fields for the next release ==&lt;br /&gt;
Is it possible to get a player&#039;s live angles? Fieldname &amp;quot;s.angles&amp;quot; only gives the spawn angles. Tried &amp;quot;rotate&amp;quot;, &amp;quot;s.angles2&amp;quot;, &amp;quot;TargetAngles&amp;quot;, &amp;quot;r.currentAngles&amp;quot; as well but they just give 0.000000 for each element. thanks for any help --[[User:Hadr0|Hadr0]] 01:35, 25 January 2006 (PST)&lt;br /&gt;
:This will be fixed in the next release, where you will get access to ps.viewangles--[[User:Bani|Bani]] 02:33, 7 February 2006 (PST)&lt;br /&gt;
&lt;br /&gt;
Would it be possible to set the player&#039;s liveangle?Just like setting one&#039;s position(origin).I would also like to set player&#039;s velocities(maybe a vec3 field), &#039;speed&#039; is not working.  --[[User:Kotoko|Kotoko]] 06:06, 26 May 2006 (PDT)&lt;br /&gt;
:viewangles is what you want --[[User:ReyalP|ReyalP]] 14:00, 26 May 2006 (PDT)&lt;br /&gt;
Seems i get it ..It WILL BE AVAILABLE at NEXT release ..not now .. right?-_-  [[User:Kotoko|Kotoko]] 22:49, 26 May 2006 (PDT)&lt;br /&gt;
:I think Kotoko wants the &#039;&#039;&#039;ps.velocity&#039;&#039;&#039; field here. It would be a good idea, I think. --[[User:FARMICEUDICAL|FARMICEUDICAL]] 20:23, 5 December 2006 (PST)&lt;br /&gt;
&lt;br /&gt;
bani: please give access to fieldname &#039;s.eventParm&#039;. --[[User:Pdi|pdi]] 01:52, 6 July 2006 (PDT)&lt;br /&gt;
&lt;br /&gt;
bani: RW access to all &amp;quot;sess.*&amp;quot; fields (sess.skillpoints, sess.startskillpoints, sess.startxptotal, ...) would be great. thanx! --[[User:Pdi|pdi]] 05:55, 2 August 2006 (PDT)&lt;br /&gt;
&lt;br /&gt;
bani: please make all &amp;quot;pers.*&amp;quot; fields (pers.clientTimeNudge, pers.clientMaxPackets, ...) available. thanx! --[[User:Pdi|pdi]] 01:04, 17 August 2006 (PDT)&lt;br /&gt;
:you can get timenudge and maxpackets from the userinfo --[[User:ReyalP|ReyalP]] 20:19, 18 August 2006 (PDT)&lt;br /&gt;
::i know, but i ask for all pers.* fields. pers.clientTimeNudge and pers.clientMaxPackets are only examples. :) --[[User:Pdi|pdi]] 01:56, 21 August 2006 (PDT)&lt;br /&gt;
&lt;br /&gt;
bani: will we have rw access to those fields (all sess.* and all pers.*) with next update? please!! --[[User:Pdi|pdi]] 07:02, 19 October 2006 (PDT)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ps.weapon&#039;&#039;&#039;, so arbitrary weapons can be added to or removed from arbitrary classes. For example, trickjump servers don&#039;t like Field Ops spamming airstrikes or artillery, but they do appreciate the ammo they give out. --[[User:FARMICEUDICAL|FARMICEUDICAL]] 21:09, 5 December 2006 (PST)&lt;br /&gt;
: ps.weapon won&#039;t do that for you. ps.weapon&#039;&#039;&#039;s&#039;&#039;&#039; might :) --[[User:ReyalP|ReyalP]] 17:14, 6 December 2006 (PST)&lt;br /&gt;
&lt;br /&gt;
Okay then, &#039;&#039;&#039;ps.weapon&#039;&#039;&#039; so that medics can be set to spawn with the adrenaline needle out instead of the smg. --[[User:FARMICEUDICAL|FARMICEUDICAL]] 03:23, 11 December 2006 (PST)&lt;br /&gt;
&lt;br /&gt;
== LoadLib ==&lt;br /&gt;
&lt;br /&gt;
Add loadlib ppl it says u have lua basic included but not loadlib !!&lt;br /&gt;
&lt;br /&gt;
(on windows it gives an error attept to call global load lin a nil valua)[[User:=FF=im2good4u|=FF=Im2good4u]] 05:16, 15 February 2006 (PST)&lt;br /&gt;
----&lt;br /&gt;
== XP control not just skill ==&lt;br /&gt;
&lt;br /&gt;
I would like to request RW access to the &amp;quot;sess.skillpoints&amp;quot; array&lt;br /&gt;
&lt;br /&gt;
At least a callback on et.G_AddSkillPoints ( &#039;&#039;&#039;cno&#039;&#039;&#039;, &#039;&#039;&#039;skill&#039;&#039;&#039;, &#039;&#039;&#039;points&#039;&#039;&#039; ) [[User:=FF=im2good4u|=FF=Im2good4u]] 07:45, 8 March 2006 (PST)&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Talk:Lua_Mod_API&amp;diff=2587</id>
		<title>Talk:Lua Mod API</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Talk:Lua_Mod_API&amp;diff=2587"/>
		<updated>2007-01-03T19:49:21Z</updated>

		<summary type="html">&lt;p&gt;Bani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;- et.G_SlotSound( slotnum, soundindex ) -&amp;gt;  Plays the sound soundindex at for the player @ slotnum only. --[[User:RoadKillPuppy|RoadKillPuppy]] 14:17, 16 December 2005 (PST)&lt;br /&gt;
:you can do this with tempentities and SVF_SINGLECLIENT ...&lt;br /&gt;
:--[[User:Bani|Bani]] 17:32, 16 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
some of this can be done via function et_Print(text).. but this would greatly simplify life,&amp;lt;br&amp;gt;&lt;br /&gt;
my wish list for christmas:&amp;lt;br&amp;gt;&lt;br /&gt;
- getUserEguid(cno) - get a client&#039;s etpro guid?&amp;lt;br&amp;gt;&lt;br /&gt;
- repair gentity_set for vec3 - scotty fix the transporter please&amp;lt;br&amp;gt;&lt;br /&gt;
:[http://bani.anime.net/banimod/forums/viewtopic.php?t=6279 fixed.]--[[User:Bani|Bani]] 17:56, 22 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
trap sen server cmd is a ET engine trap the comand u send it send to the client and recived as a server command no a client command&lt;br /&gt;
&lt;br /&gt;
to add ill well that would be al ot of coding for not much [[User:=FF=im2good4u|=FF=Im2good4u]] 12:12, 20 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
aight thnx.&amp;lt;br&amp;gt;&lt;br /&gt;
heres another api request, i&#039;d like to be able to get a clients xp directly. et.gentity_get(cno, &amp;quot;sess.game_points&amp;quot;) seems to return 0 always (?)&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:Hadr0|Hadr0]] 15:38, 21 December 2005 (PST)&lt;br /&gt;
:oh nevermind, i see this can be done now with xp = et.gentity_get(cno, &amp;quot;ps.stats&amp;quot;, 8)&lt;br /&gt;
:nice... --[[User:Hadr0|Hadr0]] 16:58, 23 December 2005 (PST)&lt;br /&gt;
--------&lt;br /&gt;
add a way to determine if a client is 999, and if possible why he&#039;s 999 (loading, connecting, loosing packets, etc)&amp;lt;br&amp;gt;&lt;br /&gt;
--Gotenks&lt;br /&gt;
&lt;br /&gt;
999 means: server has not been sent data from client for &amp;gt; 1000 ms. So there is no way to certainly tell why.&lt;br /&gt;
The timeoutflag is stored in the pmflags IIRC. Don&#039;t know if lua can read them right now. --[[User:Deus|Deus]] 23:12, 22 December 2005 (PST)&amp;lt;br&amp;gt;&lt;br /&gt;
Still would like access to the ping, or a dummy variable if they are 999, but also the ammount of time they are inactive.&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:Gotenks|Gotenks]] (Sorry for double post) 1:53, 31 December 2005 (CST)&lt;br /&gt;
:[http://bani.anime.net/banimod/forums/viewtopic.php?t=6291 fixed].--[[User:Bani|Bani]] 02:40, 7 February 2006 (PST)&lt;br /&gt;
----&lt;br /&gt;
Access to weapon stats during game similar to end of round stats that are displayed.&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:LethalInjection|LethalInjection]] 23:52, 22 December 2005 (PST)&lt;br /&gt;
:[http://bani.anime.net/banimod/forums/viewtopic.php?t=6291 fixed].--[[User:Bani|Bani]] 02:40, 7 February 2006 (PST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
please call &amp;lt;b&amp;gt;et_Obituary()&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;et_Print()&amp;lt;/b&amp;gt; at the end of the engine function because we can do better output then. example: the engine output (ETPlayer killed himself.) is after the lua output (Hahaha! ETPlayer seems to be a selfkill noob!). thx!! --[[User:Pdi|pdi]] 09:13, 26 December 2006 (PST)&lt;br /&gt;
:It is called at the beginning of the function so lua mods can override obituary and print entirely if they want. I can make a separate lua hook which is called at the end of the function, eg et_ObituaryPost and et_PrintPost. --&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== IPC stuff ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
i would like a et_IPCReceive whit an return value so u can send info back on a request&lt;br /&gt;
&lt;br /&gt;
i would like a et_IPCSend that can send to all lua mods then them mods can decide if the wana use that message or not&lt;br /&gt;
[[User:=FF=im2good4u|=FF=Im2good4u]] 12:35, 8 January 2006 (PST)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
  et_IPCReceive wouldn&#039;t send it to the other mod... afaik... so just use another send&lt;br /&gt;
  just et_IPCSend to all modules (afaik, you can even send to ones not there), simple loop function&lt;br /&gt;
[[User:gotenks|gotenks]] 20:04, 8 January 2006 (CST)&lt;br /&gt;
&lt;br /&gt;
yeh probely but its not verry handy its better to get the good vmnumber or to e able to send on mod filenames&lt;br /&gt;
&lt;br /&gt;
apart from that returning a value will be more handy since tnhe u cna contine in 1 funtion else u got to reacise it in the recieve funtion [[User:=FF=im2good4u|=FF=Im2good4u]] 10:45, 9 January 2006 (PST)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
bani i need a console print function on the client that does sepport ascii plz [[User:=FF=im2good4u|=FF=Im2good4u]] 12:49, 12 January 2006 (PST)&lt;br /&gt;
:et.trap_SendServerCommand( clientnum, &amp;quot;print \&amp;quot;hello ascii console on the client\n\&amp;quot; ) ) --[[User:Bani|Bani]] 22:33, 15 January 2006 (PST)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
bani: how about a et_sound(id, sound) event? [[User:gotenks|gotenks]] 20:45, 17 January 2006 (CST)&lt;br /&gt;
:[http://wolfwiki.anime.net/index.php/ETPro:Lua_Mod_API#sound et.G_Sound( entnum, soundindex )] --[[User:Bani|Bani]] 22:07, 18 January 2006 (PST)&lt;br /&gt;
:bani, i was referring to an on event call, so when a sound is played et_sound(id,sound) would be called.[[User:gotenks|gotenks]] 21:45, 20 January 2006 (CST)&lt;br /&gt;
::most sounds are clientside... this would not be of much use. --[[User:Bani|Bani]] 04:42, 22 January 2006 (PST)&lt;br /&gt;
:::except for checking when something like a killing spree sound is activated--[[User:gotenks|gotenks]] 07:54, 23 January 2006 (CST)&lt;br /&gt;
:::::There would be no way for you to know what sound was activated. You can&#039;t get a filename from the soundindex.--[[User:Bani|Bani]] 10:19, 24 January 2006 (PST)&lt;br /&gt;
:::::This is a case where IPCSend/IPCReceive would be useful, so mods can notify each other of specific events.--[[User:Bani|Bani]] 02:40, 7 February 2006 (PST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
== Fields for the next release ==&lt;br /&gt;
Is it possible to get a player&#039;s live angles? Fieldname &amp;quot;s.angles&amp;quot; only gives the spawn angles. Tried &amp;quot;rotate&amp;quot;, &amp;quot;s.angles2&amp;quot;, &amp;quot;TargetAngles&amp;quot;, &amp;quot;r.currentAngles&amp;quot; as well but they just give 0.000000 for each element. thanks for any help --[[User:Hadr0|Hadr0]] 01:35, 25 January 2006 (PST)&lt;br /&gt;
:This will be fixed in the next release, where you will get access to ps.viewangles--[[User:Bani|Bani]] 02:33, 7 February 2006 (PST)&lt;br /&gt;
&lt;br /&gt;
Would it be possible to set the player&#039;s liveangle?Just like setting one&#039;s position(origin).I would also like to set player&#039;s velocities(maybe a vec3 field), &#039;speed&#039; is not working.  --[[User:Kotoko|Kotoko]] 06:06, 26 May 2006 (PDT)&lt;br /&gt;
:viewangles is what you want --[[User:ReyalP|ReyalP]] 14:00, 26 May 2006 (PDT)&lt;br /&gt;
Seems i get it ..It WILL BE AVAILABLE at NEXT release ..not now .. right?-_-  [[User:Kotoko|Kotoko]] 22:49, 26 May 2006 (PDT)&lt;br /&gt;
:I think Kotoko wants the &#039;&#039;&#039;ps.velocity&#039;&#039;&#039; field here. It would be a good idea, I think. --[[User:FARMICEUDICAL|FARMICEUDICAL]] 20:23, 5 December 2006 (PST)&lt;br /&gt;
&lt;br /&gt;
bani: please give access to fieldname &#039;s.eventParm&#039;. --[[User:Pdi|pdi]] 01:52, 6 July 2006 (PDT)&lt;br /&gt;
&lt;br /&gt;
bani: RW access to all &amp;quot;sess.*&amp;quot; fields (sess.skillpoints, sess.startskillpoints, sess.startxptotal, ...) would be great. thanx! --[[User:Pdi|pdi]] 05:55, 2 August 2006 (PDT)&lt;br /&gt;
&lt;br /&gt;
bani: please make all &amp;quot;pers.*&amp;quot; fields (pers.clientTimeNudge, pers.clientMaxPackets, ...) available. thanx! --[[User:Pdi|pdi]] 01:04, 17 August 2006 (PDT)&lt;br /&gt;
:you can get timenudge and maxpackets from the userinfo --[[User:ReyalP|ReyalP]] 20:19, 18 August 2006 (PDT)&lt;br /&gt;
::i know, but i ask for all pers.* fields. pers.clientTimeNudge and pers.clientMaxPackets are only examples. :) --[[User:Pdi|pdi]] 01:56, 21 August 2006 (PDT)&lt;br /&gt;
&lt;br /&gt;
bani: will we have rw access to those fields (all sess.* and all pers.*) with next update? please!! --[[User:Pdi|pdi]] 07:02, 19 October 2006 (PDT)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ps.weapon&#039;&#039;&#039;, so arbitrary weapons can be added to or removed from arbitrary classes. For example, trickjump servers don&#039;t like Field Ops spamming airstrikes or artillery, but they do appreciate the ammo they give out. --[[User:FARMICEUDICAL|FARMICEUDICAL]] 21:09, 5 December 2006 (PST)&lt;br /&gt;
: ps.weapon won&#039;t do that for you. ps.weapon&#039;&#039;&#039;s&#039;&#039;&#039; might :) --[[User:ReyalP|ReyalP]] 17:14, 6 December 2006 (PST)&lt;br /&gt;
&lt;br /&gt;
Okay then, &#039;&#039;&#039;ps.weapon&#039;&#039;&#039; so that medics can be set to spawn with the adrenaline needle out instead of the smg. --[[User:FARMICEUDICAL|FARMICEUDICAL]] 03:23, 11 December 2006 (PST)&lt;br /&gt;
&lt;br /&gt;
== LoadLib ==&lt;br /&gt;
&lt;br /&gt;
Add loadlib ppl it says u have lua basic included but not loadlib !!&lt;br /&gt;
&lt;br /&gt;
(on windows it gives an error attept to call global load lin a nil valua)[[User:=FF=im2good4u|=FF=Im2good4u]] 05:16, 15 February 2006 (PST)&lt;br /&gt;
----&lt;br /&gt;
== XP control not just skill ==&lt;br /&gt;
&lt;br /&gt;
I would like to request RW access to the &amp;quot;sess.skillpoints&amp;quot; array&lt;br /&gt;
&lt;br /&gt;
At least a callback on et.G_AddSkillPoints ( &#039;&#039;&#039;cno&#039;&#039;&#039;, &#039;&#039;&#039;skill&#039;&#039;&#039;, &#039;&#039;&#039;points&#039;&#039;&#039; ) [[User:=FF=im2good4u|=FF=Im2good4u]] 07:45, 8 March 2006 (PST)&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Talk:Lua_Mod_API&amp;diff=2386</id>
		<title>Talk:Lua Mod API</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Talk:Lua_Mod_API&amp;diff=2386"/>
		<updated>2006-07-06T22:35:20Z</updated>

		<summary type="html">&lt;p&gt;Bani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;- et.G_SlotSound( slotnum, soundindex ) -&amp;gt;  Plays the sound soundindex at for the player @ slotnum only. --[[User:RoadKillPuppy|RoadKillPuppy]] 14:17, 16 December 2005 (PST)&lt;br /&gt;
:you can do this with tempentities and SVF_SINGLECLIENT ...&lt;br /&gt;
:--[[User:Bani|Bani]] 17:32, 16 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
some of this can be done via function et_Print(text).. but this would greatly simplify life,&amp;lt;br&amp;gt;&lt;br /&gt;
my wish list for christmas:&amp;lt;br&amp;gt;&lt;br /&gt;
- getUserEguid(cno) - get a client&#039;s etpro guid?&amp;lt;br&amp;gt;&lt;br /&gt;
- repair gentity_set for vec3 - scotty fix the transporter please&amp;lt;br&amp;gt;&lt;br /&gt;
:[http://bani.anime.net/banimod/forums/viewtopic.php?t=6279 fixed.]--[[User:Bani|Bani]] 17:56, 22 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
trap sen server cmd is a ET engine trap the comand u send it send to the client and recived as a server command no a client command&lt;br /&gt;
&lt;br /&gt;
to add ill well that would be al ot of coding for not much [[User:=FF=im2good4u|=FF=Im2good4u]] 12:12, 20 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
aight thnx.&amp;lt;br&amp;gt;&lt;br /&gt;
heres another api request, i&#039;d like to be able to get a clients xp directly. et.gentity_get(cno, &amp;quot;sess.game_points&amp;quot;) seems to return 0 always (?)&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:Hadr0|Hadr0]] 15:38, 21 December 2005 (PST)&lt;br /&gt;
:oh nevermind, i see this can be done now with xp = et.gentity_get(cno, &amp;quot;ps.stats&amp;quot;, 8)&lt;br /&gt;
:nice... --[[User:Hadr0|Hadr0]] 16:58, 23 December 2005 (PST)&lt;br /&gt;
--------&lt;br /&gt;
add a way to determine if a client is 999, and if possible why he&#039;s 999 (loading, connecting, loosing packets, etc)&amp;lt;br&amp;gt;&lt;br /&gt;
--Gotenks&lt;br /&gt;
&lt;br /&gt;
999 means: server has not been sent data from client for &amp;gt; 1000 ms. So there is no way to certainly tell why.&lt;br /&gt;
The timeoutflag is stored in the pmflags IIRC. Don&#039;t know if lua can read them right now. --[[User:Deus|Deus]] 23:12, 22 December 2005 (PST)&amp;lt;br&amp;gt;&lt;br /&gt;
Still would like access to the ping, or a dummy variable if they are 999, but also the ammount of time they are inactive.&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:Gotenks|Gotenks]] (Sorry for double post) 1:53, 31 December 2005 (CST)&lt;br /&gt;
:[http://bani.anime.net/banimod/forums/viewtopic.php?t=6291 fixed].--[[User:Bani|Bani]] 02:40, 7 February 2006 (PST)&lt;br /&gt;
----&lt;br /&gt;
Access to weapon stats during game similar to end of round stats that are displayed.&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:LethalInjection|LethalInjection]] 23:52, 22 December 2005 (PST)&lt;br /&gt;
:[http://bani.anime.net/banimod/forums/viewtopic.php?t=6291 fixed].--[[User:Bani|Bani]] 02:40, 7 February 2006 (PST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== IPC stuff ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
i would like a et_IPCReceive whit an return value so u can send info back on a request&lt;br /&gt;
&lt;br /&gt;
i would like a et_IPCSend that can send to all lua mods then them mods can decide if the wana use that message or not&lt;br /&gt;
[[User:=FF=im2good4u|=FF=Im2good4u]] 12:35, 8 January 2006 (PST)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
  et_IPCReceive wouldn&#039;t send it to the other mod... afaik... so just use another send&lt;br /&gt;
  just et_IPCSend to all modules (afaik, you can even send to ones not there), simple loop function&lt;br /&gt;
[[User:gotenks|gotenks]] 20:04, 8 January 2006 (CST)&lt;br /&gt;
&lt;br /&gt;
yeh probely but its not verry handy its better to get the good vmnumber or to e able to send on mod filenames&lt;br /&gt;
&lt;br /&gt;
apart from that returning a value will be more handy since tnhe u cna contine in 1 funtion else u got to reacise it in the recieve funtion [[User:=FF=im2good4u|=FF=Im2good4u]] 10:45, 9 January 2006 (PST)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
bani i need a console print function on the client that does sepport ascii plz [[User:=FF=im2good4u|=FF=Im2good4u]] 12:49, 12 January 2006 (PST)&lt;br /&gt;
:et.trap_SendServerCommand( clientnum, &amp;quot;print \&amp;quot;hello ascii console on the client\n\&amp;quot; ) ) --[[User:Bani|Bani]] 22:33, 15 January 2006 (PST)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
bani: how about a et_sound(id, sound) event? [[User:gotenks|gotenks]] 20:45, 17 January 2006 (CST)&lt;br /&gt;
:[http://wolfwiki.anime.net/index.php/ETPro:Lua_Mod_API#sound et.G_Sound( entnum, soundindex )] --[[User:Bani|Bani]] 22:07, 18 January 2006 (PST)&lt;br /&gt;
:bani, i was referring to an on event call, so when a sound is played et_sound(id,sound) would be called.[[User:gotenks|gotenks]] 21:45, 20 January 2006 (CST)&lt;br /&gt;
::most sounds are clientside... this would not be of much use. --[[User:Bani|Bani]] 04:42, 22 January 2006 (PST)&lt;br /&gt;
:::except for checking when something like a killing spree sound is activated--[[User:gotenks|gotenks]] 07:54, 23 January 2006 (CST)&lt;br /&gt;
:::::There would be no way for you to know what sound was activated. You can&#039;t get a filename from the soundindex.--[[User:Bani|Bani]] 10:19, 24 January 2006 (PST)&lt;br /&gt;
:::::This is a case where IPCSend/IPCReceive would be useful, so mods can notify each other of specific events.--[[User:Bani|Bani]] 02:40, 7 February 2006 (PST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
== Fields for the next release ==&lt;br /&gt;
Is it possible to get a player&#039;s live angles? Fieldname &amp;quot;s.angles&amp;quot; only gives the spawn angles. Tried &amp;quot;rotate&amp;quot;, &amp;quot;s.angles2&amp;quot;, &amp;quot;TargetAngles&amp;quot;, &amp;quot;r.currentAngles&amp;quot; as well but they just give 0.000000 for each element. thanks for any help --[[User:Hadr0|Hadr0]] 01:35, 25 January 2006 (PST)&lt;br /&gt;
:This will be fixed in the next release, where you will get access to ps.viewangles--[[User:Bani|Bani]] 02:33, 7 February 2006 (PST)&lt;br /&gt;
&lt;br /&gt;
Would it be possible to set the player&#039;s liveangle?Just like setting one&#039;s position(origin).I would also like to set player&#039;s velocities(maybe a vec3 field), &#039;speed&#039; is not working.  --[[User:Kotoko|Kotoko]] 06:06, 26 May 2006 (PDT)&lt;br /&gt;
:viewangles is what you want --[[User:ReyalP|ReyalP]] 14:00, 26 May 2006 (PDT)&lt;br /&gt;
Seems i get it ..It WILL BE AVAILABLE at NEXT release ..not now .. right?-_-  [[User:Kotoko|Kotoko]] 22:49, 26 May 2006 (PDT)&lt;br /&gt;
&lt;br /&gt;
bani: please give access to fieldname &#039;s.eventParm&#039;. --[[User:Pdi|pdi]] 01:52, 6 July 2006 (PDT)&lt;br /&gt;
&lt;br /&gt;
== LoadLib ==&lt;br /&gt;
&lt;br /&gt;
Add loadlib ppl it says u have lua basic included but not loadlib !!&lt;br /&gt;
&lt;br /&gt;
(on windows it gives an error attept to call global load lin a nil valua)[[User:=FF=im2good4u|=FF=Im2good4u]] 05:16, 15 February 2006 (PST)&lt;br /&gt;
----&lt;br /&gt;
== XP control not just skill ==&lt;br /&gt;
&lt;br /&gt;
I would like to request RW access to the &amp;quot;sess.skillpoints&amp;quot; array&lt;br /&gt;
&lt;br /&gt;
At least a callback on et.G_AddSkillPoints ( &#039;&#039;&#039;cno&#039;&#039;&#039;, &#039;&#039;&#039;skill&#039;&#039;&#039;, &#039;&#039;&#039;points&#039;&#039;&#039; ) [[User:=FF=im2good4u|=FF=Im2good4u]] 07:45, 8 March 2006 (PST)&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Talk:Lua_Mod_API&amp;diff=2070</id>
		<title>Talk:Lua Mod API</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Talk:Lua_Mod_API&amp;diff=2070"/>
		<updated>2006-02-07T10:40:59Z</updated>

		<summary type="html">&lt;p&gt;Bani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;- et.G_SlotSound( slotnum, soundindex ) -&amp;gt;  Plays the sound soundindex at for the player @ slotnum only. --[[User:RoadKillPuppy|RoadKillPuppy]] 14:17, 16 December 2005 (PST)&lt;br /&gt;
:you can do this with tempentities and SVF_SINGLECLIENT ...&lt;br /&gt;
:--[[User:Bani|Bani]] 17:32, 16 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
some of this can be done via function et_Print(text).. but this would greatly simplify life,&amp;lt;br&amp;gt;&lt;br /&gt;
my wish list for christmas:&amp;lt;br&amp;gt;&lt;br /&gt;
- getUserEguid(cno) - get a client&#039;s etpro guid?&amp;lt;br&amp;gt;&lt;br /&gt;
- repair gentity_set for vec3 - scotty fix the transporter please&amp;lt;br&amp;gt;&lt;br /&gt;
:[http://bani.anime.net/banimod/forums/viewtopic.php?t=6279 fixed.]--[[User:Bani|Bani]] 17:56, 22 December 2005 (PST)&lt;br /&gt;
- et.trap_SendServerCommand(cno, &amp;quot;kill&amp;quot;) - punish client as alternative to setting health&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:Hadr0|Hadr0]] 02:10, 20 December 2005 (PST)&amp;lt;br&amp;gt;&lt;br /&gt;
:You can use et.G_Damage() in the new test version to do that.--[[User:Bani|Bani]] 01:38, 23 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
trap sen server cmd is a ET engine trap the comand u send it send to the client and recived as a server command no a client command&lt;br /&gt;
&lt;br /&gt;
to add ill well that would be al ot of coding for not much [[User:=FF=im2good4u|=FF=Im2good4u]] 12:12, 20 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
aight thnx.&amp;lt;br&amp;gt;&lt;br /&gt;
heres another api request, i&#039;d like to be able to get a clients xp directly. et.gentity_get(cno, &amp;quot;sess.game_points&amp;quot;) seems to return 0 always (?)&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:Hadr0|Hadr0]] 15:38, 21 December 2005 (PST)&lt;br /&gt;
:oh nevermind, i see this can be done now with xp = et.gentity_get(cno, &amp;quot;ps.stats&amp;quot;, 8)&lt;br /&gt;
:nice... --[[User:Hadr0|Hadr0]] 16:58, 23 December 2005 (PST)&lt;br /&gt;
--------&lt;br /&gt;
add a way to determine if a client is 999, and if possible why he&#039;s 999 (loading, connecting, loosing packets, etc)&amp;lt;br&amp;gt;&lt;br /&gt;
--Gotenks&lt;br /&gt;
&lt;br /&gt;
999 means: server has not been sent data from client for &amp;gt; 1000 ms. So there is no way to certainly tell why.&lt;br /&gt;
The timeoutflag is stored in the pmflags IIRC. Don&#039;t know if lua can read them right now. --[[User:Deus|Deus]] 23:12, 22 December 2005 (PST)&amp;lt;br&amp;gt;&lt;br /&gt;
Still would like access to the ping, or a dummy variable if they are 999, but also the ammount of time they are inactive.&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:Gotenks|Gotenks]] (Sorry for double post) 1:53, 31 December 2005 (CST)&lt;br /&gt;
:[http://bani.anime.net/banimod/forums/viewtopic.php?t=6291 fixed].--[[User:Bani|Bani]] 02:40, 7 February 2006 (PST)&lt;br /&gt;
----&lt;br /&gt;
Access to weapon stats during game similar to end of round stats that are displayed.&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:LethalInjection|LethalInjection]] 23:52, 22 December 2005 (PST)&lt;br /&gt;
:[http://bani.anime.net/banimod/forums/viewtopic.php?t=6291 fixed].--[[User:Bani|Bani]] 02:40, 7 February 2006 (PST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== IPC stuff ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
i would like a et_IPCReceive whit an return value so u can send info back on a request&lt;br /&gt;
&lt;br /&gt;
i would like a et_IPCSend that can send to all lua mods then them mods can decide if the wana use that message or not&lt;br /&gt;
[[User:=FF=im2good4u|=FF=Im2good4u]] 12:35, 8 January 2006 (PST)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
  et_IPCReceive wouldn&#039;t send it to the other mod... afaik... so just use another send&lt;br /&gt;
  just et_IPCSend to all modules (afaik, you can even send to ones not there), simple loop function&lt;br /&gt;
[[User:gotenks|gotenks]] 20:04, 8 January 2006 (CST)&lt;br /&gt;
&lt;br /&gt;
yeh probely but its not verry handy its better to get the good vmnumber or to e able to send on mod filenames&lt;br /&gt;
&lt;br /&gt;
apart from that returning a value will be more handy since tnhe u cna contine in 1 funtion else u got to reacise it in the recieve funtion [[User:=FF=im2good4u|=FF=Im2good4u]] 10:45, 9 January 2006 (PST)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
bani i need a console print function on the client that does sepport ascii plz [[User:=FF=im2good4u|=FF=Im2good4u]] 12:49, 12 January 2006 (PST)&lt;br /&gt;
:et.trap_SendServerCommand( clientnum, &amp;quot;print \&amp;quot;hello ascii console on the client\n\&amp;quot; ) ) --[[User:Bani|Bani]] 22:33, 15 January 2006 (PST)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
bani: how about a et_sound(id, sound) event? [[User:gotenks|gotenks]] 20:45, 17 January 2006 (CST)&lt;br /&gt;
:[http://wolfwiki.anime.net/index.php/ETPro:Lua_Mod_API#sound et.G_Sound( entnum, soundindex )] --[[User:Bani|Bani]] 22:07, 18 January 2006 (PST)&lt;br /&gt;
:bani, i was referring to an on event call, so when a sound is played et_sound(id,sound) would be called.[[User:gotenks|gotenks]] 21:45, 20 January 2006 (CST)&lt;br /&gt;
::most sounds are clientside... this would not be of much use. --[[User:Bani|Bani]] 04:42, 22 January 2006 (PST)&lt;br /&gt;
:::except for checking when something like a killing spree sound is activated--[[User:gotenks|gotenks]] 07:54, 23 January 2006 (CST)&lt;br /&gt;
:::::There would be no way for you to know what sound was activated. You can&#039;t get a filename from the soundindex.--[[User:Bani|Bani]] 10:19, 24 January 2006 (PST)&lt;br /&gt;
:::::This is a case where IPCSend/IPCReceive would be useful, so mods can notify each other of specific events.--[[User:Bani|Bani]] 02:40, 7 February 2006 (PST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Is it possible to get a player&#039;s live angles? Fieldname &amp;quot;s.angles&amp;quot; only gives the spawn angles. Tried &amp;quot;rotate&amp;quot;, &amp;quot;s.angles2&amp;quot;, &amp;quot;TargetAngles&amp;quot;, &amp;quot;r.currentAngles&amp;quot; as well but they just give 0.000000 for each element. thanks for any help --[[User:Hadr0|Hadr0]] 01:35, 25 January 2006 (PST)&lt;br /&gt;
:This will be fixed in the next release, where you will get access to ps.viewangles--[[User:Bani|Bani]] 02:33, 7 February 2006 (PST)&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Talk:Lua_Mod_API&amp;diff=2069</id>
		<title>Talk:Lua Mod API</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Talk:Lua_Mod_API&amp;diff=2069"/>
		<updated>2006-02-07T10:33:38Z</updated>

		<summary type="html">&lt;p&gt;Bani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;- et.G_SlotSound( slotnum, soundindex ) -&amp;gt;  Plays the sound soundindex at for the player @ slotnum only. --[[User:RoadKillPuppy|RoadKillPuppy]] 14:17, 16 December 2005 (PST)&lt;br /&gt;
:you can do this with tempentities and SVF_SINGLECLIENT ...&lt;br /&gt;
:--[[User:Bani|Bani]] 17:32, 16 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
some of this can be done via function et_Print(text).. but this would greatly simplify life,&amp;lt;br&amp;gt;&lt;br /&gt;
my wish list for christmas:&amp;lt;br&amp;gt;&lt;br /&gt;
- getUserEguid(cno) - get a client&#039;s etpro guid?&amp;lt;br&amp;gt;&lt;br /&gt;
- repair gentity_set for vec3 - scotty fix the transporter please&amp;lt;br&amp;gt;&lt;br /&gt;
:[http://bani.anime.net/banimod/forums/viewtopic.php?t=6279 fixed.]--[[User:Bani|Bani]] 17:56, 22 December 2005 (PST)&lt;br /&gt;
- et.trap_SendServerCommand(cno, &amp;quot;kill&amp;quot;) - punish client as alternative to setting health&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:Hadr0|Hadr0]] 02:10, 20 December 2005 (PST)&amp;lt;br&amp;gt;&lt;br /&gt;
:You can use et.G_Damage() in the new test version to do that.--[[User:Bani|Bani]] 01:38, 23 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
trap sen server cmd is a ET engine trap the comand u send it send to the client and recived as a server command no a client command&lt;br /&gt;
&lt;br /&gt;
to add ill well that would be al ot of coding for not much [[User:=FF=im2good4u|=FF=Im2good4u]] 12:12, 20 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
aight thnx.&amp;lt;br&amp;gt;&lt;br /&gt;
heres another api request, i&#039;d like to be able to get a clients xp directly. et.gentity_get(cno, &amp;quot;sess.game_points&amp;quot;) seems to return 0 always (?)&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:Hadr0|Hadr0]] 15:38, 21 December 2005 (PST)&lt;br /&gt;
:oh nevermind, i see this can be done now with xp = et.gentity_get(cno, &amp;quot;ps.stats&amp;quot;, 8)&lt;br /&gt;
:nice... --[[User:Hadr0|Hadr0]] 16:58, 23 December 2005 (PST)&lt;br /&gt;
--------&lt;br /&gt;
add a way to determine if a client is 999, and if possible why he&#039;s 999 (loading, connecting, loosing packets, etc)&amp;lt;br&amp;gt;&lt;br /&gt;
--Gotenks&lt;br /&gt;
&lt;br /&gt;
999 means: server has not been sent data from client for &amp;gt; 1000 ms. So there is no way to certainly tell why.&lt;br /&gt;
The timeoutflag is stored in the pmflags IIRC. Don&#039;t know if lua can read them right now. --[[User:Deus|Deus]] 23:12, 22 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Access to weapon stats during game similar to end of round stats that are displayed.&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:LethalInjection|LethalInjection]] 23:52, 22 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Still would like access to the ping, or a dummy variable if they are 999, but also the ammount of time they are inactive.&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:Gotenks|Gotenks]] (Sorry for double post) 1:53, 31 December 2005 (CST)&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== IPC stuff ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
i would like a et_IPCReceive whit an return value so u can send info back on a request&lt;br /&gt;
&lt;br /&gt;
i would like a et_IPCSend that can send to all lua mods then them mods can decide if the wana use that message or not&lt;br /&gt;
[[User:=FF=im2good4u|=FF=Im2good4u]] 12:35, 8 January 2006 (PST)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
  et_IPCReceive wouldn&#039;t send it to the other mod... afaik... so just use another send&lt;br /&gt;
  just et_IPCSend to all modules (afaik, you can even send to ones not there), simple loop function&lt;br /&gt;
[[User:gotenks|gotenks]] 20:04, 8 January 2006 (CST)&lt;br /&gt;
&lt;br /&gt;
yeh probely but its not verry handy its better to get the good vmnumber or to e able to send on mod filenames&lt;br /&gt;
&lt;br /&gt;
apart from that returning a value will be more handy since tnhe u cna contine in 1 funtion else u got to reacise it in the recieve funtion [[User:=FF=im2good4u|=FF=Im2good4u]] 10:45, 9 January 2006 (PST)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
bani i need a console print function on the client that does sepport ascii plz [[User:=FF=im2good4u|=FF=Im2good4u]] 12:49, 12 January 2006 (PST)&lt;br /&gt;
:et.trap_SendServerCommand( clientnum, &amp;quot;print \&amp;quot;hello ascii console on the client\n\&amp;quot; ) ) --[[User:Bani|Bani]] 22:33, 15 January 2006 (PST)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
bani: how about a et_sound(id, sound) event? [[User:gotenks|gotenks]] 20:45, 17 January 2006 (CST)&lt;br /&gt;
:[http://wolfwiki.anime.net/index.php/ETPro:Lua_Mod_API#sound et.G_Sound( entnum, soundindex )] --[[User:Bani|Bani]] 22:07, 18 January 2006 (PST)&lt;br /&gt;
:bani, i was referring to an on event call, so when a sound is played et_sound(id,sound) would be called.[[User:gotenks|gotenks]] 21:45, 20 January 2006 (CST)&lt;br /&gt;
::most sounds are clientside... this would not be of much use. --[[User:Bani|Bani]] 04:42, 22 January 2006 (PST)&lt;br /&gt;
:::except for checking when something like a killing spree sound is activated--[[User:gotenks|gotenks]] 07:54, 23 January 2006 (CST)&lt;br /&gt;
:::::There would be no way for you to know what sound was activated. You can&#039;t get a filename from the soundindex.--[[User:Bani|Bani]] 10:19, 24 January 2006 (PST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Is it possible to get a player&#039;s live angles? Fieldname &amp;quot;s.angles&amp;quot; only gives the spawn angles. Tried &amp;quot;rotate&amp;quot;, &amp;quot;s.angles2&amp;quot;, &amp;quot;TargetAngles&amp;quot;, &amp;quot;r.currentAngles&amp;quot; as well but they just give 0.000000 for each element. thanks for any help --[[User:Hadr0|Hadr0]] 01:35, 25 January 2006 (PST)&lt;br /&gt;
:This will be fixed in the next release, where you will get access to ps.viewangles--[[User:Bani|Bani]] 02:33, 7 February 2006 (PST)&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Talk:Lua_Mod_API&amp;diff=2063</id>
		<title>Talk:Lua Mod API</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Talk:Lua_Mod_API&amp;diff=2063"/>
		<updated>2006-01-24T18:19:47Z</updated>

		<summary type="html">&lt;p&gt;Bani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;- et.G_SlotSound( slotnum, soundindex ) -&amp;gt;  Plays the sound soundindex at for the player @ slotnum only. --[[User:RoadKillPuppy|RoadKillPuppy]] 14:17, 16 December 2005 (PST)&lt;br /&gt;
:you can do this with tempentities and SVF_SINGLECLIENT ...&lt;br /&gt;
:--[[User:Bani|Bani]] 17:32, 16 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
some of this can be done via function et_Print(text).. but this would greatly simplify life,&amp;lt;br&amp;gt;&lt;br /&gt;
my wish list for christmas:&amp;lt;br&amp;gt;&lt;br /&gt;
- getUserEguid(cno) - get a client&#039;s etpro guid?&amp;lt;br&amp;gt;&lt;br /&gt;
- repair gentity_set for vec3 - scotty fix the transporter please&amp;lt;br&amp;gt;&lt;br /&gt;
:[http://bani.anime.net/banimod/forums/viewtopic.php?t=6279 fixed.]--[[User:Bani|Bani]] 17:56, 22 December 2005 (PST)&lt;br /&gt;
- et.trap_SendServerCommand(cno, &amp;quot;kill&amp;quot;) - punish client as alternative to setting health&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:Hadr0|Hadr0]] 02:10, 20 December 2005 (PST)&amp;lt;br&amp;gt;&lt;br /&gt;
:You can use et.G_Damage() in the new test version to do that.--[[User:Bani|Bani]] 01:38, 23 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
trap sen server cmd is a ET engine trap the comand u send it send to the client and recived as a server command no a client command&lt;br /&gt;
&lt;br /&gt;
to add ill well that would be al ot of coding for not much [[User:=FF=im2good4u|=FF=Im2good4u]] 12:12, 20 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
aight thnx.&amp;lt;br&amp;gt;&lt;br /&gt;
heres another api request, i&#039;d like to be able to get a clients xp directly. et.gentity_get(cno, &amp;quot;sess.game_points&amp;quot;) seems to return 0 always (?)&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:Hadr0|Hadr0]] 15:38, 21 December 2005 (PST)&lt;br /&gt;
:oh nevermind, i see this can be done now with xp = et.gentity_get(cno, &amp;quot;ps.stats&amp;quot;, 8)&lt;br /&gt;
:nice... --[[User:Hadr0|Hadr0]] 16:58, 23 December 2005 (PST)&lt;br /&gt;
--------&lt;br /&gt;
add a way to determine if a client is 999, and if possible why he&#039;s 999 (loading, connecting, loosing packets, etc)&amp;lt;br&amp;gt;&lt;br /&gt;
--Gotenks&lt;br /&gt;
&lt;br /&gt;
999 means: server has not been sent data from client for &amp;gt; 1000 ms. So there is no way to certainly tell why.&lt;br /&gt;
The timeoutflag is stored in the pmflags IIRC. Don&#039;t know if lua can read them right now. --[[User:Deus|Deus]] 23:12, 22 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Access to weapon stats during game similar to end of round stats that are displayed.&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:LethalInjection|LethalInjection]] 23:52, 22 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Still would like access to the ping, or a dummy variable if they are 999, but also the ammount of time they are inactive.&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:Gotenks|Gotenks]] (Sorry for double post) 1:53, 31 December 2005 (CST)&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== IPC stuff ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
i would like a et_IPCReceive whit an return value so u can send info back on a request&lt;br /&gt;
&lt;br /&gt;
i would like a et_IPCSend that can send to all lua mods then them mods can decide if the wana use that message or not&lt;br /&gt;
[[User:=FF=im2good4u|=FF=Im2good4u]] 12:35, 8 January 2006 (PST)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
  et_IPCReceive wouldn&#039;t send it to the other mod... afaik... so just use another send&lt;br /&gt;
  just et_IPCSend to all modules (afaik, you can even send to ones not there), simple loop function&lt;br /&gt;
[[User:gotenks|gotenks]] 20:04, 8 January 2006 (CST)&lt;br /&gt;
&lt;br /&gt;
yeh probely but its not verry handy its better to get the good vmnumber or to e able to send on mod filenames&lt;br /&gt;
&lt;br /&gt;
apart from that returning a value will be more handy since tnhe u cna contine in 1 funtion else u got to reacise it in the recieve funtion [[User:=FF=im2good4u|=FF=Im2good4u]] 10:45, 9 January 2006 (PST)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
bani i need a console print function on the client that does sepport ascii plz [[User:=FF=im2good4u|=FF=Im2good4u]] 12:49, 12 January 2006 (PST)&lt;br /&gt;
:et.trap_SendServerCommand( clientnum, &amp;quot;print \&amp;quot;hello ascii console on the client\n\&amp;quot; ) ) --[[User:Bani|Bani]] 22:33, 15 January 2006 (PST)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
bani: how about a et_sound(id, sound) event? [[User:gotenks|gotenks]] 20:45, 17 January 2006 (CST)&lt;br /&gt;
:[http://wolfwiki.anime.net/index.php/ETPro:Lua_Mod_API#sound et.G_Sound( entnum, soundindex )] --[[User:Bani|Bani]] 22:07, 18 January 2006 (PST)&lt;br /&gt;
:bani, i was referring to an on event call, so when a sound is played et_sound(id,sound) would be called.[[User:gotenks|gotenks]] 21:45, 20 January 2006 (CST)&lt;br /&gt;
::most sounds are clientside... this would not be of much use. --[[User:Bani|Bani]] 04:42, 22 January 2006 (PST)&lt;br /&gt;
:::except for checking when something like a killing spree sound is activated--[[User:gotenks|gotenks]] 07:54, 23 January 2006 (CST)&lt;br /&gt;
:::::There would be no way for you to know what sound was activated. You can&#039;t get a filename from the soundindex.--[[User:Bani|Bani]] 10:19, 24 January 2006 (PST)&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Talk:Lua_Mod_API&amp;diff=2056</id>
		<title>Talk:Lua Mod API</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Talk:Lua_Mod_API&amp;diff=2056"/>
		<updated>2006-01-22T12:42:48Z</updated>

		<summary type="html">&lt;p&gt;Bani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;- et.G_SlotSound( slotnum, soundindex ) -&amp;gt;  Plays the sound soundindex at for the player @ slotnum only. --[[User:RoadKillPuppy|RoadKillPuppy]] 14:17, 16 December 2005 (PST)&lt;br /&gt;
:you can do this with tempentities and SVF_SINGLECLIENT ...&lt;br /&gt;
:--[[User:Bani|Bani]] 17:32, 16 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
some of this can be done via function et_Print(text).. but this would greatly simplify life,&amp;lt;br&amp;gt;&lt;br /&gt;
my wish list for christmas:&amp;lt;br&amp;gt;&lt;br /&gt;
- getUserEguid(cno) - get a client&#039;s etpro guid?&amp;lt;br&amp;gt;&lt;br /&gt;
- repair gentity_set for vec3 - scotty fix the transporter please&amp;lt;br&amp;gt;&lt;br /&gt;
:[http://bani.anime.net/banimod/forums/viewtopic.php?t=6279 fixed.]--[[User:Bani|Bani]] 17:56, 22 December 2005 (PST)&lt;br /&gt;
- et.trap_SendServerCommand(cno, &amp;quot;kill&amp;quot;) - punish client as alternative to setting health&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:Hadr0|Hadr0]] 02:10, 20 December 2005 (PST)&amp;lt;br&amp;gt;&lt;br /&gt;
:You can use et.G_Damage() in the new test version to do that.--[[User:Bani|Bani]] 01:38, 23 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
trap sen server cmd is a ET engine trap the comand u send it send to the client and recived as a server command no a client command&lt;br /&gt;
&lt;br /&gt;
to add ill well that would be al ot of coding for not much [[User:=FF=im2good4u|=FF=Im2good4u]] 12:12, 20 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
aight thnx.&amp;lt;br&amp;gt;&lt;br /&gt;
heres another api request, i&#039;d like to be able to get a clients xp directly. et.gentity_get(cno, &amp;quot;sess.game_points&amp;quot;) seems to return 0 always (?)&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:Hadr0|Hadr0]] 15:38, 21 December 2005 (PST)&lt;br /&gt;
:oh nevermind, i see this can be done now with xp = et.gentity_get(cno, &amp;quot;ps.stats&amp;quot;, 8)&lt;br /&gt;
:nice... --[[User:Hadr0|Hadr0]] 16:58, 23 December 2005 (PST)&lt;br /&gt;
--------&lt;br /&gt;
add a way to determine if a client is 999, and if possible why he&#039;s 999 (loading, connecting, loosing packets, etc)&amp;lt;br&amp;gt;&lt;br /&gt;
--Gotenks&lt;br /&gt;
&lt;br /&gt;
999 means: server has not been sent data from client for &amp;gt; 1000 ms. So there is no way to certainly tell why.&lt;br /&gt;
The timeoutflag is stored in the pmflags IIRC. Don&#039;t know if lua can read them right now. --[[User:Deus|Deus]] 23:12, 22 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Access to weapon stats during game similar to end of round stats that are displayed.&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:LethalInjection|LethalInjection]] 23:52, 22 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Still would like access to the ping, or a dummy variable if they are 999, but also the ammount of time they are inactive.&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:Gotenks|Gotenks]] (Sorry for double post) 1:53, 31 December 2005 (CST)&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== IPC stuff ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
i would like a et_IPCReceive whit an return value so u can send info back on a request&lt;br /&gt;
&lt;br /&gt;
i would like a et_IPCSend that can send to all lua mods then them mods can decide if the wana use that message or not&lt;br /&gt;
[[User:=FF=im2good4u|=FF=Im2good4u]] 12:35, 8 January 2006 (PST)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
  et_IPCReceive wouldn&#039;t send it to the other mod... afaik... so just use another send&lt;br /&gt;
  just et_IPCSend to all modules (afaik, you can even send to ones not there), simple loop function&lt;br /&gt;
[[User:gotenks|gotenks]] 20:04, 8 January 2006 (CST)&lt;br /&gt;
&lt;br /&gt;
yeh probely but its not verry handy its better to get the good vmnumber or to e able to send on mod filenames&lt;br /&gt;
&lt;br /&gt;
apart from that returning a value will be more handy since tnhe u cna contine in 1 funtion else u got to reacise it in the recieve funtion [[User:=FF=im2good4u|=FF=Im2good4u]] 10:45, 9 January 2006 (PST)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
bani i need a console print function on the client that does sepport ascii plz [[User:=FF=im2good4u|=FF=Im2good4u]] 12:49, 12 January 2006 (PST)&lt;br /&gt;
:et.trap_SendServerCommand( clientnum, &amp;quot;print \&amp;quot;hello ascii console on the client\n\&amp;quot; ) ) --[[User:Bani|Bani]] 22:33, 15 January 2006 (PST)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
bani: how about a et_sound(id, sound) event? [[User:gotenks|gotenks]] 20:45, 17 January 2006 (CST)&lt;br /&gt;
:[http://wolfwiki.anime.net/index.php/ETPro:Lua_Mod_API#sound et.G_Sound( entnum, soundindex )] --[[User:Bani|Bani]] 22:07, 18 January 2006 (PST)&lt;br /&gt;
:bani, i was referring to an on event call, so when a sound is played et_sound(id,sound) would be called.[[User:gotenks|gotenks]] 21:45, 20 January 2006 (CST)&lt;br /&gt;
::most sounds are clientside... this would not be of much use. --[[User:Bani|Bani]] 04:42, 22 January 2006 (PST)&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Talk:Lua_Mod_API&amp;diff=2053</id>
		<title>Talk:Lua Mod API</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Talk:Lua_Mod_API&amp;diff=2053"/>
		<updated>2006-01-19T06:07:46Z</updated>

		<summary type="html">&lt;p&gt;Bani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;- et.G_SlotSound( slotnum, soundindex ) -&amp;gt;  Plays the sound soundindex at for the player @ slotnum only. --[[User:RoadKillPuppy|RoadKillPuppy]] 14:17, 16 December 2005 (PST)&lt;br /&gt;
:you can do this with tempentities and SVF_SINGLECLIENT ...&lt;br /&gt;
:--[[User:Bani|Bani]] 17:32, 16 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
some of this can be done via function et_Print(text).. but this would greatly simplify life,&amp;lt;br&amp;gt;&lt;br /&gt;
my wish list for christmas:&amp;lt;br&amp;gt;&lt;br /&gt;
- getUserEguid(cno) - get a client&#039;s etpro guid?&amp;lt;br&amp;gt;&lt;br /&gt;
- repair gentity_set for vec3 - scotty fix the transporter please&amp;lt;br&amp;gt;&lt;br /&gt;
:[http://bani.anime.net/banimod/forums/viewtopic.php?t=6279 fixed.]--[[User:Bani|Bani]] 17:56, 22 December 2005 (PST)&lt;br /&gt;
- et.trap_SendServerCommand(cno, &amp;quot;kill&amp;quot;) - punish client as alternative to setting health&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:Hadr0|Hadr0]] 02:10, 20 December 2005 (PST)&amp;lt;br&amp;gt;&lt;br /&gt;
:You can use et.G_Damage() in the new test version to do that.--[[User:Bani|Bani]] 01:38, 23 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
trap sen server cmd is a ET engine trap the comand u send it send to the client and recived as a server command no a client command&lt;br /&gt;
&lt;br /&gt;
to add ill well that would be al ot of coding for not much [[User:=FF=im2good4u|=FF=Im2good4u]] 12:12, 20 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
aight thnx.&amp;lt;br&amp;gt;&lt;br /&gt;
heres another api request, i&#039;d like to be able to get a clients xp directly. et.gentity_get(cno, &amp;quot;sess.game_points&amp;quot;) seems to return 0 always (?)&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:Hadr0|Hadr0]] 15:38, 21 December 2005 (PST)&lt;br /&gt;
:oh nevermind, i see this can be done now with xp = et.gentity_get(cno, &amp;quot;ps.stats&amp;quot;, 8)&lt;br /&gt;
:nice... --[[User:Hadr0|Hadr0]] 16:58, 23 December 2005 (PST)&lt;br /&gt;
--------&lt;br /&gt;
add a way to determine if a client is 999, and if possible why he&#039;s 999 (loading, connecting, loosing packets, etc)&amp;lt;br&amp;gt;&lt;br /&gt;
--Gotenks&lt;br /&gt;
&lt;br /&gt;
999 means: server has not been sent data from client for &amp;gt; 1000 ms. So there is no way to certainly tell why.&lt;br /&gt;
The timeoutflag is stored in the pmflags IIRC. Don&#039;t know if lua can read them right now. --[[User:Deus|Deus]] 23:12, 22 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Access to weapon stats during game similar to end of round stats that are displayed.&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:LethalInjection|LethalInjection]] 23:52, 22 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Still would like access to the ping, or a dummy variable if they are 999, but also the ammount of time they are inactive.&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:Gotenks|Gotenks]] (Sorry for double post) 1:53, 31 December 2005 (CST)&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== IPC stuff ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
i would like a et_IPCReceive whit an return value so u can send info back on a request&lt;br /&gt;
&lt;br /&gt;
i would like a et_IPCSend that can send to all lua mods then them mods can decide if the wana use that message or not&lt;br /&gt;
[[User:=FF=im2good4u|=FF=Im2good4u]] 12:35, 8 January 2006 (PST)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
  et_IPCReceive wouldn&#039;t send it to the other mod... afaik... so just use another send&lt;br /&gt;
  just et_IPCSend to all modules (afaik, you can even send to ones not there), simple loop function&lt;br /&gt;
[[User:gotenks|gotenks]] 20:04, 8 January 2006 (CST)&lt;br /&gt;
&lt;br /&gt;
yeh probely but its not verry handy its better to get the good vmnumber or to e able to send on mod filenames&lt;br /&gt;
&lt;br /&gt;
apart from that returning a value will be more handy since tnhe u cna contine in 1 funtion else u got to reacise it in the recieve funtion [[User:=FF=im2good4u|=FF=Im2good4u]] 10:45, 9 January 2006 (PST)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
bani i need a console print function on the client that does sepport ascii plz [[User:=FF=im2good4u|=FF=Im2good4u]] 12:49, 12 January 2006 (PST)&lt;br /&gt;
:et.trap_SendServerCommand( clientnum, &amp;quot;print \&amp;quot;hello ascii console on the client\n\&amp;quot; ) ) --[[User:Bani|Bani]] 22:33, 15 January 2006 (PST)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
bani: how about a et_sound(id, sound) event? [[User:gotenks|gotenks]] 20:45, 17 January 2006 (CST)&lt;br /&gt;
:[http://wolfwiki.anime.net/index.php/ETPro:Lua_Mod_API#sound et.G_Sound( entnum, soundindex )] --[[User:Bani|Bani]] 22:07, 18 January 2006 (PST)&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Talk:Lua_Mod_API&amp;diff=2050</id>
		<title>Talk:Lua Mod API</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Talk:Lua_Mod_API&amp;diff=2050"/>
		<updated>2006-01-16T06:33:36Z</updated>

		<summary type="html">&lt;p&gt;Bani: /* IPC stuff */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;- et.G_SlotSound( slotnum, soundindex ) -&amp;gt;  Plays the sound soundindex at for the player @ slotnum only. --[[User:RoadKillPuppy|RoadKillPuppy]] 14:17, 16 December 2005 (PST)&lt;br /&gt;
:you can do this with tempentities and SVF_SINGLECLIENT ...&lt;br /&gt;
:--[[User:Bani|Bani]] 17:32, 16 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
some of this can be done via function et_Print(text).. but this would greatly simplify life,&amp;lt;br&amp;gt;&lt;br /&gt;
my wish list for christmas:&amp;lt;br&amp;gt;&lt;br /&gt;
- getUserEguid(cno) - get a client&#039;s etpro guid?&amp;lt;br&amp;gt;&lt;br /&gt;
- repair gentity_set for vec3 - scotty fix the transporter please&amp;lt;br&amp;gt;&lt;br /&gt;
:[http://bani.anime.net/banimod/forums/viewtopic.php?t=6279 fixed.]--[[User:Bani|Bani]] 17:56, 22 December 2005 (PST)&lt;br /&gt;
- et.trap_SendServerCommand(cno, &amp;quot;kill&amp;quot;) - punish client as alternative to setting health&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:Hadr0|Hadr0]] 02:10, 20 December 2005 (PST)&amp;lt;br&amp;gt;&lt;br /&gt;
:You can use et.G_Damage() in the new test version to do that.--[[User:Bani|Bani]] 01:38, 23 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
trap sen server cmd is a ET engine trap the comand u send it send to the client and recived as a server command no a client command&lt;br /&gt;
&lt;br /&gt;
to add ill well that would be al ot of coding for not much [[User:=FF=im2good4u|=FF=Im2good4u]] 12:12, 20 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
aight thnx.&amp;lt;br&amp;gt;&lt;br /&gt;
heres another api request, i&#039;d like to be able to get a clients xp directly. et.gentity_get(cno, &amp;quot;sess.game_points&amp;quot;) seems to return 0 always (?)&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:Hadr0|Hadr0]] 15:38, 21 December 2005 (PST)&lt;br /&gt;
:oh nevermind, i see this can be done now with xp = et.gentity_get(cno, &amp;quot;ps.stats&amp;quot;, 8)&lt;br /&gt;
:nice... --[[User:Hadr0|Hadr0]] 16:58, 23 December 2005 (PST)&lt;br /&gt;
--------&lt;br /&gt;
add a way to determine if a client is 999, and if possible why he&#039;s 999 (loading, connecting, loosing packets, etc)&amp;lt;br&amp;gt;&lt;br /&gt;
--Gotenks&lt;br /&gt;
&lt;br /&gt;
999 means: server has not been sent data from client for &amp;gt; 1000 ms. So there is no way to certainly tell why.&lt;br /&gt;
The timeoutflag is stored in the pmflags IIRC. Don&#039;t know if lua can read them right now. --[[User:Deus|Deus]] 23:12, 22 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Access to weapon stats during game similar to end of round stats that are displayed.&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:LethalInjection|LethalInjection]] 23:52, 22 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Still would like access to the ping, or a dummy variable if they are 999, but also the ammount of time they are inactive.&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:Gotenks|Gotenks]] (Sorry for double post) 1:53, 31 December 2005 (CST)&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== IPC stuff ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
i would like a et_IPCReceive whit an return value so u can send info back on a request&lt;br /&gt;
&lt;br /&gt;
i would like a et_IPCSend that can send to all lua mods then them mods can decide if the wana use that message or not&lt;br /&gt;
[[User:=FF=im2good4u|=FF=Im2good4u]] 12:35, 8 January 2006 (PST)&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
  et_IPCReceive wouldn&#039;t send it to the other mod... afaik... so just use another send&lt;br /&gt;
  just et_IPCSend to all modules (afaik, you can even send to ones not there), simple loop function&lt;br /&gt;
[[User:gotenks|gotenks]] 20:04, 8 January 2006 (CST)&lt;br /&gt;
&lt;br /&gt;
yeh probely but its not verry handy its better to get the good vmnumber or to e able to send on mod filenames&lt;br /&gt;
&lt;br /&gt;
apart from that returning a value will be more handy since tnhe u cna contine in 1 funtion else u got to reacise it in the recieve funtion [[User:=FF=im2good4u|=FF=Im2good4u]] 10:45, 9 January 2006 (PST)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
bani i need a console print function on the client that does sepport ascii plz [[User:=FF=im2good4u|=FF=Im2good4u]] 12:49, 12 January 2006 (PST)&lt;br /&gt;
:et.trap_SendServerCommand( clientnum, &amp;quot;print \&amp;quot;hello ascii console on the client\n\&amp;quot; ) ) --[[User:Bani|Bani]] 22:33, 15 January 2006 (PST)&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Current_events&amp;diff=2030</id>
		<title>Current events</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Current_events&amp;diff=2030"/>
		<updated>2006-01-04T21:28:00Z</updated>

		<summary type="html">&lt;p&gt;Bani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Phase I: Finish coding ETPro&lt;br /&gt;
&lt;br /&gt;
Phase II: Finish the wiki for ETPro&lt;br /&gt;
&lt;br /&gt;
Phase III: There is no Phase III.&lt;br /&gt;
&lt;br /&gt;
Phase IV: Code BayonET&lt;br /&gt;
&lt;br /&gt;
Phase V: Finish the wiki for BayonET&lt;br /&gt;
&lt;br /&gt;
Phase VI: Code MullET&lt;br /&gt;
&lt;br /&gt;
Phase VII: Finish the wiki for MullET&lt;br /&gt;
&lt;br /&gt;
Phase VIII: A shrubbery.&lt;br /&gt;
&lt;br /&gt;
Phase IX: Sell ETPro T-Shirts&lt;br /&gt;
&lt;br /&gt;
Phase X: Make a moderate profit to support support costs&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Talk:Lua_Mod_API&amp;diff=1993</id>
		<title>Talk:Lua Mod API</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Talk:Lua_Mod_API&amp;diff=1993"/>
		<updated>2005-12-23T09:38:33Z</updated>

		<summary type="html">&lt;p&gt;Bani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;- et.G_SlotSound( slotnum, soundindex ) -&amp;gt;  Plays the sound soundindex at for the player @ slotnum only. --[[User:RoadKillPuppy|RoadKillPuppy]] 14:17, 16 December 2005 (PST)&lt;br /&gt;
:you can do this with tempentities and SVF_SINGLECLIENT ...&lt;br /&gt;
:--[[User:Bani|Bani]] 17:32, 16 December 2005 (PST)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
some of this can be done via function et_Print(text).. but this would greatly simplify life,&amp;lt;br&amp;gt;&lt;br /&gt;
my wish list for christmas:&amp;lt;br&amp;gt;&lt;br /&gt;
- eguid = getUserIAC(cno) - get a clients etpro guid - if consolecommand &amp;quot;guids&amp;quot; can do it, why not Lua&amp;lt;br&amp;gt;&lt;br /&gt;
- repair gentity_set for vec3 - scotty fix the transporter please&amp;lt;br&amp;gt;&lt;br /&gt;
:[http://bani.anime.net/banimod/forums/viewtopic.php?t=6279 fixed.]--[[User:Bani|Bani]] 17:56, 22 December 2005 (PST)&lt;br /&gt;
- et.trap_SendServerCommand(cno, &amp;quot;kill&amp;quot;) - punish client as alternative to setting health&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:Hadr0|Hadr0]] 02:10, 20 December 2005 (PST)&amp;lt;br&amp;gt;&lt;br /&gt;
:You can use et.G_Damage() in the new test version to do that.--[[User:Bani|Bani]] 01:38, 23 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
trap sen server cmd is a ET engine trap the comand u send it send to the client and recived as a server command no a client command&lt;br /&gt;
&lt;br /&gt;
to add ill well that would be al ot of coding for not much [[User:=FF=im2good4u|=FF=Im2good4u]] 12:12, 20 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
aight thnx.&amp;lt;br&amp;gt;&lt;br /&gt;
heres another api request, i&#039;d like to be able to get a clients xp directly. et.gentity_get(cno, &amp;quot;sess.game_points&amp;quot;) seems to return 0 always (?)&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:Hadr0|Hadr0]] 15:38, 21 December 2005 (PST)&lt;br /&gt;
--------&lt;br /&gt;
add a way to determine if a client is 999, and if possible why he&#039;s 999 (loading, connecting, loosing packets, etc)&amp;lt;br&amp;gt;&lt;br /&gt;
--Gotenks&lt;br /&gt;
&lt;br /&gt;
999 means: server has not been sent data from client for &amp;gt; 1000 ms. So there is no way to certainly tell why.&lt;br /&gt;
The timeoutflag is stored in the pmflags IIRC. Don&#039;t know if lua can read them right now. --[[User:Deus|Deus]] 23:12, 22 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Access to weapon stats during game similar to end of round stats that are displayed.&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:LethalInjection|LethalInjection]] 23:52, 22 December 2005 (PST)&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Talk:Lua_Mod_API&amp;diff=1988</id>
		<title>Talk:Lua Mod API</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Talk:Lua_Mod_API&amp;diff=1988"/>
		<updated>2005-12-23T01:56:19Z</updated>

		<summary type="html">&lt;p&gt;Bani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;- et.G_SlotSound( slotnum, soundindex ) -&amp;gt;  Plays the sound soundindex at for the player @ slotnum only. --[[User:RoadKillPuppy|RoadKillPuppy]] 14:17, 16 December 2005 (PST)&lt;br /&gt;
:you can do this with tempentities and SVF_SINGLECLIENT ...&lt;br /&gt;
:--[[User:Bani|Bani]] 17:32, 16 December 2005 (PST)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
some of this can be done via function et_Print(text).. but this would greatly simplify life,&amp;lt;br&amp;gt;&lt;br /&gt;
my wish list for christmas:&amp;lt;br&amp;gt;&lt;br /&gt;
- eguid = getUserIAC(cno) - get a clients etpro guid - if consolecommand &amp;quot;guids&amp;quot; can do it, why not Lua&amp;lt;br&amp;gt;&lt;br /&gt;
- repair gentity_set for vec3 - scotty fix the transporter please&amp;lt;br&amp;gt;&lt;br /&gt;
:[http://bani.anime.net/banimod/forums/viewtopic.php?t=6279 fixed.]--[[User:Bani|Bani]] 17:56, 22 December 2005 (PST)&lt;br /&gt;
- et.trap_SendServerCommand(cno, &amp;quot;kill&amp;quot;) - punish client as alternative to setting health&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:Hadr0|Hadr0]] 02:10, 20 December 2005 (PST)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
trap sen server cmd is a ET engine trap the comand u send it send to the client and recived as a server command no a client command&lt;br /&gt;
&lt;br /&gt;
to add ill well that would be al ot of coding for not much [[User:=FF=im2good4u|=FF=Im2good4u]] 12:12, 20 December 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
aight thnx.&amp;lt;br&amp;gt;&lt;br /&gt;
heres another api request, i&#039;d like to be able to get a clients xp directly. et.gentity_get(cno, &amp;quot;sess.game_points&amp;quot;) seems to return 0 always (?)&amp;lt;br&amp;gt;&lt;br /&gt;
--[[User:Hadr0|Hadr0]] 15:38, 21 December 2005 (PST)&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Talk:Lua_Mod_API&amp;diff=1966</id>
		<title>Talk:Lua Mod API</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Talk:Lua_Mod_API&amp;diff=1966"/>
		<updated>2005-12-17T01:32:00Z</updated>

		<summary type="html">&lt;p&gt;Bani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;- et.G_SlotSound( slotnum, soundindex ) -&amp;gt;  Plays the sound soundindex at for the player @ slotnum only. --[[User:RoadKillPuppy|RoadKillPuppy]] 14:17, 16 December 2005 (PST)&lt;br /&gt;
:you can do this with tempentities and SVF_SINGLECLIENT ...&lt;br /&gt;
:--[[User:Bani|Bani]] 17:32, 16 December 2005 (PST)&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Talk:Lua_Mod_API&amp;diff=1964</id>
		<title>Talk:Lua Mod API</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Talk:Lua_Mod_API&amp;diff=1964"/>
		<updated>2005-12-16T19:42:27Z</updated>

		<summary type="html">&lt;p&gt;Bani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Lua_Mod_API&amp;diff=1963</id>
		<title>Lua Mod API</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Lua_Mod_API&amp;diff=1963"/>
		<updated>2005-12-16T19:41:25Z</updated>

		<summary type="html">&lt;p&gt;Bani: link to api requests&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOEDITSECTION__&lt;br /&gt;
ETPro now supports serverside mods via the [http://www.lua.org/ lua] scripting language. For more information about lua, visit the [http://www.lua.org/manual/5.0/ Reference manual], the online edition of the book [http://www.lua.org/pil/ Programming in Lua] or the [http://lua-users.org/wiki/ lua-users wiki].&lt;br /&gt;
&lt;br /&gt;
ETPro has an embedded lua 5.0.2 interpreter, and if present will load user-defined scripts from the etpro directory. ETPro also provides an &amp;quot;et&amp;quot; library of function calls for lua to access the server engine, and provides callbacks so a serverside mod may trigger on specific server events.&lt;br /&gt;
&lt;br /&gt;
The following standard lua libraries are initialized by default and available to ETPro lua scripts:&lt;br /&gt;
[http://www.lua.org/manual/5.0/manual.html#5.1 basic], [http://www.lua.org/manual/5.0/manual.html#5.4 table], [http://www.lua.org/manual/5.0/manual.html#5.6 i/o], [http://www.lua.org/manual/5.0/manual.html#5.3 string], [http://www.lua.org/manual/5.0/manual.html#5.5 math].&lt;br /&gt;
&lt;br /&gt;
A list of [[ETPro]] mods can be found [[:Category:ETPro:Mods|here]].&lt;br /&gt;
&lt;br /&gt;
API Requests can be discussed [http://wolfwiki.anime.net/index.php/Talk:ETPro:Lua_Mod_API here].&lt;br /&gt;
&lt;br /&gt;
==client commands==&lt;br /&gt;
===lua_status===&lt;br /&gt;
:lists all currently loaded lua modules.&lt;br /&gt;
:&#039;&#039;lua mods cannot override this client command.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==server commands==&lt;br /&gt;
===lua_status===&lt;br /&gt;
:lists all currently loaded lua modules.&lt;br /&gt;
&lt;br /&gt;
==cvars==&lt;br /&gt;
===lua_modules===&lt;br /&gt;
:(default &amp;quot;&amp;quot;, disabled)&lt;br /&gt;
:space separated list of lua modules for ETPro to load. modules will be run in the order listed.&lt;br /&gt;
&lt;br /&gt;
===lua_allowedmodules===&lt;br /&gt;
:(default &amp;quot;&amp;quot;, disabled)&lt;br /&gt;
:if set, only lua modules with the matching sha1 signatures listed in this cvar will be allowed to load.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:changing either cvar will cause all currently loaded modules to :quit and be unloaded until the next map_restart.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==et library calls==&lt;br /&gt;
&lt;br /&gt;
===modules===&lt;br /&gt;
et.RegisterModname( &#039;&#039;&#039;modname&#039;&#039;&#039; )&lt;br /&gt;
:Registers a descriptive string &#039;&#039;&#039;modname&#039;&#039;&#039; for this mod.&lt;br /&gt;
&#039;&#039;&#039;vmnumber&#039;&#039;&#039; = et.FindSelf()&lt;br /&gt;
:Returns a number indicating the VM slot the current mod is loaded into.&lt;br /&gt;
&#039;&#039;&#039;modname&#039;&#039;&#039;, &#039;&#039;&#039;signature&#039;&#039;&#039; = et.FindMod( &#039;&#039;&#039;vmnumber&#039;&#039;&#039; )&lt;br /&gt;
:Returns the &#039;&#039;&#039;modname&#039;&#039;&#039; and sha1 &#039;&#039;&#039;signature&#039;&#039;&#039; for the mod loaded in the VM slot &#039;&#039;&#039;vmnumber&#039;&#039;&#039;. Returns nil, nil if the VM slot is invalid.&lt;br /&gt;
&#039;&#039;&#039;success&#039;&#039;&#039; = et.IPCSend( &#039;&#039;&#039;vmnumber&#039;&#039;&#039;, &#039;&#039;&#039;message&#039;&#039;&#039; )&lt;br /&gt;
:Sends the string &#039;&#039;&#039;message&#039;&#039;&#039; to the mod in the VM slot indicated by &#039;&#039;&#039;vmnumber&#039;&#039;&#039;. The mod receiving &#039;&#039;&#039;message&#039;&#039;&#039; must have an &#039;&#039;et_IPCReceive()&#039;&#039; callback. If the message is successfully sent, &#039;&#039;&#039;success&#039;&#039;&#039; will be 1. On failure it will be 0.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===printing===&lt;br /&gt;
et.G_Print( &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Prints the string &#039;&#039;&#039;text&#039;&#039;&#039; to the server console.&lt;br /&gt;
et.G_LogPrint( &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Prints the string &#039;&#039;&#039;text&#039;&#039;&#039; to the server console and writes it to the server log.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===argument handling===&lt;br /&gt;
These functions are to be used within the [[#commands|command callback functions]].&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;args&#039;&#039;&#039; = et.ConcatArgs( &#039;&#039;&#039;index&#039;&#039;&#039; )&lt;br /&gt;
:Returns all arguments beginning from &#039;&#039;&#039;index&#039;&#039;&#039; concatenated into a single string &#039;&#039;&#039;args&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;argcount&#039;&#039;&#039; = et.trap_Argc()&lt;br /&gt;
:Returns a number indicating the number of command line arguments in the command buffer.&lt;br /&gt;
&#039;&#039;&#039;arg&#039;&#039;&#039; = et.trap_Argv( &#039;&#039;&#039;argnum&#039;&#039;&#039; )&lt;br /&gt;
:Returns the contents of the command line argument &#039;&#039;&#039;argnum&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===cvars===&lt;br /&gt;
&#039;&#039;&#039;cvarvalue&#039;&#039;&#039; = et.trap_Cvar_Get( &#039;&#039;&#039;cvarname&#039;&#039;&#039; )&lt;br /&gt;
:Returns the value of the cvar &#039;&#039;&#039;cvarname&#039;&#039;&#039; as a string. If there is no cvar named &#039;&#039;&#039;cvarname&#039;&#039;&#039;, returns a zero length string. &lt;br /&gt;
et.trap_Cvar_Set( &#039;&#039;&#039;cvarname&#039;&#039;&#039;, &#039;&#039;&#039;cvarvalue&#039;&#039;&#039; )&lt;br /&gt;
:Sets the cvar &#039;&#039;&#039;cvarname&#039;&#039;&#039; to &#039;&#039;&#039;cvarvalue&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===configstrings===&lt;br /&gt;
&#039;&#039;&#039;configstringvalue&#039;&#039;&#039; = et.trap_GetConfigstring( &#039;&#039;&#039;index&#039;&#039;&#039; )&lt;br /&gt;
:Returns the string &#039;&#039;&#039;configstringvalue&#039;&#039;&#039; containing the contents of the configstring &#039;&#039;&#039;index&#039;&#039;&#039;&lt;br /&gt;
et.trap_SetConfigstring( &#039;&#039;&#039;index&#039;&#039;&#039;, &#039;&#039;&#039;configstringvalue&#039;&#039;&#039; )&lt;br /&gt;
:Sets the configstring &#039;&#039;&#039;index&#039;&#039;&#039; to the string &#039;&#039;&#039;configstringvalue&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===server===&lt;br /&gt;
et.trap_SendConsoleCommand( &#039;&#039;&#039;when&#039;&#039;&#039;, &#039;&#039;&#039;command&#039;&#039;&#039; )&lt;br /&gt;
:Sends the command &#039;&#039;&#039;command&#039;&#039;&#039; to the server console, to be executed &#039;&#039;&#039;when&#039;&#039;&#039; (see et.EXEC_* constants)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===clients===&lt;br /&gt;
et.trap_DropClient( &#039;&#039;&#039;clientnum&#039;&#039;&#039;, &#039;&#039;&#039;reason&#039;&#039;&#039;, &#039;&#039;&#039;ban_time&#039;&#039;&#039; )&lt;br /&gt;
:Disconnects &#039;&#039;&#039;clientnum&#039;&#039;&#039; from the server, with descriptive string &#039;&#039;&#039;reason&#039;&#039;&#039; reported to clients. &#039;&#039;&#039;ban_time&#039;&#039;&#039; is the time in seconds to ban the client from the server. &#039;&#039;&#039;ban_time&#039;&#039;&#039; is optional and may be entirely omitted, in which case the ban time defaults to the cvar &#039;&#039;b_defaultbantime&#039;&#039;&lt;br /&gt;
et.trap_SendServerCommand( &#039;&#039;&#039;clientnum&#039;&#039;&#039;, &#039;&#039;&#039;[[SendServerCommand|command]]&#039;&#039;&#039; )&lt;br /&gt;
:Sends the command &#039;&#039;&#039;[[SendServerCommand|command]]&#039;&#039;&#039; to the client &#039;&#039;&#039;clientnum&#039;&#039;&#039;. If &#039;&#039;&#039;clientnum&#039;&#039;&#039; is -1, the &#039;&#039;&#039;command&#039;&#039;&#039; is broadcast to all connected clients.&lt;br /&gt;
et.G_Say( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;mode&#039;&#039;&#039;, &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Sends a chat command on behalf of client &#039;&#039;&#039;clientNum&#039;&#039;&#039; with the mode &#039;&#039;&#039;mode&#039;&#039;&#039; (see et.SAY_* constants) and chat text &#039;&#039;&#039;text&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===userinfo===&lt;br /&gt;
&#039;&#039;&#039;userinfo&#039;&#039;&#039; = et.trap_GetUserinfo( &#039;&#039;&#039;clientnum&#039;&#039;&#039; )&lt;br /&gt;
:Returns the contents of the userinfo string for the client &#039;&#039;&#039;clientnum&#039;&#039;&#039;&lt;br /&gt;
et.trap_SetUserinfo( &#039;&#039;&#039;clientnum&#039;&#039;&#039;, &#039;&#039;&#039;userinfo&#039;&#039;&#039; )&lt;br /&gt;
:Sets the userinfo string for the client &#039;&#039;&#039;clientnum&#039;&#039;&#039; to &#039;&#039;&#039;userinfo&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===string utility functions===&lt;br /&gt;
&#039;&#039;&#039;infostring&#039;&#039;&#039; = et.Info_RemoveKey( &#039;&#039;&#039;infostring&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039; )&lt;br /&gt;
:Removes key &#039;&#039;&#039;key&#039;&#039;&#039; from infostring &#039;&#039;&#039;infostring&#039;&#039;&#039; and returns the modified infostring.&lt;br /&gt;
&#039;&#039;&#039;infostring&#039;&#039;&#039; = et.Info_SetValueForKey( &#039;&#039;&#039;infostring&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039;, &#039;&#039;&#039;value&#039;&#039;&#039; )&lt;br /&gt;
:Sets the key &#039;&#039;&#039;key&#039;&#039;&#039; in the infostring &#039;&#039;&#039;infostring&#039;&#039;&#039; to &#039;&#039;&#039;value&#039;&#039;&#039; and returns the modified infostring. If &#039;&#039;&#039;value&#039;&#039;&#039; is an empty string, &#039;&#039;&#039;key&#039;&#039;&#039; is removed from the string. &lt;br /&gt;
&#039;&#039;&#039;keyvalue&#039;&#039;&#039; = et.Info_ValueForKey( &#039;&#039;&#039;infostring&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039; )&lt;br /&gt;
:Returns the value of the key &#039;&#039;&#039;key&#039;&#039;&#039; in the infostring &#039;&#039;&#039;infostring&#039;&#039;&#039;. If &#039;&#039;&#039;key&#039;&#039;&#039; is not present in the string, an empty string is returned.&lt;br /&gt;
&#039;&#039;&#039;cleanstring&#039;&#039;&#039; = et.Q_CleanStr( &#039;&#039;&#039;string&#039;&#039;&#039; )&lt;br /&gt;
:Returns &#039;&#039;&#039;string&#039;&#039;&#039; stripped of all color codes&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ET filesystem===&lt;br /&gt;
&#039;&#039;&#039;fd&#039;&#039;&#039;, &#039;&#039;&#039;len&#039;&#039;&#039; = et.trap_FS_FOpenFile( &#039;&#039;&#039;filename&#039;&#039;&#039;, &#039;&#039;&#039;mode&#039;&#039;&#039; )&lt;br /&gt;
:Attempts to open the file &#039;&#039;&#039;filename&#039;&#039;&#039; with the access mode &#039;&#039;&#039;mode&#039;&#039;&#039; (see et.FS_ constants). Returns the filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039; and file length &#039;&#039;&#039;len&#039;&#039;&#039;. On error, &#039;&#039;&#039;len&#039;&#039;&#039; returns -1.&lt;br /&gt;
&#039;&#039;&#039;filedata&#039;&#039;&#039; = et.trap_FS_Read( fd, count )&lt;br /&gt;
:Reads &#039;&#039;&#039;count&#039;&#039;&#039; bytes from filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039;.&lt;br /&gt;
&#039;&#039;&#039;count&#039;&#039;&#039; = et.trap_FS_Write( &#039;&#039;&#039;filedata&#039;&#039;&#039;, &#039;&#039;&#039;count&#039;&#039;&#039;, &#039;&#039;&#039;fd&#039;&#039;&#039; )&lt;br /&gt;
:Attempts to write &#039;&#039;&#039;count&#039;&#039;&#039; bytes of &#039;&#039;&#039;filedata&#039;&#039;&#039; to filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039;. Returns number of bytes successfully written.&lt;br /&gt;
et.trap_FS_Rename( &#039;&#039;&#039;oldname&#039;&#039;&#039;, &#039;&#039;&#039;newname&#039;&#039;&#039; )&lt;br /&gt;
:Renames file &#039;&#039;&#039;oldname&#039;&#039;&#039; to &#039;&#039;&#039;newname&#039;&#039;&#039;.&lt;br /&gt;
et.trap_FS_FCloseFile( &#039;&#039;&#039;fd&#039;&#039;&#039; )&lt;br /&gt;
:Closes filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===indexes===&lt;br /&gt;
&#039;&#039;&#039;soundindex&#039;&#039;&#039; = et.G_SoundIndex( &#039;&#039;&#039;filename&#039;&#039;&#039; )&lt;br /&gt;
:Returns an index to the soundfile indicated by &#039;&#039;&#039;filename&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;modelindex&#039;&#039;&#039; = et.G_ModelIndex( &#039;&#039;&#039;filename&#039;&#039;&#039; )&lt;br /&gt;
:Returns an index to the model indicated by &#039;&#039;&#039;filename&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sound===&lt;br /&gt;
et.G_globalSound( &#039;&#039;&#039;sound&#039;&#039;&#039; )&lt;br /&gt;
:Plays the global sound indicated by the filename &#039;&#039;&#039;sound&#039;&#039;&#039;.&lt;br /&gt;
et.G_Sound( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;soundindex&#039;&#039;&#039; )&lt;br /&gt;
:Plays the sound &#039;&#039;&#039;soundindex&#039;&#039;&#039; at the location of entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===miscellaneous===&lt;br /&gt;
&#039;&#039;&#039;milliseconds&#039;&#039;&#039; = et.trap_Milliseconds()&lt;br /&gt;
:Returns a number indicating the current server time in milliseconds.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===entities===&lt;br /&gt;
&#039;&#039;&#039;entnum&#039;&#039;&#039; = et.G_Spawn()&lt;br /&gt;
:Spawns a new entity and returns the new entity number.&lt;br /&gt;
&#039;&#039;&#039;entnum&#039;&#039;&#039; = et.G_TempEntity( &#039;&#039;&#039;origin&#039;&#039;&#039;, &#039;&#039;&#039;event&#039;&#039;&#039; )&lt;br /&gt;
:Spawns a new TempEntity of event type &#039;&#039;&#039;event&#039;&#039;&#039; and places it at &#039;&#039;&#039;origin&#039;&#039;&#039; in the world.&lt;br /&gt;
:&#039;&#039;&#039;Warning:&#039;&#039;&#039; up to and including ETPro 3.2.4 the signature of the method is broken and expects four instead of two parameters. To successfully call it, you need to prepend the parameter list with two dummy parameters like et.G_TempEntity( 0, 0, origin, event ). Use this method with care, because in future ETPro versions it will probably be corrected to the one stated above and might break your script.&lt;br /&gt;
et.G_FreeEntity( &#039;&#039;&#039;entnum&#039;&#039;&#039; )&lt;br /&gt;
:Frees the entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;spawnval&#039;&#039;&#039; = et.G_GetSpawnVar( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039; )&lt;br /&gt;
:Returns the value of spawnvar &#039;&#039;&#039;key&#039;&#039;&#039; for entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
et.G_SetSpawnVar( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039;, &#039;&#039;&#039;value&#039;&#039;&#039; )&lt;br /&gt;
:Sets the spawnvar &#039;&#039;&#039;key&#039;&#039;&#039; to &#039;&#039;&#039;value&#039;&#039;&#039; for entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;integer entnum&#039;&#039;&#039; = et.G_SpawnGEntityFromSpawnVars( string spawnvar, string spawnvalue, ... )&lt;br /&gt;
:This function can only be called inside the &#039;&#039;&#039;et_InitGame&#039;&#039;&#039; callback&lt;br /&gt;
et.trap_LinkEntity( &#039;&#039;&#039;entnum&#039;&#039;&#039; )&lt;br /&gt;
:Links the entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
et.trap_UnlinkEntity( &#039;&#039;&#039;entnum&#039;&#039;&#039; )&lt;br /&gt;
:Unlinks the entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;(variable)&#039;&#039;&#039; = et.gentity_get ( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;[[Fieldname]]&#039;&#039;&#039; )&lt;br /&gt;
:Gets the value of &#039;&#039;&#039;[[Fieldname]]&#039;&#039;&#039; from entity &#039;&#039;&#039;entnum&#039;&#039;&#039; out of the g_entity struct. For NULL entities or clients, &#039;&#039;nil&#039;&#039; is returned.&amp;lt;br&amp;gt;&lt;br /&gt;
et.gentity_set( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;[[Fieldname]]&#039;&#039;&#039;, &#039;&#039;&#039;(variable)&#039;&#039;&#039; )&lt;br /&gt;
:Sets the value of &#039;&#039;&#039;[[Fieldname]]&#039;&#039;&#039; from entity &#039;&#039;&#039;entnum&#039;&#039;&#039; in the g_entity struct to &#039;&#039;&#039;(variable)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==callbacks==&lt;br /&gt;
&lt;br /&gt;
===qagame execution===&lt;br /&gt;
et_InitGame( &#039;&#039;&#039;levelTime&#039;&#039;&#039;, &#039;&#039;&#039;randomSeed&#039;&#039;&#039;, &#039;&#039;&#039;restart&#039;&#039;&#039; )&lt;br /&gt;
:Called when qagame initializes. &#039;&#039;&#039;levelTime&#039;&#039;&#039; is the current level time in milliseconds. &#039;&#039;&#039;randomSeed&#039;&#039;&#039; is a number that can be used to seed random number generators. &#039;&#039;&#039;restart&#039;&#039;&#039; indicates if et_InitGame() is being called due to a map restart (1) or not (0).&lt;br /&gt;
et_ShutdownGame( &#039;&#039;&#039;restart&#039;&#039;&#039; )&lt;br /&gt;
:Called when qagame shuts down. &#039;&#039;&#039;restart&#039;&#039;&#039; indicates if the shutdown is being called due to a map_restart (1) or not (0).&lt;br /&gt;
et_RunFrame( &#039;&#039;&#039;levelTime&#039;&#039;&#039; )&lt;br /&gt;
:Called when qagame runs a server frame. &#039;&#039;&#039;levelTime&#039;&#039;&#039; is the current level time in milliseconds.&lt;br /&gt;
et_Quit()&lt;br /&gt;
:Called when ETPro unloads the mod. The mod should close all open filedescriptors and perform all cleanup.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===client management===&lt;br /&gt;
&#039;&#039;&#039;rejectreason&#039;&#039;&#039; = et_ClientConnect( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;firstTime&#039;&#039;&#039;, &#039;&#039;&#039;isBot&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client attempts to connect to the server. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id, &#039;&#039;&#039;firstTime&#039;&#039;&#039; indicates if this is a new connection (1) or a reconnection (0). &#039;&#039;&#039;isBot&#039;&#039;&#039; indicates if the client is a bot (1) or not (0). If the mod accepts the connection, it should return nil. Otherwise, the mod should return a string describing the reason the client connection was rejected.&lt;br /&gt;
et_ClientDisconnect( &#039;&#039;&#039;clientNum&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client disconnects. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id.&lt;br /&gt;
et_ClientBegin( &#039;&#039;&#039;clientNum&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client begins (becomes active, and enters the gameworld). &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id.&lt;br /&gt;
et_ClientUserinfoChanged( &#039;&#039;&#039;clientNum&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client&#039;s Userinfo string has changed. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===commands===&lt;br /&gt;
&#039;&#039;&#039;intercepted&#039;&#039;&#039; = et_ClientCommand( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;command&#039;&#039;&#039; )&lt;br /&gt;
:Called when a command is received from a client. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id. &#039;&#039;&#039;command&#039;&#039;&#039; is the command. The mod should return 1 if the command was intercepted by the mod, and 0 if the command was ignored by the mod and should be passed through to the server (and other mods in the chain).&lt;br /&gt;
:The actual command can be accessed through the [[#argument_handling|argument handling]] functions, as seen in the [[ETPro:Lua Sample Code]].&lt;br /&gt;
&#039;&#039;&#039;intercepted&#039;&#039;&#039; = et_ConsoleCommand()&lt;br /&gt;
:Called when a command is entered on the server console. The mod should return 1 if the command was intercepted by the mod, and 0 if the command was ignored by the mod and should be passed through to the server (and other mods in the chain).&lt;br /&gt;
:The actual command can be accessed through the [[#argument_handling|argument handling]] functions, as seen in the [[ETPro:Lua Sample Code]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===miscellaneous===&lt;br /&gt;
et_IPCReceive( &#039;&#039;&#039;vmnumber&#039;&#039;&#039;, &#039;&#039;&#039;message&#039;&#039;&#039; )&lt;br /&gt;
:Called when another mod sends an et.IPCSend() message to this mod. &#039;&#039;&#039;vmnumber&#039;&#039;&#039; is the VM slot number of the sender, and &#039;&#039;&#039;message&#039;&#039;&#039; is the message.&lt;br /&gt;
et_Print( &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Called whenever the server or qagame prints a string to the console.&lt;br /&gt;
et_Obituary( &#039;&#039;&#039;victim&#039;&#039;&#039;, &#039;&#039;&#039;killer&#039;&#039;&#039;, &#039;&#039;&#039;meansOfDeath&#039;&#039;&#039; )&lt;br /&gt;
:Called whenever a player is killed.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==predefined constants==&lt;br /&gt;
et.EXEC_NOW&amp;lt;br&amp;gt;&lt;br /&gt;
et.EXEC_INSERT&amp;lt;br&amp;gt;&lt;br /&gt;
et.EXEC_APPEND&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_READ&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_WRITE&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_APPEND&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_APPEND_SYNC&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_ALL&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_TEAM&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_BUDDY&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_TEAMNL&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
et.HOSTARCH&lt;br /&gt;
:set to WIN32 or UNIX depending on the host architecture qagame is running on.&lt;br /&gt;
LUA_PATH&lt;br /&gt;
:set to fs_homepath/fs_game/?.lua in order to ease use of the [http://www.lua.org/pil/8.1.html require] function.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==configs==&lt;br /&gt;
If a config is loaded, all modules are shutdown and reloaded. If a &#039;&#039;certified&#039;&#039; config is loaded, all modules are shutdown and reloaded, and additionally the following functions are disabled: &#039;&#039;&#039;require()&#039;&#039;&#039;, &#039;&#039;&#039;loadfile()&#039;&#039;&#039;, &#039;&#039;&#039;loadlib()&#039;&#039;&#039;, &#039;&#039;&#039;loadstring()&#039;&#039;&#039;, &#039;&#039;&#039;dofile()&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==caveats==&lt;br /&gt;
Like qagame, lua modules are unloaded and reloaded on map_restart and map changes. This means that all global variables and other information is lost. Mods may choose to store persistent data in cvars or external files.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
&lt;br /&gt;
Q: OMG I hate the libary prefix et.* on everything!!11!1oneone&amp;lt;br&amp;gt;&lt;br /&gt;
A: table.foreach(et, function (func, value) _G[func] = value; end)&lt;br /&gt;
&lt;br /&gt;
Q: How do a re-load my lua file without restarting the whole server ?&amp;lt;br&amp;gt;&lt;br /&gt;
A: change maps or map_restart&lt;br /&gt;
&lt;br /&gt;
Q: Can I see some sample code?&amp;lt;br&amp;gt;&lt;br /&gt;
A: [[ETPro:Lua Sample Code]]&lt;br /&gt;
&lt;br /&gt;
Q: Is there a list of [[ETPro]] mods?&amp;lt;br&amp;gt;&lt;br /&gt;
A: Yes, [[:Category:ETPro:Mods|here]].&lt;br /&gt;
&lt;br /&gt;
Q: OMG my mod doesn&#039;t work!&amp;lt;br&amp;gt;&lt;br /&gt;
A: Make sure you added your mod&#039;s filename to the lua_modules cvar (e.g. set lua_modules mymod.lua).&lt;br /&gt;
&lt;br /&gt;
Q: OMG why has et_ClientSay been removed?&amp;lt;br&amp;gt;&lt;br /&gt;
A: Thats a secret but, to keep the function as it was, just add the following code to your et_ClientCommand() function&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;	-- et_ClientSay had to be removed in order to intercept all commands &lt;br /&gt;
	-- so here&#039;s a wrapper for that&lt;br /&gt;
		arg0 = et.trap_Argv(0) -- get the main command&lt;br /&gt;
		&lt;br /&gt;
		if arg0 == &amp;quot;say&amp;quot; then&lt;br /&gt;
			return et_ClientSay( clientNum, et.SAY_ALL, et.ConcatArgs(1))&lt;br /&gt;
		elseif arg0 == &amp;quot;say_team&amp;quot; then&lt;br /&gt;
			return et_ClientSay( clientNum, et.SAY_TEAM, et.ConcatArgs(1))&lt;br /&gt;
		elseif arg0 == &amp;quot;say_buddy&amp;quot; then&lt;br /&gt;
			return et_ClientSay( clientNum, et.SAY_BUDDY, et.ConcatArgs(1))&lt;br /&gt;
		elseif arg0 == &amp;quot;say_teamnl&amp;quot; then&lt;br /&gt;
			return et_ClientSay( clientNum, et.SAY_TEAMNL, et.ConcatArgs(1))&lt;br /&gt;
		end&lt;br /&gt;
	-- et_ClientSay wrapper end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:ETPro]]&lt;br /&gt;
[[Category:ETPro:Mods]]&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Talk:Main_Page&amp;diff=1940</id>
		<title>Talk:Main Page</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Talk:Main_Page&amp;diff=1940"/>
		<updated>2005-11-30T07:45:50Z</updated>

		<summary type="html">&lt;p&gt;Bani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Someone needs to either find links to webpages about configuring the server, or merge them into the configuration pages.  Currently, only installation is covered.&lt;br /&gt;
--[[User:WeblionX|WeblionX]] 09:47, 5 November 2005 (PST)&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=WolfWiki:About&amp;diff=1939</id>
		<title>WolfWiki:About</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=WolfWiki:About&amp;diff=1939"/>
		<updated>2005-11-30T07:45:13Z</updated>

		<summary type="html">&lt;p&gt;Bani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The WolfWiki logo was designed by [http://bani.anime.net/banimod/forums/profile.php?mode=viewprofile&amp;amp;u=1375 Svartberg]&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Help:Editing&amp;diff=1871</id>
		<title>Help:Editing</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Help:Editing&amp;diff=1871"/>
		<updated>2005-11-23T02:16:07Z</updated>

		<summary type="html">&lt;p&gt;Bani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
*In general, avoid using raw HTML in pages. Use [http://en.wikipedia.org/wiki/Wikipedia:How_to_edit_a_page#Wiki_markup Wiki markup] when possible.&lt;br /&gt;
&lt;br /&gt;
*While Wiki [http://en.wikipedia.org/wiki/Wikipedia:Talk_page Talk:] (&amp;quot;discussion&amp;quot;) pages are better than nothing, they are a rather poor mechanism for discussions. A much better solution is to make link(s) on the discussion page to [http://bani.anime.net/banimod/forums/ Banimod Forum] thread(s).&lt;br /&gt;
&lt;br /&gt;
*For Wiki markup syntax and other general guidelines, [http://www.wikipedia.org Wikipedia&#039;s] [http://en.wikipedia.org/wiki/Wikipedia:How_to_edit_a_page How to edit a page] is a good syntax guide.&lt;br /&gt;
&lt;br /&gt;
*Defacing or otherwise abusing the Wiki will get your account banned.&lt;br /&gt;
&lt;br /&gt;
==Extensions==&lt;br /&gt;
[http://69.90.72.86/wiki/index.php/GraphViz_extension_for_MediaWiki graphviz] is installed. You can see an example [[ETTV:Server_Configuration|here]]&lt;br /&gt;
&lt;br /&gt;
[http://wiki.poohunter.de/index.php?title=Pitatable pitatable] by [[User:Deus|Deus]] is installed. You can see an example [[Fieldname|here]]&lt;br /&gt;
&lt;br /&gt;
==To Do List==&lt;br /&gt;
Feel free to jump in and help!&lt;br /&gt;
*Convert Documentation&lt;br /&gt;
::The posts in the [http://bani.anime.net/banimod/forums/viewforum.php?f=19 ET Pro Documentation Forum] need to be converted to Wiki articles. Ideally, the forum can be deleted once all the threads have been moved to [[WolfWiki]].&lt;br /&gt;
*ETTV Documentation&lt;br /&gt;
::There are some good ETTV guides for server admins and viewers on the web. They should be converted to [[WolfWiki]] articles.&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Fieldname&amp;diff=1857</id>
		<title>Fieldname</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Fieldname&amp;diff=1857"/>
		<updated>2005-11-22T06:32:56Z</updated>

		<summary type="html">&lt;p&gt;Bani: new sess.* fields -- this white/lightgrey thing makes editing the table a major PITA. there has to be a better way.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;List of fields supported by [[ETPro:Lua Mod API#entities|et.gentity_get() and et.gentity_set()]] functions&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table border=1&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;table border=0&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=#555555&amp;gt;&amp;lt;th&amp;gt;&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;field&amp;lt;/font&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;type&amp;lt;/font&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;access&amp;lt;/font&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;activator&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;entity&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;chain&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;entity&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;classname&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;closespeed&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;float&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;count&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;count2&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;damage&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;deathType&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;delay&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;float&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;dl_atten&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;dl_color&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;vec3&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;dl_shader&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;dl_stylestring&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;duration&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;float&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;end_size&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;enemy&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;entity&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;flags&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;harc&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;float&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;health&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;inuse&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;boolean&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;isProp&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;boolean&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;item&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;key&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;message&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;methodOfDeath&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;mg42BaseEnt&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;missionLevel&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;model&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;model2&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;nextTrain&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;entity&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;noise_index&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;origin&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;vec3&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;prevTrain&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;entity&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;props_frame_state&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;r.absmax&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;vec3&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;r.absmin&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;vec3&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;r.bmodel&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;boolean&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;r.contents&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;r.currentAngles&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;vec3&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;r.currentOrigin&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;vec3&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;r.eventTime&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;r.linkcount&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;r.linked&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;boolean&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;r.maxs&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;vec3&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;r.mins&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;vec3&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;r.ownerNum&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;r.singleClient&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;r.svFlags&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;r.worldflags&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;radius&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;random&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;float&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;rotate&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;vec3&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.angles&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;vec3&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.angles2&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;vec3&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.apos&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;trajectory&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.clientNum&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.constantLight&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.density&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.dl_intensity&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.dmgFlags&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.eFlags&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.effect1Time&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.effect2Time&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.effect3Time&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.frame&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.groundEntityNum&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.loopSound&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.modelindex&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.modelindex2&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.number&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.onFireEnd&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.onFireStart&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.pos&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;trajectory&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.powerups&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.solid&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.teamNum&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.time&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.time2&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.weapon&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;scriptName&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.sessionTeam&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.spectatorTime&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.spectatorState&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.spectatorClient&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.latchSpectatorClient&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.playerType&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.playerWeapon&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.playerWeapon2&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.spawnObjectiveIndex&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.latchPlayerType&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.latchPlayerWeapon&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.latchPlayerWeapon2&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.damage_given&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.damage_received&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.deaths&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.game_points&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.gibs&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.kills&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.muted&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.referee&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.rounds&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.semiadmin&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.spec_invite&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.spec_team&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.suicides&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.team_damage&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.team_kills&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.team_received&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;spawnflags&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;spawnitem&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;speed&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;float&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;splashDamage&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;splashMethodOfDeath&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;splashRadius&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;start_size&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;tagName&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;tagParent&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;entity&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;takedamage&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;boolean&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;tankLink&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;entity&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;target&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;TargetAngles&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;vec3&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;TargetFlag&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;targetname&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;teamchain&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;entity&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;teammaster&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;entity&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;track&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;varc&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;float&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;wait&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;float&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;waterlevel&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;watertype&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;note&#039;&#039;: all the sess.* fields will return nil unless the entity is associated with client slot &amp;lt; sv_maxclients.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ET variable types&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;vec3&#039;&#039;&#039; : a &#039;&#039;&#039;vec3&#039;&#039;&#039; is a 3-element array of numbers (C definition: &amp;lt;tt&amp;gt;typedef float vec3_t[3];&lt;br /&gt;
&amp;lt;/tt&amp;gt;). It is usually used to store and process coordinates in 3D space.&amp;lt;br&amp;gt;&lt;br /&gt;
In etpro-lua a vector is an array (table indexed by integers) containing 3 numbers. It can be accessed by&lt;br /&gt;
doing:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
origin = et.gentity_get(entNum,&amp;quot;r.currentOrigin&amp;quot;) --a vec3 value&lt;br /&gt;
x,y,z = origin[1],origin[2],origin[3]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;trajectory&#039;&#039;&#039;: a &#039;&#039;&#039;trajectory&#039;&#039;&#039; is returned as a lua table described below&lt;br /&gt;
 {&lt;br /&gt;
  trDuration = &amp;lt;number&amp;gt;, --- int&lt;br /&gt;
  trTime = &amp;lt;number&amp;gt;, -- int&lt;br /&gt;
  trType = &amp;lt;number&amp;gt;, -- see below for allowed values&lt;br /&gt;
  trBase { -- this is a vec3, as described above&lt;br /&gt;
    [1] = &amp;lt;number&amp;gt;&lt;br /&gt;
    [2] = &amp;lt;number&amp;gt;&lt;br /&gt;
    [3] = &amp;lt;number&amp;gt;&lt;br /&gt;
  },&lt;br /&gt;
  trDelta { -- also a vec3&lt;br /&gt;
   [1] = &amp;lt;number&amp;gt;&lt;br /&gt;
   [2] = &amp;lt;number&amp;gt;&lt;br /&gt;
   [3] = &amp;lt;number&amp;gt;&lt;br /&gt;
  },&lt;br /&gt;
 }&lt;br /&gt;
: the allowed values for trType (along with the enum names and original comments from the ET source), are as follows. Note &lt;br /&gt;
: that not all values make sense for all entity types &amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;ol start=0&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;TR_STATIONARY&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;TR_INTERPOLATE	// non-parametric, but interpolate between snapshots&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt; TR_LINEAR&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;TR_LINEAR_STOP&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;TR_LINEAR_STOP_BACK //----(SA) added.  so reverse movement can be different than forward&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;TR_SINE // value = base + sin( time / duration ) * delta&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;TR_GRAVITY&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;TR_GRAVITY_LOW&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;TR_GRAVITY_FLOAT // super low grav with no gravity acceleration (floating feathers/fabric/leaves/...)&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;TR_GRAVITY_PAUSED //----(SA) has stopped, but will still do a short trace to see if it should be switched back to TR_GRAVITY&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;TR_ACCELERATE&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;TR_DECCELERATE&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;TR_SPLINE&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;TR_LINEAR_PATH&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;entity&#039;&#039;&#039;: The fields listed as having type &#039;&#039;&#039;enitity&#039;&#039;&#039; return an entity number or nil. Entity numbers are integers from 0 through 1023. Some of the entity numbers have special meanings:&lt;br /&gt;
* 0 - (sv_privateclients - 1) are reserved for clients who connect with the private slot password&lt;br /&gt;
* 0 - 63 are reserved for clients. A client&#039;s entity number is also its client number (as shown by /players for example)&lt;br /&gt;
* 1022 is the &#039;&#039;&#039;worldspawn&#039;&#039;&#039; entity&lt;br /&gt;
* 1023 is &#039;&#039;&#039;ENTITYNUM_NONE&#039;&#039;&#039; which is used instead of null in C under some circumstances to indicate no entity. This is needed where an entity number will be passed over the network.&lt;br /&gt;
&#039;&#039;Note&#039;&#039;: Some other fields not listed as type &#039;entity&#039; may take an entity number value. &#039;&#039;&#039;mg42BaseEnt&#039;&#039;&#039; and &#039;&#039;&#039;s.number&#039;&#039;&#039; are examples.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:ETPro]]&lt;br /&gt;
[[Category:ETPro:Mods]]&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Lua_Mod_API&amp;diff=1856</id>
		<title>Lua Mod API</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Lua_Mod_API&amp;diff=1856"/>
		<updated>2005-11-22T06:27:13Z</updated>

		<summary type="html">&lt;p&gt;Bani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOEDITSECTION__&lt;br /&gt;
ETPro now supports serverside mods via the [http://www.lua.org/ lua] scripting language.&lt;br /&gt;
&lt;br /&gt;
ETPro has an embedded lua 5.0.2 interpreter, and if present will load user-defined scripts from the etpro directory. ETPro also provides an &amp;quot;et&amp;quot; library of function calls for lua to access the server engine, and provides callbacks so a serverside mod may trigger on specific server events.&lt;br /&gt;
&lt;br /&gt;
The following standard lua libraries are initialized by default and available to ETPro lua scripts:&lt;br /&gt;
[http://www.lua.org/manual/5.0/manual.html#5.1 basic], [http://www.lua.org/manual/5.0/manual.html#5.4 table], [http://www.lua.org/manual/5.0/manual.html#5.6 i/o], [http://www.lua.org/manual/5.0/manual.html#5.3 string], [http://www.lua.org/manual/5.0/manual.html#5.5 math].&lt;br /&gt;
&lt;br /&gt;
A list of [[ETPro]] mods can be found [[:Category:ETPro:Mods|here]].&lt;br /&gt;
&lt;br /&gt;
==client commands==&lt;br /&gt;
===lua_status===&lt;br /&gt;
:lists all currently loaded lua modules.&lt;br /&gt;
:&#039;&#039;lua mods cannot override this client command.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==server commands==&lt;br /&gt;
===lua_status===&lt;br /&gt;
:lists all currently loaded lua modules.&lt;br /&gt;
&lt;br /&gt;
==cvars==&lt;br /&gt;
===lua_modules===&lt;br /&gt;
:(default &amp;quot;&amp;quot;, disabled)&lt;br /&gt;
:space separated list of lua modules for ETPro to load. modules will be run in the order listed.&lt;br /&gt;
&lt;br /&gt;
===lua_allowedmodules===&lt;br /&gt;
:(default &amp;quot;&amp;quot;, disabled)&lt;br /&gt;
:if set, only lua modules with the matching sha1 signatures listed in this cvar will be allowed to load.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
changing either cvar will cause all currently loaded modules to quit and be unloaded until the next map_restart.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==et library calls==&lt;br /&gt;
&lt;br /&gt;
===modules===&lt;br /&gt;
et.RegisterModname( &#039;&#039;&#039;modname&#039;&#039;&#039; )&lt;br /&gt;
:Registers a descriptive string &#039;&#039;&#039;modname&#039;&#039;&#039; for this mod.&lt;br /&gt;
&#039;&#039;&#039;vmnumber&#039;&#039;&#039; = et.FindSelf()&lt;br /&gt;
:Returns a number indicating the VM slot the current mod is loaded into.&lt;br /&gt;
&#039;&#039;&#039;modname&#039;&#039;&#039;, &#039;&#039;&#039;signature&#039;&#039;&#039; = et.FindMod( &#039;&#039;&#039;vmnumber&#039;&#039;&#039; )&lt;br /&gt;
:Returns the &#039;&#039;&#039;modname&#039;&#039;&#039; and sha1 &#039;&#039;&#039;signature&#039;&#039;&#039; for the mod loaded in the VM slot &#039;&#039;&#039;vmnumber&#039;&#039;&#039;. Returns nil, nil if the VM slot is invalid.&lt;br /&gt;
&#039;&#039;&#039;success&#039;&#039;&#039; = et.IPCSend( &#039;&#039;&#039;vmnumber&#039;&#039;&#039;, &#039;&#039;&#039;message&#039;&#039;&#039; )&lt;br /&gt;
:Sends the string &#039;&#039;&#039;message&#039;&#039;&#039; to the mod in the VM slot indicated by &#039;&#039;&#039;vmnumber&#039;&#039;&#039;. The mod receiving &#039;&#039;&#039;message&#039;&#039;&#039; must have an &#039;&#039;et_IPCReceive()&#039;&#039; callback. If the message is successfully sent, &#039;&#039;&#039;success&#039;&#039;&#039; will be 1. On failure it will be 0.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===printing===&lt;br /&gt;
et.G_Print( &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Prints the string &#039;&#039;&#039;text&#039;&#039;&#039; to the server console.&lt;br /&gt;
et.G_LogPrint( &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Prints the string &#039;&#039;&#039;text&#039;&#039;&#039; to the server console and writes it to the server log.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===argument handling===&lt;br /&gt;
These functions are to be used within the [[#commands|command callback functions]].&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;args&#039;&#039;&#039; = et.ConcatArgs( &#039;&#039;&#039;index&#039;&#039;&#039; )&lt;br /&gt;
:Returns all arguments beginning from &#039;&#039;&#039;index&#039;&#039;&#039; concatenated into a single string &#039;&#039;&#039;args&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;argcount&#039;&#039;&#039; = et.trap_Argc()&lt;br /&gt;
:Returns a number indicating the number of command line arguments in the command buffer.&lt;br /&gt;
&#039;&#039;&#039;arg&#039;&#039;&#039; = et.trap_Argv( &#039;&#039;&#039;argnum&#039;&#039;&#039; )&lt;br /&gt;
:Returns the contents of the command line argument &#039;&#039;&#039;argnum&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===cvars===&lt;br /&gt;
&#039;&#039;&#039;cvarvalue&#039;&#039;&#039; = et.trap_Cvar_Get( &#039;&#039;&#039;cvarname&#039;&#039;&#039; )&lt;br /&gt;
:Returns the value of the cvar &#039;&#039;&#039;cvarname&#039;&#039;&#039;&lt;br /&gt;
et.trap_Cvar_Set( &#039;&#039;&#039;cvarname&#039;&#039;&#039;, &#039;&#039;&#039;cvarvalue&#039;&#039;&#039; )&lt;br /&gt;
:Sets the cvar &#039;&#039;&#039;cvarname&#039;&#039;&#039; to &#039;&#039;&#039;cvarvalue&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===configstrings===&lt;br /&gt;
&#039;&#039;&#039;configstringvalue&#039;&#039;&#039; = et.trap_GetConfigstring( &#039;&#039;&#039;index&#039;&#039;&#039; )&lt;br /&gt;
:Returns the string &#039;&#039;&#039;configstringvalue&#039;&#039;&#039; containing the contents of the configstring &#039;&#039;&#039;index&#039;&#039;&#039;&lt;br /&gt;
et.trap_SetConfigstring( &#039;&#039;&#039;index&#039;&#039;&#039;, &#039;&#039;&#039;configstringvalue&#039;&#039;&#039; )&lt;br /&gt;
:Sets the configstring &#039;&#039;&#039;index&#039;&#039;&#039; to the string &#039;&#039;&#039;configstringvalue&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===server===&lt;br /&gt;
et.trap_SendConsoleCommand( &#039;&#039;&#039;when&#039;&#039;&#039;, &#039;&#039;&#039;command&#039;&#039;&#039; )&lt;br /&gt;
:Sends the command &#039;&#039;&#039;command&#039;&#039;&#039; to the server console, to be executed &#039;&#039;&#039;when&#039;&#039;&#039; (see et.EXEC_* constants)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===clients===&lt;br /&gt;
et.trap_DropClient( &#039;&#039;&#039;clientnum&#039;&#039;&#039;, &#039;&#039;&#039;reason&#039;&#039;&#039;, &#039;&#039;&#039;ban_time&#039;&#039;&#039; )&lt;br /&gt;
:Disconnects &#039;&#039;&#039;clientnum&#039;&#039;&#039; from the server, with descriptive string &#039;&#039;&#039;reason&#039;&#039;&#039; reported to clients. &#039;&#039;&#039;ban_time&#039;&#039;&#039; is the time in seconds to ban the client from the server. &#039;&#039;&#039;ban_time&#039;&#039;&#039; is optional and may be entirely omitted, in which case the ban time defaults to the cvar &#039;&#039;b_defaultbantime&#039;&#039;&lt;br /&gt;
et.trap_SendServerCommand( &#039;&#039;&#039;clientnum&#039;&#039;&#039;, &#039;&#039;&#039;command&#039;&#039;&#039; )&lt;br /&gt;
:Sends the command &#039;&#039;&#039;command&#039;&#039;&#039; to the client &#039;&#039;&#039;clientnum&#039;&#039;&#039;. If &#039;&#039;&#039;clientnum&#039;&#039;&#039; is -1, the &#039;&#039;&#039;command&#039;&#039;&#039; is broadcast to all connected clients.&lt;br /&gt;
et.G_Say( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;mode&#039;&#039;&#039;, &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Sends a chat command on behalf of client &#039;&#039;&#039;clientNum&#039;&#039;&#039; with the mode &#039;&#039;&#039;mode&#039;&#039;&#039; (see et.SAY_* constants) and chat text &#039;&#039;&#039;text&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===userinfo===&lt;br /&gt;
&#039;&#039;&#039;userinfo&#039;&#039;&#039; = et.trap_GetUserinfo( &#039;&#039;&#039;clientnum&#039;&#039;&#039; )&lt;br /&gt;
:Returns the contents of the userinfo string for the client &#039;&#039;&#039;clientnum&#039;&#039;&#039;&lt;br /&gt;
et.trap_SetUserinfo( &#039;&#039;&#039;clientnum&#039;&#039;&#039;, &#039;&#039;&#039;userinfo&#039;&#039;&#039; )&lt;br /&gt;
:Sets the userinfo string for the client &#039;&#039;&#039;clientnum&#039;&#039;&#039; to &#039;&#039;&#039;userinfo&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===string utility functions===&lt;br /&gt;
&#039;&#039;&#039;infostring&#039;&#039;&#039; = et.Info_RemoveKey( &#039;&#039;&#039;infostring&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039; )&lt;br /&gt;
:Removes key &#039;&#039;&#039;key&#039;&#039;&#039; from infostring &#039;&#039;&#039;infostring&#039;&#039;&#039; and returns the modified infostring.&lt;br /&gt;
&#039;&#039;&#039;infostring&#039;&#039;&#039; = et.Info_SetValueForKey( &#039;&#039;&#039;infostring&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039;, &#039;&#039;&#039;value&#039;&#039;&#039; )&lt;br /&gt;
:Sets the key &#039;&#039;&#039;key&#039;&#039;&#039; in the infostring &#039;&#039;&#039;infostring&#039;&#039;&#039; to &#039;&#039;&#039;value&#039;&#039;&#039; and returns the modified infostring.&lt;br /&gt;
&#039;&#039;&#039;keyvalue&#039;&#039;&#039; = et.Info_ValueForKey( &#039;&#039;&#039;infostring&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039; )&lt;br /&gt;
:Returns the value of the key &#039;&#039;&#039;key&#039;&#039;&#039; in the infostring &#039;&#039;&#039;infostring&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;cleanstring&#039;&#039;&#039; = et.Q_CleanStr( &#039;&#039;&#039;string&#039;&#039;&#039; )&lt;br /&gt;
:Returns &#039;&#039;&#039;string&#039;&#039;&#039; stripped of all color codes&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ET filesystem===&lt;br /&gt;
&#039;&#039;&#039;fd&#039;&#039;&#039;, &#039;&#039;&#039;len&#039;&#039;&#039; = et.trap_FS_FOpenFile( &#039;&#039;&#039;filename&#039;&#039;&#039;, &#039;&#039;&#039;mode&#039;&#039;&#039; )&lt;br /&gt;
:Attempts to open the file &#039;&#039;&#039;filename&#039;&#039;&#039; with the access mode &#039;&#039;&#039;mode&#039;&#039;&#039; (see et.FS_ constants). Returns the filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039; and file length &#039;&#039;&#039;len&#039;&#039;&#039;. On error, &#039;&#039;&#039;len&#039;&#039;&#039; returns -1.&lt;br /&gt;
&#039;&#039;&#039;filedata&#039;&#039;&#039; = et.trap_FS_Read( fd, count )&lt;br /&gt;
:Reads &#039;&#039;&#039;count&#039;&#039;&#039; bytes from filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039;.&lt;br /&gt;
&#039;&#039;&#039;count&#039;&#039;&#039; = et.trap_FS_Write( &#039;&#039;&#039;filedata&#039;&#039;&#039;, &#039;&#039;&#039;count&#039;&#039;&#039;, &#039;&#039;&#039;fd&#039;&#039;&#039; )&lt;br /&gt;
:Attempts to write &#039;&#039;&#039;count&#039;&#039;&#039; bytes of &#039;&#039;&#039;filedata&#039;&#039;&#039; to filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039;. Returns number of bytes successfully written.&lt;br /&gt;
et.trap_FS_Rename( &#039;&#039;&#039;oldname&#039;&#039;&#039;, &#039;&#039;&#039;newname&#039;&#039;&#039; )&lt;br /&gt;
:Renames file &#039;&#039;&#039;oldname&#039;&#039;&#039; to &#039;&#039;&#039;newname&#039;&#039;&#039;.&lt;br /&gt;
et.trap_FS_FCloseFile( &#039;&#039;&#039;fd&#039;&#039;&#039; )&lt;br /&gt;
:Closes filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===indexes===&lt;br /&gt;
&#039;&#039;&#039;soundindex&#039;&#039;&#039; = et.G_SoundIndex( &#039;&#039;&#039;filename&#039;&#039;&#039; )&lt;br /&gt;
:Returns an index to the soundfile indicated by &#039;&#039;&#039;filename&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;modelindex&#039;&#039;&#039; = et.G_ModelIndex( &#039;&#039;&#039;filename&#039;&#039;&#039; )&lt;br /&gt;
:Returns an index to the model indicated by &#039;&#039;&#039;filename&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sound===&lt;br /&gt;
et.G_globalSound( &#039;&#039;&#039;sound&#039;&#039;&#039; )&lt;br /&gt;
:Plays the global sound indicated by the filename &#039;&#039;&#039;sound&#039;&#039;&#039;.&lt;br /&gt;
et.G_Sound( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;soundindex&#039;&#039;&#039; )&lt;br /&gt;
:Plays the sound &#039;&#039;&#039;soundindex&#039;&#039;&#039; at the location of entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===miscellaneous===&lt;br /&gt;
&#039;&#039;&#039;milliseconds&#039;&#039;&#039; = et.trap_Milliseconds()&lt;br /&gt;
:Returns a number indicating the current server time in milliseconds.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===entities===&lt;br /&gt;
&#039;&#039;&#039;entnum&#039;&#039;&#039; = et.G_Spawn()&lt;br /&gt;
:Spawns a new entity and returns the new entity number.&lt;br /&gt;
&#039;&#039;&#039;entnum&#039;&#039;&#039; = et.G_TempEntity( &#039;&#039;&#039;origin&#039;&#039;&#039;, &#039;&#039;&#039;event&#039;&#039;&#039; )&lt;br /&gt;
:Spawns a new TempEntity of event type &#039;&#039;&#039;event&#039;&#039;&#039; and places it at &#039;&#039;&#039;origin&#039;&#039;&#039; in the world.&lt;br /&gt;
et.G_FreeEntity( &#039;&#039;&#039;entnum&#039;&#039;&#039; )&lt;br /&gt;
:Frees the entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;spawnval&#039;&#039;&#039; = et.G_GetSpawnVar( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039; )&lt;br /&gt;
:Returns the value of spawnvar &#039;&#039;&#039;key&#039;&#039;&#039; for entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
et.G_SetSpawnVar( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039;, &#039;&#039;&#039;value&#039;&#039;&#039; )&lt;br /&gt;
:Sets the spawnvar &#039;&#039;&#039;key&#039;&#039;&#039; to &#039;&#039;&#039;value&#039;&#039;&#039; for entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;integer entnum&#039;&#039;&#039; = et.G_SpawnGEntityFromSpawnVars( string spawnvar, string spawnvalue, ... )&lt;br /&gt;
:This function can only be called inside the &#039;&#039;&#039;et_InitGame&#039;&#039;&#039; callback&lt;br /&gt;
et.trap_LinkEntity( &#039;&#039;&#039;entnum&#039;&#039;&#039; )&lt;br /&gt;
:Links the entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
et.trap_UnlinkEntity( &#039;&#039;&#039;entnum&#039;&#039;&#039; )&lt;br /&gt;
:Unlinks the entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;(variable)&#039;&#039;&#039; = et.gentity_get ( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;[[Fieldname]]&#039;&#039;&#039; )&lt;br /&gt;
:Gets the value of &#039;&#039;&#039;[[Fieldname]]&#039;&#039;&#039; from entity &#039;&#039;&#039;entnum&#039;&#039;&#039; out of the g_entity struct. For NULL entities or clients, &#039;&#039;nil&#039;&#039; is returned.&amp;lt;br&amp;gt;&lt;br /&gt;
et.gentity_set( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;[[Fieldname]]&#039;&#039;&#039;, &#039;&#039;&#039;(variable)&#039;&#039;&#039; )&lt;br /&gt;
:Sets the value of &#039;&#039;&#039;[[Fieldname]]&#039;&#039;&#039; from entity &#039;&#039;&#039;entnum&#039;&#039;&#039; in the g_entity struct to &#039;&#039;&#039;(variable)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==callbacks==&lt;br /&gt;
&lt;br /&gt;
===qagame execution===&lt;br /&gt;
et_InitGame( &#039;&#039;&#039;levelTime&#039;&#039;&#039;, &#039;&#039;&#039;randomSeed&#039;&#039;&#039;, &#039;&#039;&#039;restart&#039;&#039;&#039; )&lt;br /&gt;
:Called when qagame initializes. &#039;&#039;&#039;levelTime&#039;&#039;&#039; is the current level time in milliseconds. &#039;&#039;&#039;randomSeed&#039;&#039;&#039; is a number that can be used to seed random number generators. &#039;&#039;&#039;restart&#039;&#039;&#039; indicates if et_InitGame() is being called due to a map restart (1) or not (0).&lt;br /&gt;
et_ShutdownGame( &#039;&#039;&#039;restart&#039;&#039;&#039; )&lt;br /&gt;
:Called when qagame shuts down. &#039;&#039;&#039;restart&#039;&#039;&#039; indicates if the shutdown is being called due to a map_restart (1) or not (0).&lt;br /&gt;
et_RunFrame( &#039;&#039;&#039;levelTime&#039;&#039;&#039; )&lt;br /&gt;
:Called when qagame runs a server frame. &#039;&#039;&#039;levelTime&#039;&#039;&#039; is the current level time in milliseconds.&lt;br /&gt;
et_Quit()&lt;br /&gt;
:Called when ETPro unloads the mod. The mod should close all open filedescriptors and perform all cleanup.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===client management===&lt;br /&gt;
&#039;&#039;&#039;rejectreason&#039;&#039;&#039; = et_ClientConnect( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;firstTime&#039;&#039;&#039;, &#039;&#039;&#039;isBot&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client attempts to connect to the server. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id, &#039;&#039;&#039;firstTime&#039;&#039;&#039; indicates if this is a new connection (1) or a reconnection (0). &#039;&#039;&#039;isBot&#039;&#039;&#039; indicates if the client is a bot (1) or not (0). If the mod accepts the connection, it should return nil. Otherwise, the mod should return a string describing the reason the client connection was rejected.&lt;br /&gt;
et_ClientDisconnect( &#039;&#039;&#039;clientNum&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client disconnects. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id.&lt;br /&gt;
et_ClientBegin( &#039;&#039;&#039;clientNum&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client begins (becomes active, and enters the gameworld). &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id.&lt;br /&gt;
et_ClientUserinfoChanged( &#039;&#039;&#039;clientNum&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client&#039;s Userinfo string has changed. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===commands===&lt;br /&gt;
&#039;&#039;&#039;intercepted&#039;&#039;&#039; = et_ClientCommand( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;command&#039;&#039;&#039; )&lt;br /&gt;
:Called when a command is received from a client. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id. &#039;&#039;&#039;command&#039;&#039;&#039; is the command. The mod should return 1 if the command was intercepted by the mod, and 0 if the command was ignored by the mod and should be passed through to the server (and other mods in the chain).&lt;br /&gt;
:The actual command can be accessed through the [[#argument_handling|argument handling]] functions, as seen in the [[ETPro:Lua Sample Code]].&lt;br /&gt;
&#039;&#039;&#039;intercepted&#039;&#039;&#039; = et_ConsoleCommand()&lt;br /&gt;
:Called when a command is entered on the server console. The mod should return 1 if the command was intercepted by the mod, and 0 if the command was ignored by the mod and should be passed through to the server (and other mods in the chain).&lt;br /&gt;
:The actual command can be accessed through the [[#argument_handling|argument handling]] functions, as seen in the [[ETPro:Lua Sample Code]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===miscellaneous===&lt;br /&gt;
et_IPCReceive( &#039;&#039;&#039;vmnumber&#039;&#039;&#039;, &#039;&#039;&#039;message&#039;&#039;&#039; )&lt;br /&gt;
:Called when another mod sends an et.IPCSend() message to this mod. &#039;&#039;&#039;vmnumber&#039;&#039;&#039; is the VM slot number of the sender, and &#039;&#039;&#039;message&#039;&#039;&#039; is the message.&lt;br /&gt;
et_Print( &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Called whenever the server or qagame prints a string to the console.&lt;br /&gt;
et_Obituary( &#039;&#039;&#039;victim&#039;&#039;&#039;, &#039;&#039;&#039;killer&#039;&#039;&#039;, &#039;&#039;&#039;meansOfDeath&#039;&#039;&#039; )&lt;br /&gt;
:Called whenever a player is killed.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==predefined constants==&lt;br /&gt;
et.EXEC_NOW&amp;lt;br&amp;gt;&lt;br /&gt;
et.EXEC_INSERT&amp;lt;br&amp;gt;&lt;br /&gt;
et.EXEC_APPEND&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_READ&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_WRITE&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_APPEND&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_APPEND_SYNC&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_ALL&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_TEAM&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_BUDDY&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_TEAMNL&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
et.HOSTARCH&lt;br /&gt;
:set to WIN32 or UNIX depending on the host architecture qagame is running on.&lt;br /&gt;
LUA_PATH&lt;br /&gt;
:set to fs_homepath/fs_game/?.lua in order to ease use of the [http://www.lua.org/pil/8.1.html require] function.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==configs==&lt;br /&gt;
If a config is loaded, all modules are shutdown and reloaded. If a &#039;&#039;certified&#039;&#039; config is loaded, all modules are shutdown and reloaded, and additionally the following functions are disabled: &#039;&#039;&#039;require()&#039;&#039;&#039;, &#039;&#039;&#039;loadfile()&#039;&#039;&#039;, &#039;&#039;&#039;loadlib()&#039;&#039;&#039;, &#039;&#039;&#039;loadstring()&#039;&#039;&#039;, &#039;&#039;&#039;dofile()&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==caveats==&lt;br /&gt;
Like qagame, lua modules are unloaded and reloaded on map_restart and map changes. This means that all global variables and other information is lost. Mods may choose to store persistent data in cvars or external files.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
&lt;br /&gt;
Q: OMG I hate the libary prefix et.* on everything!!11!1oneone&amp;lt;br&amp;gt;&lt;br /&gt;
A: table.foreach(et, function (func, value) _G[func] = value; end)&lt;br /&gt;
&lt;br /&gt;
Q: How do a re-load my lua file without restarting the whole server ?&amp;lt;br&amp;gt;&lt;br /&gt;
A: change maps or map_restart&lt;br /&gt;
&lt;br /&gt;
Q: Can I see some sample code?&amp;lt;br&amp;gt;&lt;br /&gt;
A: [[ETPro:Lua Sample Code]]&lt;br /&gt;
&lt;br /&gt;
Q: Is there a list of [[ETPro]] mods?&amp;lt;br&amp;gt;&lt;br /&gt;
A: Yes, [[:Category:ETPro:Mods|here]].&lt;br /&gt;
&lt;br /&gt;
Q: OMG my mod doesn&#039;t work!&amp;lt;br&amp;gt;&lt;br /&gt;
A: Make sure you added your mod&#039;s filename to the lua_modules cvar (e.g. set lua_modules mymod.lua).&lt;br /&gt;
&lt;br /&gt;
Q: OMG why has et_ClientSay been removed?&amp;lt;br&amp;gt;&lt;br /&gt;
A: Thats a secret but, to keep the function as it was, just add the following code to your et_ClientCommand() function&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;	-- et_ClientSay had to be removed in order to intercept all commands &lt;br /&gt;
	-- so here&#039;s a wrapper for that&lt;br /&gt;
		arg0 = et.trap_Argv(0) -- get the main command&lt;br /&gt;
		&lt;br /&gt;
		if arg0 == &amp;quot;say&amp;quot; then&lt;br /&gt;
			return et_ClientSay( clientNum, et.SAY_ALL, et.ConcatArgs(1))&lt;br /&gt;
		elseif arg0 == &amp;quot;say_team&amp;quot; then&lt;br /&gt;
			return et_ClientSay( clientNum, et.SAY_TEAM, et.ConcatArgs(1))&lt;br /&gt;
		elseif arg0 == &amp;quot;say_buddy&amp;quot; then&lt;br /&gt;
			return et_ClientSay( clientNum, et.SAY_BUDDY, et.ConcatArgs(1))&lt;br /&gt;
		elseif arg0 == &amp;quot;say_teamnl&amp;quot; then&lt;br /&gt;
			return et_ClientSay( clientNum, et.SAY_TEAMNL, et.ConcatArgs(1))&lt;br /&gt;
		end&lt;br /&gt;
	-- et_ClientSay wrapper end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:ETPro]]&lt;br /&gt;
[[Category:ETPro:Mods]]&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Lua_Mod_API&amp;diff=1855</id>
		<title>Lua Mod API</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Lua_Mod_API&amp;diff=1855"/>
		<updated>2005-11-22T06:07:30Z</updated>

		<summary type="html">&lt;p&gt;Bani: etpro beta version no longer relevant&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOEDITSECTION__&lt;br /&gt;
ETPro now supports serverside mods via the [http://www.lua.org/ lua] scripting language.&lt;br /&gt;
&lt;br /&gt;
ETPro has an embedded lua 5.0.2 interpreter, and if present will load user-defined scripts from the etpro directory. ETPro also provides an &amp;quot;et&amp;quot; library of function calls for lua to access the server engine, and provides callbacks so a serverside mod may trigger on specific server events.&lt;br /&gt;
&lt;br /&gt;
The following standard lua libraries are initialized by default and available to ETPro lua scripts:&lt;br /&gt;
[http://www.lua.org/manual/5.0/manual.html#5.1 basic], [http://www.lua.org/manual/5.0/manual.html#5.4 table], [http://www.lua.org/manual/5.0/manual.html#5.6 i/o], [http://www.lua.org/manual/5.0/manual.html#5.3 string], [http://www.lua.org/manual/5.0/manual.html#5.5 math].&lt;br /&gt;
&lt;br /&gt;
A list of [[ETPro]] mods can be found [[:Category:ETPro:Mods|here]].&lt;br /&gt;
&lt;br /&gt;
==server commands==&lt;br /&gt;
===lua_status===&lt;br /&gt;
:lists all currently loaded lua modules.&lt;br /&gt;
&lt;br /&gt;
==cvars==&lt;br /&gt;
===lua_modules===&lt;br /&gt;
:(default &amp;quot;&amp;quot;, disabled)&lt;br /&gt;
:space separated list of lua modules for ETPro to load. modules will be run in the order listed.&lt;br /&gt;
&lt;br /&gt;
===lua_allowedmodules===&lt;br /&gt;
:(default &amp;quot;&amp;quot;, disabled)&lt;br /&gt;
:if set, only lua modules with the matching sha1 signatures listed in this cvar will be allowed to load.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
changing either cvar will cause all currently loaded modules to quit and be unloaded until the next map_restart.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==et library calls==&lt;br /&gt;
&lt;br /&gt;
===modules===&lt;br /&gt;
et.RegisterModname( &#039;&#039;&#039;modname&#039;&#039;&#039; )&lt;br /&gt;
:Registers a descriptive string &#039;&#039;&#039;modname&#039;&#039;&#039; for this mod.&lt;br /&gt;
&#039;&#039;&#039;vmnumber&#039;&#039;&#039; = et.FindSelf()&lt;br /&gt;
:Returns a number indicating the VM slot the current mod is loaded into.&lt;br /&gt;
&#039;&#039;&#039;modname&#039;&#039;&#039;, &#039;&#039;&#039;signature&#039;&#039;&#039; = et.FindMod( &#039;&#039;&#039;vmnumber&#039;&#039;&#039; )&lt;br /&gt;
:Returns the &#039;&#039;&#039;modname&#039;&#039;&#039; and sha1 &#039;&#039;&#039;signature&#039;&#039;&#039; for the mod loaded in the VM slot &#039;&#039;&#039;vmnumber&#039;&#039;&#039;. Returns nil, nil if the VM slot is invalid.&lt;br /&gt;
&#039;&#039;&#039;success&#039;&#039;&#039; = et.IPCSend( &#039;&#039;&#039;vmnumber&#039;&#039;&#039;, &#039;&#039;&#039;message&#039;&#039;&#039; )&lt;br /&gt;
:Sends the string &#039;&#039;&#039;message&#039;&#039;&#039; to the mod in the VM slot indicated by &#039;&#039;&#039;vmnumber&#039;&#039;&#039;. The mod receiving &#039;&#039;&#039;message&#039;&#039;&#039; must have an &#039;&#039;et_IPCReceive()&#039;&#039; callback. If the message is successfully sent, &#039;&#039;&#039;success&#039;&#039;&#039; will be 1. On failure it will be 0.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===printing===&lt;br /&gt;
et.G_Print( &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Prints the string &#039;&#039;&#039;text&#039;&#039;&#039; to the server console.&lt;br /&gt;
et.G_LogPrint( &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Prints the string &#039;&#039;&#039;text&#039;&#039;&#039; to the server console and writes it to the server log.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===argument handling===&lt;br /&gt;
These functions are to be used within the [[#commands|command callback functions]].&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;args&#039;&#039;&#039; = et.ConcatArgs( &#039;&#039;&#039;index&#039;&#039;&#039; )&lt;br /&gt;
:Returns all arguments beginning from &#039;&#039;&#039;index&#039;&#039;&#039; concatenated into a single string &#039;&#039;&#039;args&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;argcount&#039;&#039;&#039; = et.trap_Argc()&lt;br /&gt;
:Returns a number indicating the number of command line arguments in the command buffer.&lt;br /&gt;
&#039;&#039;&#039;arg&#039;&#039;&#039; = et.trap_Argv( &#039;&#039;&#039;argnum&#039;&#039;&#039; )&lt;br /&gt;
:Returns the contents of the command line argument &#039;&#039;&#039;argnum&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===cvars===&lt;br /&gt;
&#039;&#039;&#039;cvarvalue&#039;&#039;&#039; = et.trap_Cvar_Get( &#039;&#039;&#039;cvarname&#039;&#039;&#039; )&lt;br /&gt;
:Returns the value of the cvar &#039;&#039;&#039;cvarname&#039;&#039;&#039;&lt;br /&gt;
et.trap_Cvar_Set( &#039;&#039;&#039;cvarname&#039;&#039;&#039;, &#039;&#039;&#039;cvarvalue&#039;&#039;&#039; )&lt;br /&gt;
:Sets the cvar &#039;&#039;&#039;cvarname&#039;&#039;&#039; to &#039;&#039;&#039;cvarvalue&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===configstrings===&lt;br /&gt;
&#039;&#039;&#039;configstringvalue&#039;&#039;&#039; = et.trap_GetConfigstring( &#039;&#039;&#039;index&#039;&#039;&#039; )&lt;br /&gt;
:Returns the string &#039;&#039;&#039;configstringvalue&#039;&#039;&#039; containing the contents of the configstring &#039;&#039;&#039;index&#039;&#039;&#039;&lt;br /&gt;
et.trap_SetConfigstring( &#039;&#039;&#039;index&#039;&#039;&#039;, &#039;&#039;&#039;configstringvalue&#039;&#039;&#039; )&lt;br /&gt;
:Sets the configstring &#039;&#039;&#039;index&#039;&#039;&#039; to the string &#039;&#039;&#039;configstringvalue&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===server===&lt;br /&gt;
et.trap_SendConsoleCommand( &#039;&#039;&#039;when&#039;&#039;&#039;, &#039;&#039;&#039;command&#039;&#039;&#039; )&lt;br /&gt;
:Sends the command &#039;&#039;&#039;command&#039;&#039;&#039; to the server console, to be executed &#039;&#039;&#039;when&#039;&#039;&#039; (see et.EXEC_* constants)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===clients===&lt;br /&gt;
et.trap_DropClient( &#039;&#039;&#039;clientnum&#039;&#039;&#039;, &#039;&#039;&#039;reason&#039;&#039;&#039;, &#039;&#039;&#039;ban_time&#039;&#039;&#039; )&lt;br /&gt;
:Disconnects &#039;&#039;&#039;clientnum&#039;&#039;&#039; from the server, with descriptive string &#039;&#039;&#039;reason&#039;&#039;&#039; reported to clients. &#039;&#039;&#039;ban_time&#039;&#039;&#039; is the time in seconds to ban the client from the server. &#039;&#039;&#039;ban_time&#039;&#039;&#039; is optional and may be entirely omitted, in which case the ban time defaults to the cvar &#039;&#039;b_defaultbantime&#039;&#039;&lt;br /&gt;
et.trap_SendServerCommand( &#039;&#039;&#039;clientnum&#039;&#039;&#039;, &#039;&#039;&#039;command&#039;&#039;&#039; )&lt;br /&gt;
:Sends the command &#039;&#039;&#039;command&#039;&#039;&#039; to the client &#039;&#039;&#039;clientnum&#039;&#039;&#039;. If &#039;&#039;&#039;clientnum&#039;&#039;&#039; is -1, the &#039;&#039;&#039;command&#039;&#039;&#039; is broadcast to all connected clients.&lt;br /&gt;
et.G_Say( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;mode&#039;&#039;&#039;, &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Sends a chat command on behalf of client &#039;&#039;&#039;clientNum&#039;&#039;&#039; with the mode &#039;&#039;&#039;mode&#039;&#039;&#039; (see et.SAY_* constants) and chat text &#039;&#039;&#039;text&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===userinfo===&lt;br /&gt;
&#039;&#039;&#039;userinfo&#039;&#039;&#039; = et.trap_GetUserinfo( &#039;&#039;&#039;clientnum&#039;&#039;&#039; )&lt;br /&gt;
:Returns the contents of the userinfo string for the client &#039;&#039;&#039;clientnum&#039;&#039;&#039;&lt;br /&gt;
et.trap_SetUserinfo( &#039;&#039;&#039;clientnum&#039;&#039;&#039;, &#039;&#039;&#039;userinfo&#039;&#039;&#039; )&lt;br /&gt;
:Sets the userinfo string for the client &#039;&#039;&#039;clientnum&#039;&#039;&#039; to &#039;&#039;&#039;userinfo&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===string utility functions===&lt;br /&gt;
&#039;&#039;&#039;infostring&#039;&#039;&#039; = et.Info_RemoveKey( &#039;&#039;&#039;infostring&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039; )&lt;br /&gt;
:Removes key &#039;&#039;&#039;key&#039;&#039;&#039; from infostring &#039;&#039;&#039;infostring&#039;&#039;&#039; and returns the modified infostring.&lt;br /&gt;
&#039;&#039;&#039;infostring&#039;&#039;&#039; = et.Info_SetValueForKey( &#039;&#039;&#039;infostring&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039;, &#039;&#039;&#039;value&#039;&#039;&#039; )&lt;br /&gt;
:Sets the key &#039;&#039;&#039;key&#039;&#039;&#039; in the infostring &#039;&#039;&#039;infostring&#039;&#039;&#039; to &#039;&#039;&#039;value&#039;&#039;&#039; and returns the modified infostring.&lt;br /&gt;
&#039;&#039;&#039;keyvalue&#039;&#039;&#039; = et.Info_ValueForKey( &#039;&#039;&#039;infostring&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039; )&lt;br /&gt;
:Returns the value of the key &#039;&#039;&#039;key&#039;&#039;&#039; in the infostring &#039;&#039;&#039;infostring&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;cleanstring&#039;&#039;&#039; = et.Q_CleanStr( &#039;&#039;&#039;string&#039;&#039;&#039; )&lt;br /&gt;
:Returns &#039;&#039;&#039;string&#039;&#039;&#039; stripped of all color codes&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ET filesystem===&lt;br /&gt;
&#039;&#039;&#039;fd&#039;&#039;&#039;, &#039;&#039;&#039;len&#039;&#039;&#039; = et.trap_FS_FOpenFile( &#039;&#039;&#039;filename&#039;&#039;&#039;, &#039;&#039;&#039;mode&#039;&#039;&#039; )&lt;br /&gt;
:Attempts to open the file &#039;&#039;&#039;filename&#039;&#039;&#039; with the access mode &#039;&#039;&#039;mode&#039;&#039;&#039; (see et.FS_ constants). Returns the filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039; and file length &#039;&#039;&#039;len&#039;&#039;&#039;. On error, &#039;&#039;&#039;len&#039;&#039;&#039; returns -1.&lt;br /&gt;
&#039;&#039;&#039;filedata&#039;&#039;&#039; = et.trap_FS_Read( fd, count )&lt;br /&gt;
:Reads &#039;&#039;&#039;count&#039;&#039;&#039; bytes from filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039;.&lt;br /&gt;
&#039;&#039;&#039;count&#039;&#039;&#039; = et.trap_FS_Write( &#039;&#039;&#039;filedata&#039;&#039;&#039;, &#039;&#039;&#039;count&#039;&#039;&#039;, &#039;&#039;&#039;fd&#039;&#039;&#039; )&lt;br /&gt;
:Attempts to write &#039;&#039;&#039;count&#039;&#039;&#039; bytes of &#039;&#039;&#039;filedata&#039;&#039;&#039; to filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039;. Returns number of bytes successfully written.&lt;br /&gt;
et.trap_FS_Rename( &#039;&#039;&#039;oldname&#039;&#039;&#039;, &#039;&#039;&#039;newname&#039;&#039;&#039; )&lt;br /&gt;
:Renames file &#039;&#039;&#039;oldname&#039;&#039;&#039; to &#039;&#039;&#039;newname&#039;&#039;&#039;.&lt;br /&gt;
et.trap_FS_FCloseFile( &#039;&#039;&#039;fd&#039;&#039;&#039; )&lt;br /&gt;
:Closes filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===indexes===&lt;br /&gt;
&#039;&#039;&#039;soundindex&#039;&#039;&#039; = et.G_SoundIndex( &#039;&#039;&#039;filename&#039;&#039;&#039; )&lt;br /&gt;
:Returns an index to the soundfile indicated by &#039;&#039;&#039;filename&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;modelindex&#039;&#039;&#039; = et.G_ModelIndex( &#039;&#039;&#039;filename&#039;&#039;&#039; )&lt;br /&gt;
:Returns an index to the model indicated by &#039;&#039;&#039;filename&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sound===&lt;br /&gt;
et.G_globalSound( &#039;&#039;&#039;sound&#039;&#039;&#039; )&lt;br /&gt;
:Plays the global sound indicated by the filename &#039;&#039;&#039;sound&#039;&#039;&#039;.&lt;br /&gt;
et.G_Sound( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;soundindex&#039;&#039;&#039; )&lt;br /&gt;
:Plays the sound &#039;&#039;&#039;soundindex&#039;&#039;&#039; at the location of entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===miscellaneous===&lt;br /&gt;
&#039;&#039;&#039;milliseconds&#039;&#039;&#039; = et.trap_Milliseconds()&lt;br /&gt;
:Returns a number indicating the current server time in milliseconds.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===entities===&lt;br /&gt;
&#039;&#039;&#039;entnum&#039;&#039;&#039; = et.G_Spawn()&lt;br /&gt;
:Spawns a new entity and returns the new entity number.&lt;br /&gt;
&#039;&#039;&#039;entnum&#039;&#039;&#039; = et.G_TempEntity( &#039;&#039;&#039;origin&#039;&#039;&#039;, &#039;&#039;&#039;event&#039;&#039;&#039; )&lt;br /&gt;
:Spawns a new TempEntity of event type &#039;&#039;&#039;event&#039;&#039;&#039; and places it at &#039;&#039;&#039;origin&#039;&#039;&#039; in the world.&lt;br /&gt;
et.G_FreeEntity( &#039;&#039;&#039;entnum&#039;&#039;&#039; )&lt;br /&gt;
:Frees the entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;spawnval&#039;&#039;&#039; = et.G_GetSpawnVar( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039; )&lt;br /&gt;
:Returns the value of spawnvar &#039;&#039;&#039;key&#039;&#039;&#039; for entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
et.G_SetSpawnVar( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039;, &#039;&#039;&#039;value&#039;&#039;&#039; )&lt;br /&gt;
:Sets the spawnvar &#039;&#039;&#039;key&#039;&#039;&#039; to &#039;&#039;&#039;value&#039;&#039;&#039; for entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;integer entnum&#039;&#039;&#039; = et.G_SpawnGEntityFromSpawnVars( string spawnvar, string spawnvalue, ... )&lt;br /&gt;
:This function can only be called inside the &#039;&#039;&#039;et_InitGame&#039;&#039;&#039; callback&lt;br /&gt;
et.trap_LinkEntity( &#039;&#039;&#039;entnum&#039;&#039;&#039; )&lt;br /&gt;
:Links the entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
et.trap_UnlinkEntity( &#039;&#039;&#039;entnum&#039;&#039;&#039; )&lt;br /&gt;
:Unlinks the entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;(variable)&#039;&#039;&#039; = et.gentity_get ( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;[[Fieldname]]&#039;&#039;&#039; )&lt;br /&gt;
:Gets the value of &#039;&#039;&#039;[[Fieldname]]&#039;&#039;&#039; from entity &#039;&#039;&#039;entnum&#039;&#039;&#039; out of the g_entity struct. For NULL entities or clients, &#039;&#039;nil&#039;&#039; is returned.&amp;lt;br&amp;gt;&lt;br /&gt;
et.gentity_set( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;[[Fieldname]]&#039;&#039;&#039;, &#039;&#039;&#039;(variable)&#039;&#039;&#039; )&lt;br /&gt;
:Sets the value of &#039;&#039;&#039;[[Fieldname]]&#039;&#039;&#039; from entity &#039;&#039;&#039;entnum&#039;&#039;&#039; in the g_entity struct to &#039;&#039;&#039;(variable)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==callbacks==&lt;br /&gt;
&lt;br /&gt;
===qagame execution===&lt;br /&gt;
et_InitGame( &#039;&#039;&#039;levelTime&#039;&#039;&#039;, &#039;&#039;&#039;randomSeed&#039;&#039;&#039;, &#039;&#039;&#039;restart&#039;&#039;&#039; )&lt;br /&gt;
:Called when qagame initializes. &#039;&#039;&#039;levelTime&#039;&#039;&#039; is the current level time in milliseconds. &#039;&#039;&#039;randomSeed&#039;&#039;&#039; is a number that can be used to seed random number generators. &#039;&#039;&#039;restart&#039;&#039;&#039; indicates if et_InitGame() is being called due to a map restart (1) or not (0).&lt;br /&gt;
et_ShutdownGame( &#039;&#039;&#039;restart&#039;&#039;&#039; )&lt;br /&gt;
:Called when qagame shuts down. &#039;&#039;&#039;restart&#039;&#039;&#039; indicates if the shutdown is being called due to a map_restart (1) or not (0).&lt;br /&gt;
et_RunFrame( &#039;&#039;&#039;levelTime&#039;&#039;&#039; )&lt;br /&gt;
:Called when qagame runs a server frame. &#039;&#039;&#039;levelTime&#039;&#039;&#039; is the current level time in milliseconds.&lt;br /&gt;
et_Quit()&lt;br /&gt;
:Called when ETPro unloads the mod. The mod should close all open filedescriptors and perform all cleanup.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===client management===&lt;br /&gt;
&#039;&#039;&#039;rejectreason&#039;&#039;&#039; = et_ClientConnect( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;firstTime&#039;&#039;&#039;, &#039;&#039;&#039;isBot&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client attempts to connect to the server. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id, &#039;&#039;&#039;firstTime&#039;&#039;&#039; indicates if this is a new connection (1) or a reconnection (0). &#039;&#039;&#039;isBot&#039;&#039;&#039; indicates if the client is a bot (1) or not (0). If the mod accepts the connection, it should return nil. Otherwise, the mod should return a string describing the reason the client connection was rejected.&lt;br /&gt;
et_ClientDisconnect( &#039;&#039;&#039;clientNum&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client disconnects. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id.&lt;br /&gt;
et_ClientBegin( &#039;&#039;&#039;clientNum&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client begins (becomes active, and enters the gameworld). &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id.&lt;br /&gt;
et_ClientUserinfoChanged( &#039;&#039;&#039;clientNum&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client&#039;s Userinfo string has changed. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===commands===&lt;br /&gt;
&#039;&#039;&#039;intercepted&#039;&#039;&#039; = et_ClientCommand( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;command&#039;&#039;&#039; )&lt;br /&gt;
:Called when a command is received from a client. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id. &#039;&#039;&#039;command&#039;&#039;&#039; is the command. The mod should return 1 if the command was intercepted by the mod, and 0 if the command was ignored by the mod and should be passed through to the server (and other mods in the chain).&lt;br /&gt;
:The actual command can be accessed through the [[#argument_handling|argument handling]] functions, as seen in the [[ETPro:Lua Sample Code]].&lt;br /&gt;
&#039;&#039;&#039;intercepted&#039;&#039;&#039; = et_ConsoleCommand()&lt;br /&gt;
:Called when a command is entered on the server console. The mod should return 1 if the command was intercepted by the mod, and 0 if the command was ignored by the mod and should be passed through to the server (and other mods in the chain).&lt;br /&gt;
:The actual command can be accessed through the [[#argument_handling|argument handling]] functions, as seen in the [[ETPro:Lua Sample Code]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===miscellaneous===&lt;br /&gt;
et_IPCReceive( &#039;&#039;&#039;vmnumber&#039;&#039;&#039;, &#039;&#039;&#039;message&#039;&#039;&#039; )&lt;br /&gt;
:Called when another mod sends an et.IPCSend() message to this mod. &#039;&#039;&#039;vmnumber&#039;&#039;&#039; is the VM slot number of the sender, and &#039;&#039;&#039;message&#039;&#039;&#039; is the message.&lt;br /&gt;
et_Print( &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Called whenever the server or qagame prints a string to the console.&lt;br /&gt;
et_Obituary( &#039;&#039;&#039;victim&#039;&#039;&#039;, &#039;&#039;&#039;killer&#039;&#039;&#039;, &#039;&#039;&#039;meansOfDeath&#039;&#039;&#039; )&lt;br /&gt;
:Called whenever a player is killed.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==predefined constants==&lt;br /&gt;
et.EXEC_NOW&amp;lt;br&amp;gt;&lt;br /&gt;
et.EXEC_INSERT&amp;lt;br&amp;gt;&lt;br /&gt;
et.EXEC_APPEND&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_READ&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_WRITE&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_APPEND&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_APPEND_SYNC&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_ALL&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_TEAM&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_BUDDY&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_TEAMNL&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
et.HOSTARCH&lt;br /&gt;
:set to WIN32 or UNIX depending on the host architecture qagame is running on.&lt;br /&gt;
LUA_PATH&lt;br /&gt;
:set to fs_homepath/fs_game/?.lua in order to ease use of the [http://www.lua.org/pil/8.1.html require] function.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==configs==&lt;br /&gt;
If a config is loaded, all modules are shutdown and reloaded. If a &#039;&#039;certified&#039;&#039; config is loaded, all modules are shutdown and reloaded, and additionally the following functions are disabled: &#039;&#039;&#039;require()&#039;&#039;&#039;, &#039;&#039;&#039;loadfile()&#039;&#039;&#039;, &#039;&#039;&#039;loadlib()&#039;&#039;&#039;, &#039;&#039;&#039;loadstring()&#039;&#039;&#039;, &#039;&#039;&#039;dofile()&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==caveats==&lt;br /&gt;
Like qagame, lua modules are unloaded and reloaded on map_restart and map changes. This means that all global variables and other information is lost. Mods may choose to store persistent data in cvars or external files.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
&lt;br /&gt;
Q: OMG I hate the libary prefix et.* on everything!!11!1oneone&amp;lt;br&amp;gt;&lt;br /&gt;
A: table.foreach(et, function (func, value) _G[func] = value; end)&lt;br /&gt;
&lt;br /&gt;
Q: How do a re-load my lua file without restarting the whole server ?&amp;lt;br&amp;gt;&lt;br /&gt;
A: change maps or map_restart&lt;br /&gt;
&lt;br /&gt;
Q: Can I see some sample code?&amp;lt;br&amp;gt;&lt;br /&gt;
A: [[ETPro:Lua Sample Code]]&lt;br /&gt;
&lt;br /&gt;
Q: Is there a list of [[ETPro]] mods?&amp;lt;br&amp;gt;&lt;br /&gt;
A: Yes, [[:Category:ETPro:Mods|here]].&lt;br /&gt;
&lt;br /&gt;
Q: OMG my mod doesn&#039;t work!&amp;lt;br&amp;gt;&lt;br /&gt;
A: Make sure you added your mod&#039;s filename to the lua_modules cvar (e.g. set lua_modules mymod.lua).&lt;br /&gt;
&lt;br /&gt;
Q: OMG why has et_ClientSay been removed?&amp;lt;br&amp;gt;&lt;br /&gt;
A: Thats a secret but, to keep the function as it was, just add the following code to your et_ClientCommand() function&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;	-- et_ClientSay had to be removed in order to intercept all commands &lt;br /&gt;
	-- so here&#039;s a wrapper for that&lt;br /&gt;
		arg0 = et.trap_Argv(0) -- get the main command&lt;br /&gt;
		&lt;br /&gt;
		if arg0 == &amp;quot;say&amp;quot; then&lt;br /&gt;
			return et_ClientSay( clientNum, et.SAY_ALL, et.ConcatArgs(1))&lt;br /&gt;
		elseif arg0 == &amp;quot;say_team&amp;quot; then&lt;br /&gt;
			return et_ClientSay( clientNum, et.SAY_TEAM, et.ConcatArgs(1))&lt;br /&gt;
		elseif arg0 == &amp;quot;say_buddy&amp;quot; then&lt;br /&gt;
			return et_ClientSay( clientNum, et.SAY_BUDDY, et.ConcatArgs(1))&lt;br /&gt;
		elseif arg0 == &amp;quot;say_teamnl&amp;quot; then&lt;br /&gt;
			return et_ClientSay( clientNum, et.SAY_TEAMNL, et.ConcatArgs(1))&lt;br /&gt;
		end&lt;br /&gt;
	-- et_ClientSay wrapper end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:ETPro]]&lt;br /&gt;
[[Category:ETPro:Mods]]&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Lua_Mod_API&amp;diff=1813</id>
		<title>Lua Mod API</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Lua_Mod_API&amp;diff=1813"/>
		<updated>2005-11-18T08:29:22Z</updated>

		<summary type="html">&lt;p&gt;Bani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOEDITSECTION__&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot; style=&amp;quot;background: #FFFFCC; padding: 2px; border: 2px solid #000000;&amp;quot;&amp;gt;The latest version of the lua-enabled ETPro qagame is etpro-lua-5 and can be downloaded [http://etpro.anime.net/etpro-lua-5.zip here].&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ETPro now supports serverside mods via the [http://www.lua.org/ lua] scripting language.&lt;br /&gt;
&lt;br /&gt;
ETPro has an embedded lua 5.0.2 interpreter, and if present will load user-defined scripts from the etpro directory. ETPro also provides an &amp;quot;et&amp;quot; library of function calls for lua to access the server engine, and provides callbacks so a serverside mod may trigger on specific server events.&lt;br /&gt;
&lt;br /&gt;
The following standard lua libraries are initialized by default and available to ETPro lua scripts:&lt;br /&gt;
[http://www.lua.org/manual/5.0/manual.html#5.1 basic], [http://www.lua.org/manual/5.0/manual.html#5.4 table], [http://www.lua.org/manual/5.0/manual.html#5.6 i/o], [http://www.lua.org/manual/5.0/manual.html#5.3 string], [http://www.lua.org/manual/5.0/manual.html#5.5 math].&lt;br /&gt;
&lt;br /&gt;
A list of [[ETPro]] mods can be found [[:Category:ETPro:Mods|here]].&lt;br /&gt;
&lt;br /&gt;
==server commands==&lt;br /&gt;
===lua_status===&lt;br /&gt;
:lists all currently loaded lua modules.&lt;br /&gt;
&lt;br /&gt;
==cvars==&lt;br /&gt;
===lua_modules===&lt;br /&gt;
:(default &amp;quot;&amp;quot;, disabled)&lt;br /&gt;
:space separated list of lua modules for ETPro to load. modules will be run in the order listed.&lt;br /&gt;
&lt;br /&gt;
===lua_allowedmodules===&lt;br /&gt;
:(default &amp;quot;&amp;quot;, disabled)&lt;br /&gt;
:if set, only lua modules with the matching sha1 signatures listed in this cvar will be allowed to load.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
changing either cvar will cause all currently loaded modules to quit and be unloaded until the next map_restart.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==et library calls==&lt;br /&gt;
&lt;br /&gt;
===modules===&lt;br /&gt;
et.RegisterModname( &#039;&#039;&#039;modname&#039;&#039;&#039; )&lt;br /&gt;
:Registers a descriptive string &#039;&#039;&#039;modname&#039;&#039;&#039; for this mod.&lt;br /&gt;
&#039;&#039;&#039;vmnumber&#039;&#039;&#039; = et.FindSelf()&lt;br /&gt;
:Returns a number indicating the VM slot the current mod is loaded into.&lt;br /&gt;
&#039;&#039;&#039;modname&#039;&#039;&#039;, &#039;&#039;&#039;signature&#039;&#039;&#039; = et.FindMod( &#039;&#039;&#039;vmnumber&#039;&#039;&#039; )&lt;br /&gt;
:Returns the &#039;&#039;&#039;modname&#039;&#039;&#039; and sha1 &#039;&#039;&#039;signature&#039;&#039;&#039; for the mod loaded in the VM slot &#039;&#039;&#039;vmnumber&#039;&#039;&#039;. Returns nil, nil if the VM slot is invalid.&lt;br /&gt;
&#039;&#039;&#039;success&#039;&#039;&#039; = et.IPCSend( &#039;&#039;&#039;vmnumber&#039;&#039;&#039;, &#039;&#039;&#039;message&#039;&#039;&#039; )&lt;br /&gt;
:Sends the string &#039;&#039;&#039;message&#039;&#039;&#039; to the mod in the VM slot indicated by &#039;&#039;&#039;vmnumber&#039;&#039;&#039;. The mod receiving &#039;&#039;&#039;message&#039;&#039;&#039; must have an &#039;&#039;et_IPCReceive()&#039;&#039; callback. If the message is successfully sent, &#039;&#039;&#039;success&#039;&#039;&#039; will be 1. On failure it will be 0.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===printing===&lt;br /&gt;
et.G_Print( &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Prints the string &#039;&#039;&#039;text&#039;&#039;&#039; to the server console.&lt;br /&gt;
et.G_LogPrint( &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Prints the string &#039;&#039;&#039;text&#039;&#039;&#039; to the server console and writes it to the server log.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===argument handling===&lt;br /&gt;
These functions are to be used within the [[#commands|et_ConsoleCommand function]].&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;args&#039;&#039;&#039; = et.ConcatArgs( &#039;&#039;&#039;index&#039;&#039;&#039; )&lt;br /&gt;
:Returns all arguments beginning from &#039;&#039;&#039;index&#039;&#039;&#039; concatenated into a single string &#039;&#039;&#039;args&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;argcount&#039;&#039;&#039; = et.trap_Argc()&lt;br /&gt;
:Returns a number indicating the number of command line arguments in the command buffer.&lt;br /&gt;
&#039;&#039;&#039;arg&#039;&#039;&#039; = et.trap_Argv( &#039;&#039;&#039;argnum&#039;&#039;&#039; )&lt;br /&gt;
:Returns the contents of the command line argument &#039;&#039;&#039;argnum&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===cvars===&lt;br /&gt;
&#039;&#039;&#039;cvarvalue&#039;&#039;&#039; = et.trap_Cvar_Get( &#039;&#039;&#039;cvarname&#039;&#039;&#039; )&lt;br /&gt;
:Returns the value of the cvar &#039;&#039;&#039;cvarname&#039;&#039;&#039;&lt;br /&gt;
et.trap_Cvar_Set( &#039;&#039;&#039;cvarname&#039;&#039;&#039;, &#039;&#039;&#039;cvarvalue&#039;&#039;&#039; )&lt;br /&gt;
:Sets the cvar &#039;&#039;&#039;cvarname&#039;&#039;&#039; to &#039;&#039;&#039;cvarvalue&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===configstrings===&lt;br /&gt;
&#039;&#039;&#039;configstringvalue&#039;&#039;&#039; = et.trap_GetConfigstring( &#039;&#039;&#039;index&#039;&#039;&#039; )&lt;br /&gt;
:Returns the string &#039;&#039;&#039;configstringvalue&#039;&#039;&#039; containing the contents of the configstring &#039;&#039;&#039;index&#039;&#039;&#039;&lt;br /&gt;
et.trap_SetConfigstring( &#039;&#039;&#039;index&#039;&#039;&#039;, &#039;&#039;&#039;configstringvalue&#039;&#039;&#039; )&lt;br /&gt;
:Sets the configstring &#039;&#039;&#039;index&#039;&#039;&#039; to the string &#039;&#039;&#039;configstringvalue&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===server===&lt;br /&gt;
et.trap_SendConsoleCommand( &#039;&#039;&#039;when&#039;&#039;&#039;, &#039;&#039;&#039;command&#039;&#039;&#039; )&lt;br /&gt;
:Sends the command &#039;&#039;&#039;command&#039;&#039;&#039; to the server console, to be executed &#039;&#039;&#039;when&#039;&#039;&#039; (see et.EXEC_* constants)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===clients===&lt;br /&gt;
et.trap_DropClient( &#039;&#039;&#039;clientnum&#039;&#039;&#039;, &#039;&#039;&#039;reason&#039;&#039;&#039;, &#039;&#039;&#039;ban_time&#039;&#039;&#039; )&lt;br /&gt;
:Disconnects &#039;&#039;&#039;clientnum&#039;&#039;&#039; from the server, with descriptive string &#039;&#039;&#039;reason&#039;&#039;&#039; reported to clients. &#039;&#039;&#039;ban_time&#039;&#039;&#039; is the time in seconds to ban the client from the server. &#039;&#039;&#039;ban_time&#039;&#039;&#039; is optional and may be entirely omitted, in which case the ban time defaults to the cvar &#039;&#039;b_defaultbantime&#039;&#039;&lt;br /&gt;
et.trap_SendServerCommand( &#039;&#039;&#039;clientnum&#039;&#039;&#039;, &#039;&#039;&#039;command&#039;&#039;&#039; )&lt;br /&gt;
:Sends the command &#039;&#039;&#039;command&#039;&#039;&#039; to the client &#039;&#039;&#039;clientnum&#039;&#039;&#039;. If &#039;&#039;&#039;clientnum&#039;&#039;&#039; is -1, the &#039;&#039;&#039;command&#039;&#039;&#039; is broadcast to all connected clients.&lt;br /&gt;
et.G_Say( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;mode&#039;&#039;&#039;, &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Sends a chat command on behalf of client &#039;&#039;&#039;clientNum&#039;&#039;&#039; with the mode &#039;&#039;&#039;mode&#039;&#039;&#039; (see et.SAY_* constants) and chat text &#039;&#039;&#039;text&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===userinfo===&lt;br /&gt;
&#039;&#039;&#039;userinfo&#039;&#039;&#039; = et.trap_GetUserinfo( &#039;&#039;&#039;clientnum&#039;&#039;&#039; )&lt;br /&gt;
:Returns the contents of the userinfo string for the client &#039;&#039;&#039;clientnum&#039;&#039;&#039;&lt;br /&gt;
et.trap_SetUserinfo( &#039;&#039;&#039;clientnum&#039;&#039;&#039;, &#039;&#039;&#039;userinfo&#039;&#039;&#039; )&lt;br /&gt;
:Sets the userinfo string for the client &#039;&#039;&#039;clientnum&#039;&#039;&#039; to &#039;&#039;&#039;userinfo&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===string utility functions===&lt;br /&gt;
&#039;&#039;&#039;infostring&#039;&#039;&#039; = et.Info_RemoveKey( &#039;&#039;&#039;infostring&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039; )&lt;br /&gt;
:Removes key &#039;&#039;&#039;key&#039;&#039;&#039; from infostring &#039;&#039;&#039;infostring&#039;&#039;&#039; and returns the modified infostring.&lt;br /&gt;
&#039;&#039;&#039;infostring&#039;&#039;&#039; = et.Info_SetValueForKey( &#039;&#039;&#039;infostring&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039;, &#039;&#039;&#039;value&#039;&#039;&#039; )&lt;br /&gt;
:Sets the key &#039;&#039;&#039;key&#039;&#039;&#039; in the infostring &#039;&#039;&#039;infostring&#039;&#039;&#039; to &#039;&#039;&#039;value&#039;&#039;&#039; and returns the modified infostring.&lt;br /&gt;
&#039;&#039;&#039;keyvalue&#039;&#039;&#039; = et.Info_ValueForKey( &#039;&#039;&#039;infostring&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039; )&lt;br /&gt;
:Returns the value of the key &#039;&#039;&#039;key&#039;&#039;&#039; in the infostring &#039;&#039;&#039;infostring&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;cleanstring&#039;&#039;&#039; = et.Q_CleanStr( &#039;&#039;&#039;string&#039;&#039;&#039; )&lt;br /&gt;
:Returns &#039;&#039;&#039;string&#039;&#039;&#039; stripped of all color codes&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ET filesystem===&lt;br /&gt;
&#039;&#039;&#039;fd&#039;&#039;&#039;, &#039;&#039;&#039;len&#039;&#039;&#039; = et.trap_FS_FOpenFile( &#039;&#039;&#039;filename&#039;&#039;&#039;, &#039;&#039;&#039;mode&#039;&#039;&#039; )&lt;br /&gt;
:Attempts to open the file &#039;&#039;&#039;filename&#039;&#039;&#039; with the access mode &#039;&#039;&#039;mode&#039;&#039;&#039; (see et.FS_ constants). Returns the filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039; and file length &#039;&#039;&#039;len&#039;&#039;&#039;. On error, &#039;&#039;&#039;len&#039;&#039;&#039; returns -1.&lt;br /&gt;
&#039;&#039;&#039;filedata&#039;&#039;&#039; = et.trap_FS_Read( fd, count )&lt;br /&gt;
:Reads &#039;&#039;&#039;count&#039;&#039;&#039; bytes from filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039;.&lt;br /&gt;
&#039;&#039;&#039;count&#039;&#039;&#039; = et.trap_FS_Write( &#039;&#039;&#039;filedata&#039;&#039;&#039;, &#039;&#039;&#039;count&#039;&#039;&#039;, &#039;&#039;&#039;fd&#039;&#039;&#039; )&lt;br /&gt;
:Attempts to write &#039;&#039;&#039;count&#039;&#039;&#039; bytes of &#039;&#039;&#039;filedata&#039;&#039;&#039; to filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039;. Returns number of bytes successfully written.&lt;br /&gt;
et.trap_FS_Rename( &#039;&#039;&#039;oldname&#039;&#039;&#039;, &#039;&#039;&#039;newname&#039;&#039;&#039; )&lt;br /&gt;
:Renames file &#039;&#039;&#039;oldname&#039;&#039;&#039; to &#039;&#039;&#039;newname&#039;&#039;&#039;.&lt;br /&gt;
et.trap_FS_FCloseFile( &#039;&#039;&#039;fd&#039;&#039;&#039; )&lt;br /&gt;
:Closes filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===indexes===&lt;br /&gt;
&#039;&#039;&#039;soundindex&#039;&#039;&#039; = et.G_SoundIndex( &#039;&#039;&#039;filename&#039;&#039;&#039; )&lt;br /&gt;
:Returns an index to the soundfile indicated by &#039;&#039;&#039;filename&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;modelindex&#039;&#039;&#039; = et.G_ModelIndex( &#039;&#039;&#039;filename&#039;&#039;&#039; )&lt;br /&gt;
:Returns an index to the model indicated by &#039;&#039;&#039;filename&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sound===&lt;br /&gt;
et.G_globalSound( &#039;&#039;&#039;sound&#039;&#039;&#039; )&lt;br /&gt;
:Plays the global sound indicated by the filename &#039;&#039;&#039;sound&#039;&#039;&#039;.&lt;br /&gt;
et.G_Sound( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;soundindex&#039;&#039;&#039; )&lt;br /&gt;
:Plays the sound &#039;&#039;&#039;soundindex&#039;&#039;&#039; at the location of entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===miscellaneous===&lt;br /&gt;
&#039;&#039;&#039;milliseconds&#039;&#039;&#039; = et.trap_Milliseconds()&lt;br /&gt;
:Returns a number indicating the current server time in milliseconds.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===entities===&lt;br /&gt;
&#039;&#039;&#039;entnum&#039;&#039;&#039; = et.G_Spawn()&lt;br /&gt;
:Spawns a new entity and returns the new entity number.&lt;br /&gt;
&#039;&#039;&#039;entnum&#039;&#039;&#039; = et.G_TempEntity( &#039;&#039;&#039;origin&#039;&#039;&#039;, &#039;&#039;&#039;event&#039;&#039;&#039; )&lt;br /&gt;
:Spawns a new TempEntity of event type &#039;&#039;&#039;event&#039;&#039;&#039; and places it at &#039;&#039;&#039;origin&#039;&#039;&#039; in the world.&lt;br /&gt;
et.G_FreeEntity( &#039;&#039;&#039;entnum&#039;&#039;&#039; )&lt;br /&gt;
:Frees the entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;spawnval&#039;&#039;&#039; = et.G_GetSpawnVar( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039; )&lt;br /&gt;
:Returns the value of spawnvar &#039;&#039;&#039;key&#039;&#039;&#039; for entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
et.G_SetSpawnVar( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039;, &#039;&#039;&#039;value&#039;&#039;&#039; )&lt;br /&gt;
:Sets the spawnvar &#039;&#039;&#039;key&#039;&#039;&#039; to &#039;&#039;&#039;value&#039;&#039;&#039; for entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;integer entnum&#039;&#039;&#039; = et.G_SpawnGEntityFromSpawnVars( string spawnvar, string spawnvalue, ... )&lt;br /&gt;
:This function can only be called inside the &#039;&#039;&#039;et_InitGame&#039;&#039;&#039; callback&lt;br /&gt;
et.trap_LinkEntity( &#039;&#039;&#039;entnum&#039;&#039;&#039; )&lt;br /&gt;
:Links the entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
et.trap_UnlinkEntity( &#039;&#039;&#039;entnum&#039;&#039;&#039; )&lt;br /&gt;
:Unlinks the entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;(variable)&#039;&#039;&#039; = et.gentity_get ( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;[[Fieldname]]&#039;&#039;&#039; )&lt;br /&gt;
:Gets the value of &#039;&#039;&#039;[[Fieldname]]&#039;&#039;&#039; from entity &#039;&#039;&#039;entnum&#039;&#039;&#039; out of the g_entity struct. For NULL entities or clients, &#039;&#039;nil&#039;&#039; is returned.&amp;lt;br&amp;gt;&lt;br /&gt;
et.gentity_set( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;[[Fieldname]]&#039;&#039;&#039;, &#039;&#039;&#039;(variable)&#039;&#039;&#039; )&lt;br /&gt;
:Sets the value of &#039;&#039;&#039;[[Fieldname]]&#039;&#039;&#039; from entity &#039;&#039;&#039;entnum&#039;&#039;&#039; in the g_entity struct to &#039;&#039;&#039;(variable)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==callbacks==&lt;br /&gt;
&lt;br /&gt;
===qagame execution===&lt;br /&gt;
et_InitGame( &#039;&#039;&#039;levelTime&#039;&#039;&#039;, &#039;&#039;&#039;randomSeed&#039;&#039;&#039;, &#039;&#039;&#039;restart&#039;&#039;&#039; )&lt;br /&gt;
:Called when qagame initializes. &#039;&#039;&#039;levelTime&#039;&#039;&#039; is the current level time in milliseconds. &#039;&#039;&#039;randomSeed&#039;&#039;&#039; is a number that can be used to seed random number generators. &#039;&#039;&#039;restart&#039;&#039;&#039; indicates if et_InitGame() is being called due to a map restart (1) or not (0).&lt;br /&gt;
et_ShutdownGame( &#039;&#039;&#039;restart&#039;&#039;&#039; )&lt;br /&gt;
:Called when qagame shuts down. &#039;&#039;&#039;restart&#039;&#039;&#039; indicates if the shutdown is being called due to a map_restart (1) or not (0).&lt;br /&gt;
et_RunFrame( &#039;&#039;&#039;levelTime&#039;&#039;&#039; )&lt;br /&gt;
:Called when qagame runs a server frame. &#039;&#039;&#039;levelTime&#039;&#039;&#039; is the current level time in milliseconds.&lt;br /&gt;
et_Quit()&lt;br /&gt;
:Called when ETPro unloads the mod. The mod should close all open filedescriptors and perform all cleanup.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===client management===&lt;br /&gt;
&#039;&#039;&#039;rejectreason&#039;&#039;&#039; = et_ClientConnect( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;firstTime&#039;&#039;&#039;, &#039;&#039;&#039;isBot&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client attempts to connect to the server. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id, &#039;&#039;&#039;firstTime&#039;&#039;&#039; indicates if this is a new connection (1) or a reconnection (0). &#039;&#039;&#039;isBot&#039;&#039;&#039; indicates if the client is a bot (1) or not (0). If the mod accepts the connection, it should return nil. Otherwise, the mod should return a string describing the reason the client connection was rejected.&lt;br /&gt;
et_ClientDisconnect( &#039;&#039;&#039;clientNum&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client disconnects. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id.&lt;br /&gt;
et_ClientBegin( &#039;&#039;&#039;clientNum&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client begins (becomes active, and enters the gameworld). &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id.&lt;br /&gt;
et_ClientUserinfoChanged( &#039;&#039;&#039;clientNum&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client&#039;s Userinfo string has changed. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===commands===&lt;br /&gt;
&#039;&#039;&#039;intercepted&#039;&#039;&#039; = et_ClientCommand( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;command&#039;&#039;&#039; )&lt;br /&gt;
:Called when a command is received from a client. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id. &#039;&#039;&#039;command&#039;&#039;&#039; is the command. The mod should return 1 if the command was intercepted by the mod, and 0 if the command was ignored by the mod and should be passed through to the server (and other mods in the chain).&lt;br /&gt;
:The actual command can be accessed through the [[#argument_handling|argument handling]] functions, as seen in the [[ETPro:Lua Sample Code]].&lt;br /&gt;
&#039;&#039;&#039;intercepted&#039;&#039;&#039; = et_ConsoleCommand()&lt;br /&gt;
:Called when a command is entered on the server console. The mod should return 1 if the command was intercepted by the mod, and 0 if the command was ignored by the mod and should be passed through to the server (and other mods in the chain).&lt;br /&gt;
:The actual command can be accessed through the [[#argument_handling|argument handling]] functions, as seen in the [[ETPro:Lua Sample Code]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===miscellaneous===&lt;br /&gt;
et_IPCReceive( &#039;&#039;&#039;vmnumber&#039;&#039;&#039;, &#039;&#039;&#039;message&#039;&#039;&#039; )&lt;br /&gt;
:Called when another mod sends an et.IPCSend() message to this mod. &#039;&#039;&#039;vmnumber&#039;&#039;&#039; is the VM slot number of the sender, and &#039;&#039;&#039;message&#039;&#039;&#039; is the message.&lt;br /&gt;
et_Print( &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Called whenever the server or qagame prints a string to the console.&lt;br /&gt;
et_Obituary( &#039;&#039;&#039;self&#039;&#039;&#039;, &#039;&#039;&#039;killer&#039;&#039;&#039;, &#039;&#039;&#039;meansOfDeath&#039;&#039;&#039; )&lt;br /&gt;
:Called whenever a player is killed.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==predefined constants==&lt;br /&gt;
et.EXEC_NOW&amp;lt;br&amp;gt;&lt;br /&gt;
et.EXEC_INSERT&amp;lt;br&amp;gt;&lt;br /&gt;
et.EXEC_APPEND&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_READ&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_WRITE&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_APPEND&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_APPEND_SYNC&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_ALL&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_TEAM&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_BUDDY&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_TEAMNL&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
et.HOSTARCH&lt;br /&gt;
:set to WIN32 or UNIX depending on the host architecture qagame is running on.&lt;br /&gt;
LUA_PATH&lt;br /&gt;
:set to fs_homepath/fs_game/?.lua in order to ease use of the [http://www.lua.org/pil/8.1.html require] function.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==configs==&lt;br /&gt;
If a config is loaded, all modules are shutdown and reloaded. If a &#039;&#039;certified&#039;&#039; config is loaded, all modules are shutdown and reloaded, and additionally the following functions are disabled: &#039;&#039;&#039;require()&#039;&#039;&#039;, &#039;&#039;&#039;loadfile()&#039;&#039;&#039;, &#039;&#039;&#039;loadlib()&#039;&#039;&#039;, &#039;&#039;&#039;loadstring()&#039;&#039;&#039;, &#039;&#039;&#039;dofile()&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==caveats==&lt;br /&gt;
Like qagame, lua modules are unloaded and reloaded on map_restart and map changes. This means that all global variables and other information is lost. Mods may choose to store persistent data in cvars or external files.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
&lt;br /&gt;
Q: OMG I hate the libary prefix et.* on everything!!11!1oneone&amp;lt;br&amp;gt;&lt;br /&gt;
A: table.foreach(et, function (func, value) _G[func] = value; end)&lt;br /&gt;
&lt;br /&gt;
Q: How do a re-load my lua file without restarting the whole server ?&amp;lt;br&amp;gt;&lt;br /&gt;
A: change maps or map_restart&lt;br /&gt;
&lt;br /&gt;
Q: Can I see some sample code?&amp;lt;br&amp;gt;&lt;br /&gt;
A: [[ETPro:Lua Sample Code]]&lt;br /&gt;
&lt;br /&gt;
Q: Is there a list of [[ETPro]] mods?&amp;lt;br&amp;gt;&lt;br /&gt;
A: Yes, [[:Category:ETPro:Mods|here]].&lt;br /&gt;
&lt;br /&gt;
Q: OMG my mod doesn&#039;t work!&amp;lt;br&amp;gt;&lt;br /&gt;
A: Make sure you added your mod&#039;s filename to the lua_modules cvar (e.g. set lua_modules mymod.lua).&lt;br /&gt;
&lt;br /&gt;
[[Category:ETPro]]&lt;br /&gt;
[[Category:ETPro:Mods]]&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Lua_Mod_API&amp;diff=1812</id>
		<title>Lua Mod API</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Lua_Mod_API&amp;diff=1812"/>
		<updated>2005-11-18T08:26:42Z</updated>

		<summary type="html">&lt;p&gt;Bani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOEDITSECTION__&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot; style=&amp;quot;background: #FFFFCC; padding: 2px; border: 2px solid #000000;&amp;quot;&amp;gt;The latest version of the lua-enabled ETPro qagame is etpro-lua-5 and can be downloaded [http://etpro.anime.net/etpro-lua-5.zip here].&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ETPro now supports serverside mods via the [http://www.lua.org/ lua] scripting language.&lt;br /&gt;
&lt;br /&gt;
ETPro has an embedded lua 5.0.2 interpreter, and if present will load user-defined scripts from the etpro directory. ETPro also provides an &amp;quot;et&amp;quot; library of function calls for lua to access the server engine, and provides callbacks so a serverside mod may trigger on specific server events.&lt;br /&gt;
&lt;br /&gt;
The following standard lua libraries are initialized by default and available to ETPro lua scripts:&lt;br /&gt;
[http://www.lua.org/manual/5.0/manual.html#5.1 basic], [http://www.lua.org/manual/5.0/manual.html#5.4 table], [http://www.lua.org/manual/5.0/manual.html#5.6 i/o], [http://www.lua.org/manual/5.0/manual.html#5.3 string], [http://www.lua.org/manual/5.0/manual.html#5.5 math].&lt;br /&gt;
&lt;br /&gt;
A list of [[ETPro]] mods can be found [[:Category:ETPro:Mods|here]].&lt;br /&gt;
&lt;br /&gt;
==server commands==&lt;br /&gt;
===lua_status===&lt;br /&gt;
:lists all currently loaded lua modules.&lt;br /&gt;
&lt;br /&gt;
==cvars==&lt;br /&gt;
===lua_modules===&lt;br /&gt;
:(default &amp;quot;&amp;quot;, disabled)&lt;br /&gt;
:space separated list of lua modules for ETPro to load. modules will be run in the order listed.&lt;br /&gt;
&lt;br /&gt;
===lua_allowedmodules===&lt;br /&gt;
:(default &amp;quot;&amp;quot;, disabled)&lt;br /&gt;
:if set, only lua modules with the matching sha1 signatures listed in this cvar will be allowed to load.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
changing either cvar will cause all currently loaded modules to quit and be unloaded until the next map_restart.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==et library calls==&lt;br /&gt;
&lt;br /&gt;
===modules===&lt;br /&gt;
et.RegisterModname( &#039;&#039;&#039;modname&#039;&#039;&#039; )&lt;br /&gt;
:Registers a descriptive string &#039;&#039;&#039;modname&#039;&#039;&#039; for this mod.&lt;br /&gt;
&#039;&#039;&#039;vmnumber&#039;&#039;&#039; = et.FindSelf()&lt;br /&gt;
:Returns a number indicating the VM slot the current mod is loaded into.&lt;br /&gt;
&#039;&#039;&#039;modname&#039;&#039;&#039;, &#039;&#039;&#039;signature&#039;&#039;&#039; = et.FindMod( &#039;&#039;&#039;vmnumber&#039;&#039;&#039; )&lt;br /&gt;
:Returns the &#039;&#039;&#039;modname&#039;&#039;&#039; and sha1 &#039;&#039;&#039;signature&#039;&#039;&#039; for the mod loaded in the VM slot &#039;&#039;&#039;vmnumber&#039;&#039;&#039;. Returns nil, nil if the VM slot is invalid.&lt;br /&gt;
&#039;&#039;&#039;success&#039;&#039;&#039; = et.IPCSend( &#039;&#039;&#039;vmnumber&#039;&#039;&#039;, &#039;&#039;&#039;message&#039;&#039;&#039; )&lt;br /&gt;
:Sends the string &#039;&#039;&#039;message&#039;&#039;&#039; to the mod in the VM slot indicated by &#039;&#039;&#039;vmnumber&#039;&#039;&#039;. The mod receiving &#039;&#039;&#039;message&#039;&#039;&#039; must have an &#039;&#039;et_IPCReceive()&#039;&#039; callback. If the message is successfully sent, &#039;&#039;&#039;success&#039;&#039;&#039; will be 1. On failure it will be 0.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===printing===&lt;br /&gt;
et.G_Print( &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Prints the string &#039;&#039;&#039;text&#039;&#039;&#039; to the server console.&lt;br /&gt;
et.G_LogPrint( &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Prints the string &#039;&#039;&#039;text&#039;&#039;&#039; to the server console and writes it to the server log.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===argument handling===&lt;br /&gt;
These functions are to be used within the [[#commands|et_ConsoleCommand function]].&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;args&#039;&#039;&#039; = et.ConcatArgs( &#039;&#039;&#039;index&#039;&#039;&#039; )&lt;br /&gt;
:Returns all arguments beginning from &#039;&#039;&#039;index&#039;&#039;&#039; concatenated into a single string &#039;&#039;&#039;args&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;argcount&#039;&#039;&#039; = et.trap_Argc()&lt;br /&gt;
:Returns a number indicating the number of command line arguments in the command buffer.&lt;br /&gt;
&#039;&#039;&#039;arg&#039;&#039;&#039; = et.trap_Argv( &#039;&#039;&#039;argnum&#039;&#039;&#039; )&lt;br /&gt;
:Returns the contents of the command line argument &#039;&#039;&#039;argnum&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===cvars===&lt;br /&gt;
&#039;&#039;&#039;cvarvalue&#039;&#039;&#039; = et.trap_Cvar_Get( &#039;&#039;&#039;cvarname&#039;&#039;&#039; )&lt;br /&gt;
:Returns the value of the cvar &#039;&#039;&#039;cvarname&#039;&#039;&#039;&lt;br /&gt;
et.trap_Cvar_Set( &#039;&#039;&#039;cvarname&#039;&#039;&#039;, &#039;&#039;&#039;cvarvalue&#039;&#039;&#039; )&lt;br /&gt;
:Sets the cvar &#039;&#039;&#039;cvarname&#039;&#039;&#039; to &#039;&#039;&#039;cvarvalue&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===configstrings===&lt;br /&gt;
&#039;&#039;&#039;configstringvalue&#039;&#039;&#039; = et.trap_GetConfigstring( &#039;&#039;&#039;index&#039;&#039;&#039; )&lt;br /&gt;
:Returns the string &#039;&#039;&#039;configstringvalue&#039;&#039;&#039; containing the contents of the configstring &#039;&#039;&#039;index&#039;&#039;&#039;&lt;br /&gt;
et.trap_SetConfigstring( &#039;&#039;&#039;index&#039;&#039;&#039;, &#039;&#039;&#039;configstringvalue&#039;&#039;&#039; )&lt;br /&gt;
:Sets the configstring &#039;&#039;&#039;index&#039;&#039;&#039; to the string &#039;&#039;&#039;configstringvalue&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===server===&lt;br /&gt;
et.trap_SendConsoleCommand( &#039;&#039;&#039;when&#039;&#039;&#039;, &#039;&#039;&#039;command&#039;&#039;&#039; )&lt;br /&gt;
:Sends the command &#039;&#039;&#039;command&#039;&#039;&#039; to the server console, to be executed &#039;&#039;&#039;when&#039;&#039;&#039; (see et.EXEC_* constants)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===clients===&lt;br /&gt;
et.trap_DropClient( &#039;&#039;&#039;clientnum&#039;&#039;&#039;, &#039;&#039;&#039;reason&#039;&#039;&#039;, &#039;&#039;&#039;ban_time&#039;&#039;&#039; )&lt;br /&gt;
:Disconnects &#039;&#039;&#039;clientnum&#039;&#039;&#039; from the server, with descriptive string &#039;&#039;&#039;reason&#039;&#039;&#039; reported to clients. &#039;&#039;&#039;ban_time&#039;&#039;&#039; is the time in seconds to ban the client from the server. &#039;&#039;&#039;ban_time&#039;&#039;&#039; is optional and may be entirely omitted, in which case the ban time defaults to the cvar &#039;&#039;b_defaultbantime&#039;&#039;&lt;br /&gt;
et.trap_SendServerCommand( &#039;&#039;&#039;clientnum&#039;&#039;&#039;, &#039;&#039;&#039;command&#039;&#039;&#039; )&lt;br /&gt;
:Sends the command &#039;&#039;&#039;command&#039;&#039;&#039; to the client &#039;&#039;&#039;clientnum&#039;&#039;&#039;. If &#039;&#039;&#039;clientnum&#039;&#039;&#039; is -1, the &#039;&#039;&#039;command&#039;&#039;&#039; is broadcast to all connected clients.&lt;br /&gt;
et.G_Say( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;mode&#039;&#039;&#039;, &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Sends a chat command on behalf of client &#039;&#039;&#039;clientNum&#039;&#039;&#039; with the mode &#039;&#039;&#039;mode&#039;&#039;&#039; (see et.SAY_* constants) and chat text &#039;&#039;&#039;text&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===userinfo===&lt;br /&gt;
&#039;&#039;&#039;userinfo&#039;&#039;&#039; = et.trap_GetUserinfo( &#039;&#039;&#039;clientnum&#039;&#039;&#039; )&lt;br /&gt;
:Returns the contents of the userinfo string for the client &#039;&#039;&#039;clientnum&#039;&#039;&#039;&lt;br /&gt;
et.trap_SetUserinfo( &#039;&#039;&#039;clientnum&#039;&#039;&#039;, &#039;&#039;&#039;userinfo&#039;&#039;&#039; )&lt;br /&gt;
:Sets the userinfo string for the client &#039;&#039;&#039;clientnum&#039;&#039;&#039; to &#039;&#039;&#039;userinfo&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===string utility functions===&lt;br /&gt;
&#039;&#039;&#039;infostring&#039;&#039;&#039; = et.Info_RemoveKey( &#039;&#039;&#039;infostring&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039; )&lt;br /&gt;
:Removes key &#039;&#039;&#039;key&#039;&#039;&#039; from infostring &#039;&#039;&#039;infostring&#039;&#039;&#039; and returns the modified infostring.&lt;br /&gt;
&#039;&#039;&#039;infostring&#039;&#039;&#039; = et.Info_SetValueForKey( &#039;&#039;&#039;infostring&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039;, &#039;&#039;&#039;value&#039;&#039;&#039; )&lt;br /&gt;
:Sets the key &#039;&#039;&#039;key&#039;&#039;&#039; in the infostring &#039;&#039;&#039;infostring&#039;&#039;&#039; to &#039;&#039;&#039;value&#039;&#039;&#039; and returns the modified infostring.&lt;br /&gt;
&#039;&#039;&#039;keyvalue&#039;&#039;&#039; = et.Info_ValueForKey( &#039;&#039;&#039;infostring&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039; )&lt;br /&gt;
:Returns the value of the key &#039;&#039;&#039;key&#039;&#039;&#039; in the infostring &#039;&#039;&#039;infostring&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;cleanstring&#039;&#039;&#039; = et.Q_CleanStr( &#039;&#039;&#039;string&#039;&#039;&#039; )&lt;br /&gt;
:Returns &#039;&#039;&#039;string&#039;&#039;&#039; stripped of all color codes&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ET filesystem===&lt;br /&gt;
&#039;&#039;&#039;fd&#039;&#039;&#039;, &#039;&#039;&#039;len&#039;&#039;&#039; = et.trap_FS_FOpenFile( &#039;&#039;&#039;filename&#039;&#039;&#039;, &#039;&#039;&#039;mode&#039;&#039;&#039; )&lt;br /&gt;
:Attempts to open the file &#039;&#039;&#039;filename&#039;&#039;&#039; with the access mode &#039;&#039;&#039;mode&#039;&#039;&#039; (see et.FS_ constants). Returns the filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039; and file length &#039;&#039;&#039;len&#039;&#039;&#039;. On error, &#039;&#039;&#039;len&#039;&#039;&#039; returns -1.&lt;br /&gt;
&#039;&#039;&#039;filedata&#039;&#039;&#039; = et.trap_FS_Read( fd, count )&lt;br /&gt;
:Reads &#039;&#039;&#039;count&#039;&#039;&#039; bytes from filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039;.&lt;br /&gt;
&#039;&#039;&#039;count&#039;&#039;&#039; = et.trap_FS_Write( &#039;&#039;&#039;filedata&#039;&#039;&#039;, &#039;&#039;&#039;count&#039;&#039;&#039;, &#039;&#039;&#039;fd&#039;&#039;&#039; )&lt;br /&gt;
:Attempts to write &#039;&#039;&#039;count&#039;&#039;&#039; bytes of &#039;&#039;&#039;filedata&#039;&#039;&#039; to filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039;. Returns number of bytes successfully written.&lt;br /&gt;
et.trap_FS_Rename( &#039;&#039;&#039;oldname&#039;&#039;&#039;, &#039;&#039;&#039;newname&#039;&#039;&#039; )&lt;br /&gt;
:Renames file &#039;&#039;&#039;oldname&#039;&#039;&#039; to &#039;&#039;&#039;newname&#039;&#039;&#039;.&lt;br /&gt;
et.trap_FS_FCloseFile( &#039;&#039;&#039;fd&#039;&#039;&#039; )&lt;br /&gt;
:Closes filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===indexes===&lt;br /&gt;
&#039;&#039;&#039;soundindex&#039;&#039;&#039; = et.G_SoundIndex( &#039;&#039;&#039;filename&#039;&#039;&#039; )&lt;br /&gt;
:Returns an index to the soundfile indicated by &#039;&#039;&#039;filename&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;modelindex&#039;&#039;&#039; = et.G_ModelIndex( &#039;&#039;&#039;filename&#039;&#039;&#039; )&lt;br /&gt;
:Returns an index to the model indicated by &#039;&#039;&#039;filename&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sound===&lt;br /&gt;
et.G_globalSound( &#039;&#039;&#039;sound&#039;&#039;&#039; )&lt;br /&gt;
:Plays the global sound indicated by the filename &#039;&#039;&#039;sound&#039;&#039;&#039;.&lt;br /&gt;
et.G_Sound( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;soundindex&#039;&#039;&#039; )&lt;br /&gt;
:Plays the sound &#039;&#039;&#039;soundindex&#039;&#039;&#039; at the location of entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===miscellaneous===&lt;br /&gt;
&#039;&#039;&#039;milliseconds&#039;&#039;&#039; = et.trap_Milliseconds()&lt;br /&gt;
:Returns a number indicating the current server time in milliseconds.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===entities===&lt;br /&gt;
&#039;&#039;&#039;entnum&#039;&#039;&#039; = et.G_Spawn()&lt;br /&gt;
:Spawns a new entity and returns the new entity number.&lt;br /&gt;
&#039;&#039;&#039;entnum&#039;&#039;&#039; = et.G_TempEntity( &#039;&#039;&#039;origin&#039;&#039;&#039;, &#039;&#039;&#039;event&#039;&#039;&#039; )&lt;br /&gt;
:Spawns a new TempEntity of event type &#039;&#039;&#039;event&#039;&#039;&#039; and places it at &#039;&#039;&#039;origin&#039;&#039;&#039; in the world.&lt;br /&gt;
et.G_FreeEntity( &#039;&#039;&#039;entnum&#039;&#039;&#039; )&lt;br /&gt;
:Frees the entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;spawnval&#039;&#039;&#039; = et.G_GetSpawnVar( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039; )&lt;br /&gt;
:Returns the value of spawnvar &#039;&#039;&#039;key&#039;&#039;&#039; for entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
et.G_SetSpawnVar( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039;, &#039;&#039;&#039;value&#039;&#039;&#039; )&lt;br /&gt;
:Sets the spawnvar &#039;&#039;&#039;key&#039;&#039;&#039; to &#039;&#039;&#039;value&#039;&#039;&#039; for entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;integer entnum&#039;&#039;&#039; = et.G_SpawnGEntityFromSpawnVars( string spawnvar, string spawnvalue, ... )&lt;br /&gt;
:This function can only be called inside the &#039;&#039;&#039;et_InitGame&#039;&#039;&#039; callback&lt;br /&gt;
et.trap_LinkEntity( &#039;&#039;&#039;entnum&#039;&#039;&#039; )&lt;br /&gt;
:Links the entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
et.trap_UnlinkEntity( &#039;&#039;&#039;entnum&#039;&#039;&#039; )&lt;br /&gt;
:Unlinks the entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;(variable)&#039;&#039;&#039; = et.gentity_get ( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;[[Fieldname]]&#039;&#039;&#039; )&lt;br /&gt;
:Gets the value of &#039;&#039;&#039;[[Fieldname]]&#039;&#039;&#039; from entity &#039;&#039;&#039;entnum&#039;&#039;&#039; out of the g_entity struct&amp;lt;br&amp;gt;&lt;br /&gt;
et.gentity_set( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;[[Fieldname]]&#039;&#039;&#039;, &#039;&#039;&#039;(variable)&#039;&#039;&#039; )&lt;br /&gt;
:Sets the value of &#039;&#039;&#039;[[Fieldname]]&#039;&#039;&#039; from entity &#039;&#039;&#039;entnum&#039;&#039;&#039; in the g_entity struct to &#039;&#039;&#039;(variable)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==callbacks==&lt;br /&gt;
&lt;br /&gt;
===qagame execution===&lt;br /&gt;
et_InitGame( &#039;&#039;&#039;levelTime&#039;&#039;&#039;, &#039;&#039;&#039;randomSeed&#039;&#039;&#039;, &#039;&#039;&#039;restart&#039;&#039;&#039; )&lt;br /&gt;
:Called when qagame initializes. &#039;&#039;&#039;levelTime&#039;&#039;&#039; is the current level time in milliseconds. &#039;&#039;&#039;randomSeed&#039;&#039;&#039; is a number that can be used to seed random number generators. &#039;&#039;&#039;restart&#039;&#039;&#039; indicates if et_InitGame() is being called due to a map restart (1) or not (0).&lt;br /&gt;
et_ShutdownGame( &#039;&#039;&#039;restart&#039;&#039;&#039; )&lt;br /&gt;
:Called when qagame shuts down. &#039;&#039;&#039;restart&#039;&#039;&#039; indicates if the shutdown is being called due to a map_restart (1) or not (0).&lt;br /&gt;
et_RunFrame( &#039;&#039;&#039;levelTime&#039;&#039;&#039; )&lt;br /&gt;
:Called when qagame runs a server frame. &#039;&#039;&#039;levelTime&#039;&#039;&#039; is the current level time in milliseconds.&lt;br /&gt;
et_Quit()&lt;br /&gt;
:Called when ETPro unloads the mod. The mod should close all open filedescriptors and perform all cleanup.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===client management===&lt;br /&gt;
&#039;&#039;&#039;rejectreason&#039;&#039;&#039; = et_ClientConnect( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;firstTime&#039;&#039;&#039;, &#039;&#039;&#039;isBot&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client attempts to connect to the server. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id, &#039;&#039;&#039;firstTime&#039;&#039;&#039; indicates if this is a new connection (1) or a reconnection (0). &#039;&#039;&#039;isBot&#039;&#039;&#039; indicates if the client is a bot (1) or not (0). If the mod accepts the connection, it should return nil. Otherwise, the mod should return a string describing the reason the client connection was rejected.&lt;br /&gt;
et_ClientDisconnect( &#039;&#039;&#039;clientNum&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client disconnects. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id.&lt;br /&gt;
et_ClientBegin( &#039;&#039;&#039;clientNum&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client begins (becomes active, and enters the gameworld). &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id.&lt;br /&gt;
et_ClientUserinfoChanged( &#039;&#039;&#039;clientNum&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client&#039;s Userinfo string has changed. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===commands===&lt;br /&gt;
&#039;&#039;&#039;intercepted&#039;&#039;&#039; = et_ClientCommand( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;command&#039;&#039;&#039; )&lt;br /&gt;
:Called when a command is received from a client. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id. &#039;&#039;&#039;command&#039;&#039;&#039; is the command. The mod should return 1 if the command was intercepted by the mod, and 0 if the command was ignored by the mod and should be passed through to the server (and other mods in the chain).&lt;br /&gt;
:The actual command can be accessed through the [[#argument_handling|argument handling]] functions, as seen in the [[ETPro:Lua Sample Code]].&lt;br /&gt;
&#039;&#039;&#039;intercepted&#039;&#039;&#039; = et_ConsoleCommand()&lt;br /&gt;
:Called when a command is entered on the server console. The mod should return 1 if the command was intercepted by the mod, and 0 if the command was ignored by the mod and should be passed through to the server (and other mods in the chain).&lt;br /&gt;
:The actual command can be accessed through the [[#argument_handling|argument handling]] functions, as seen in the [[ETPro:Lua Sample Code]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===miscellaneous===&lt;br /&gt;
et_IPCReceive( &#039;&#039;&#039;vmnumber&#039;&#039;&#039;, &#039;&#039;&#039;message&#039;&#039;&#039; )&lt;br /&gt;
:Called when another mod sends an et.IPCSend() message to this mod. &#039;&#039;&#039;vmnumber&#039;&#039;&#039; is the VM slot number of the sender, and &#039;&#039;&#039;message&#039;&#039;&#039; is the message.&lt;br /&gt;
et_Print( &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Called whenever the server or qagame prints a string to the console.&lt;br /&gt;
et_Obituary( &#039;&#039;&#039;self&#039;&#039;&#039;, &#039;&#039;&#039;killer&#039;&#039;&#039;, &#039;&#039;&#039;meansOfDeath&#039;&#039;&#039; )&lt;br /&gt;
:Called whenever a player is killed.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==predefined constants==&lt;br /&gt;
et.EXEC_NOW&amp;lt;br&amp;gt;&lt;br /&gt;
et.EXEC_INSERT&amp;lt;br&amp;gt;&lt;br /&gt;
et.EXEC_APPEND&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_READ&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_WRITE&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_APPEND&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_APPEND_SYNC&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_ALL&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_TEAM&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_BUDDY&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_TEAMNL&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
et.HOSTARCH&lt;br /&gt;
:set to WIN32 or UNIX depending on the host architecture qagame is running on.&lt;br /&gt;
LUA_PATH&lt;br /&gt;
:set to fs_homepath/fs_game/?.lua in order to ease use of the [http://www.lua.org/pil/8.1.html require] function.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==configs==&lt;br /&gt;
If a config is loaded, all modules are shutdown and reloaded. If a &#039;&#039;certified&#039;&#039; config is loaded, all modules are shutdown and reloaded, and additionally the following functions are disabled: &#039;&#039;&#039;require()&#039;&#039;&#039;, &#039;&#039;&#039;loadfile()&#039;&#039;&#039;, &#039;&#039;&#039;loadlib()&#039;&#039;&#039;, &#039;&#039;&#039;loadstring()&#039;&#039;&#039;, &#039;&#039;&#039;dofile()&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==caveats==&lt;br /&gt;
Like qagame, lua modules are unloaded and reloaded on map_restart and map changes. This means that all global variables and other information is lost. Mods may choose to store persistent data in cvars or external files.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
&lt;br /&gt;
Q: OMG I hate the libary prefix et.* on everything!!11!1oneone&amp;lt;br&amp;gt;&lt;br /&gt;
A: table.foreach(et, function (func, value) _G[func] = value; end)&lt;br /&gt;
&lt;br /&gt;
Q: How do a re-load my lua file without restarting the whole server ?&amp;lt;br&amp;gt;&lt;br /&gt;
A: change maps or map_restart&lt;br /&gt;
&lt;br /&gt;
Q: Can I see some sample code?&amp;lt;br&amp;gt;&lt;br /&gt;
A: [[ETPro:Lua Sample Code]]&lt;br /&gt;
&lt;br /&gt;
Q: Is there a list of [[ETPro]] mods?&amp;lt;br&amp;gt;&lt;br /&gt;
A: Yes, [[:Category:ETPro:Mods|here]].&lt;br /&gt;
&lt;br /&gt;
Q: OMG my mod doesn&#039;t work!&amp;lt;br&amp;gt;&lt;br /&gt;
A: Make sure you added your mod&#039;s filename to the lua_modules cvar (e.g. set lua_modules mymod.lua).&lt;br /&gt;
&lt;br /&gt;
[[Category:ETPro]]&lt;br /&gt;
[[Category:ETPro:Mods]]&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=User_talk:Fretn&amp;diff=1811</id>
		<title>User talk:Fretn</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=User_talk:Fretn&amp;diff=1811"/>
		<updated>2005-11-18T02:16:28Z</updated>

		<summary type="html">&lt;p&gt;Bani: TRUTH ABOUT FRETN&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The fifth egg does not work in recent versions so i left it out. Something happens when you do the things to make it happen, but it stays like its value is 0. I Hope, that does not reveal too much ;) --[[User:Deus|Deus]] 05:46, 16 November 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
it&#039;s an extra level of difficulty if they want to find the real (working) one :p&lt;br /&gt;
&lt;br /&gt;
== TRUTH ABOUT FRETN ==&lt;br /&gt;
&lt;br /&gt;
[http://www.zapatopi.net/belgium/ OMG SCARY]&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Fieldname&amp;diff=1790</id>
		<title>Fieldname</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Fieldname&amp;diff=1790"/>
		<updated>2005-11-16T21:08:17Z</updated>

		<summary type="html">&lt;p&gt;Bani: lua-4 changes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;List of fields supported by et.gentity_get() and et.gentity_set()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table border=1&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;table border=0&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=#555555&amp;gt;&amp;lt;th&amp;gt;&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;field&amp;lt;/font&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;type&amp;lt;/font&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;access&amp;lt;/font&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;activator&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;entity&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;chain&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;entity&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;classname&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;closespeed&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;float&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;count&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;count2&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;damage&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;deathType&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;delay&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;float&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;dl_atten&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;dl_color&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;vec3&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;dl_shader&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;dl_stylestring&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;duration&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;float&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;end_size&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;enemy&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;entity&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;flags&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;harc&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;float&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;health&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;inuse&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;boolean&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;isProp&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;boolean&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;item&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;key&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;message&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;methodOfDeath&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;mg42BaseEnt&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;missionLevel&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;model&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;model2&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;nextTrain&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;entity&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;noise_index&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;origin&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;vec3&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;prevTrain&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;entity&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;props_frame_state&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;r.absmax&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;vec3&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;r.absmin&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;vec3&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;r.bmodel&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;boolean&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;r.contents&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;r.currentAngles&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;vec3&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;r.currentOrigin&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;vec3&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;r.eventTime&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;r.linkcount&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;r.linked&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;boolean&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;r.maxs&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;vec3&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;r.mins&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;vec3&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;r.ownerNum&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;r.singleClient&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;r.svFlags&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;r.worldflags&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;radius&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;random&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;float&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;rotate&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;vec3&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.angles&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;vec3&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.angles2&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;vec3&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.apos&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;trajectory&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.clientNum&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.constantLight&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.density&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.dl_intensity&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.dmgFlags&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.eFlags&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.effect1Time&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.effect2Time&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.effect3Time&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.frame&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.groundEntityNum&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.loopSound&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.modelindex&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.modelindex2&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.number&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.onFireEnd&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.onFireStart&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.pos&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;trajectory&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.powerups&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.solid&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.teamNum&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.time&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.time2&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;s.weapon&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;scriptName&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.damage_given&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.damage_received&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.deaths&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.game_points&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.gibs&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.kills&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.muted&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.referee&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.rounds&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.semiadmin&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.spec_invite&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.spec_team&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.suicides&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.team_damage&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.team_kills&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;sess.team_received&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;spawnflags&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;spawnitem&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;speed&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;float&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;splashDamage&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;splashMethodOfDeath&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;splashRadius&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;start_size&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;tagName&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;tagParent&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;entity&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;takedamage&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;boolean&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;tankLink&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;entity&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;target&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;TargetAngles&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;vec3&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;TargetFlag&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;targetname&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;teamchain&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;entity&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;teammaster&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;entity&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;track&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;varc&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;float&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;wait&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;float&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RW &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;waterlevel&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;watertype&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;RO &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ET variable types&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;vec3&#039;&#039;&#039; : a &#039;&#039;&#039;vec3&#039;&#039;&#039; is a 3-element array of numbers (C definition: &amp;lt;tt&amp;gt;typedef float vec3_t[3];&lt;br /&gt;
&amp;lt;/tt&amp;gt;). It is usually used to store and process coordinates in 3D space.&amp;lt;br&amp;gt;&lt;br /&gt;
In etpro-lua a vector is a table containing 3 numbers. It can be accessed by&lt;br /&gt;
doing:&lt;br /&gt;
&amp;lt;pre&amp;gt;tablevar = {}&lt;br /&gt;
tablevar = et.gentity_get() --a vec3 value&lt;br /&gt;
x = tablevar[1]&lt;br /&gt;
y = tablevar[2]&lt;br /&gt;
z = tablevar[3]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:ETPro]]&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Lua_Mod_API&amp;diff=1789</id>
		<title>Lua Mod API</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Lua_Mod_API&amp;diff=1789"/>
		<updated>2005-11-16T21:06:14Z</updated>

		<summary type="html">&lt;p&gt;Bani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOEDITSECTION__&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot; style=&amp;quot;background: #FFFFCC; padding: 2px; border: 2px solid #000000;&amp;quot;&amp;gt;The latest version of the lua-enabled ETPro qagame is etpro-lua-4 and can be downloaded [http://etpro.anime.net/etpro-lua-4.zip here].&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ETPro now supports serverside mods via the [http://www.lua.org/ lua] scripting language.&lt;br /&gt;
&lt;br /&gt;
ETPro has an embedded lua 5.0.2 interpreter, and if present will load user-defined scripts from the etpro directory. ETPro also provides an &amp;quot;et&amp;quot; library of function calls for lua to access the server engine, and provides callbacks so a serverside mod may trigger on specific server events.&lt;br /&gt;
&lt;br /&gt;
The following standard lua libraries are initialized by default and available to ETPro lua scripts:&lt;br /&gt;
[http://www.lua.org/manual/5.0/manual.html#5.1 basic], [http://www.lua.org/manual/5.0/manual.html#5.4 table], [http://www.lua.org/manual/5.0/manual.html#5.6 i/o], [http://www.lua.org/manual/5.0/manual.html#5.3 string], [http://www.lua.org/manual/5.0/manual.html#5.5 math].&lt;br /&gt;
&lt;br /&gt;
A list of [[ETPro]] mods can be found [[:Category:ETPro:Mods|here]].&lt;br /&gt;
&lt;br /&gt;
==server commands==&lt;br /&gt;
===lua_status===&lt;br /&gt;
:lists all currently loaded lua modules.&lt;br /&gt;
&lt;br /&gt;
==cvars==&lt;br /&gt;
===lua_modules===&lt;br /&gt;
:(default &amp;quot;&amp;quot;, disabled)&lt;br /&gt;
:space separated list of lua modules for ETPro to load. modules will be run in the order listed.&lt;br /&gt;
&lt;br /&gt;
===lua_allowedmodules===&lt;br /&gt;
:(default &amp;quot;&amp;quot;, disabled)&lt;br /&gt;
:if set, only lua modules with the matching sha1 signatures listed in this cvar will be allowed to load.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
changing either cvar will cause all currently loaded modules to quit and be unloaded until the next map_restart.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==et library calls==&lt;br /&gt;
&lt;br /&gt;
===modules===&lt;br /&gt;
et.RegisterModname( &#039;&#039;&#039;modname&#039;&#039;&#039; )&lt;br /&gt;
:Registers a descriptive string &#039;&#039;&#039;modname&#039;&#039;&#039; for this mod.&lt;br /&gt;
&#039;&#039;&#039;vmnumber&#039;&#039;&#039; = et.FindSelf()&lt;br /&gt;
:Returns a number indicating the VM slot the current mod is loaded into.&lt;br /&gt;
&#039;&#039;&#039;modname&#039;&#039;&#039;, &#039;&#039;&#039;signature&#039;&#039;&#039; = et.FindMod( &#039;&#039;&#039;vmnumber&#039;&#039;&#039; )&lt;br /&gt;
:Returns the &#039;&#039;&#039;modname&#039;&#039;&#039; and sha1 &#039;&#039;&#039;signature&#039;&#039;&#039; for the mod loaded in the VM slot &#039;&#039;&#039;vmnumber&#039;&#039;&#039;. Returns nil, nil if the VM slot is invalid.&lt;br /&gt;
&#039;&#039;&#039;success&#039;&#039;&#039; = et.IPCSend( &#039;&#039;&#039;vmnumber&#039;&#039;&#039;, &#039;&#039;&#039;message&#039;&#039;&#039; )&lt;br /&gt;
:Sends the string &#039;&#039;&#039;message&#039;&#039;&#039; to the mod in the VM slot indicated by &#039;&#039;&#039;vmnumber&#039;&#039;&#039;. The mod receiving &#039;&#039;&#039;message&#039;&#039;&#039; must have an &#039;&#039;et_IPCReceive()&#039;&#039; callback. If the message is successfully sent, &#039;&#039;&#039;success&#039;&#039;&#039; will be 1. On failure it will be 0.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===printing===&lt;br /&gt;
et.G_Print( &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Prints the string &#039;&#039;&#039;text&#039;&#039;&#039; to the server console.&lt;br /&gt;
et.G_LogPrint( &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Prints the string &#039;&#039;&#039;text&#039;&#039;&#039; to the server console and writes it to the server log.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===argument handling===&lt;br /&gt;
These functions are to be used within the [[#commands|command callback functions]].&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;args&#039;&#039;&#039; = et.ConcatArgs( &#039;&#039;&#039;index&#039;&#039;&#039; )&lt;br /&gt;
:Returns all arguments beginning from &#039;&#039;&#039;index&#039;&#039;&#039; concatenated into a single string &#039;&#039;&#039;args&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;argcount&#039;&#039;&#039; = et.trap_Argc()&lt;br /&gt;
:Returns a number indicating the number of command line arguments in the command buffer.&lt;br /&gt;
&#039;&#039;&#039;arg&#039;&#039;&#039; = et.trap_Argv( &#039;&#039;&#039;argnum&#039;&#039;&#039; )&lt;br /&gt;
:Returns the contents of the command line argument &#039;&#039;&#039;argnum&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===cvars===&lt;br /&gt;
&#039;&#039;&#039;cvarvalue&#039;&#039;&#039; = et.trap_Cvar_Get( &#039;&#039;&#039;cvarname&#039;&#039;&#039; )&lt;br /&gt;
:Returns the value of the cvar &#039;&#039;&#039;cvarname&#039;&#039;&#039;&lt;br /&gt;
et.trap_Cvar_Set( &#039;&#039;&#039;cvarname&#039;&#039;&#039;, &#039;&#039;&#039;cvarvalue&#039;&#039;&#039; )&lt;br /&gt;
:Sets the cvar &#039;&#039;&#039;cvarname&#039;&#039;&#039; to &#039;&#039;&#039;cvarvalue&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===configstrings===&lt;br /&gt;
&#039;&#039;&#039;configstringvalue&#039;&#039;&#039; = et.trap_GetConfigstring( &#039;&#039;&#039;index&#039;&#039;&#039; )&lt;br /&gt;
:Returns the string &#039;&#039;&#039;configstringvalue&#039;&#039;&#039; containing the contents of the configstring &#039;&#039;&#039;index&#039;&#039;&#039;&lt;br /&gt;
et.trap_SetConfigstring( &#039;&#039;&#039;index&#039;&#039;&#039;, &#039;&#039;&#039;configstringvalue&#039;&#039;&#039; )&lt;br /&gt;
:Sets the configstring &#039;&#039;&#039;index&#039;&#039;&#039; to the string &#039;&#039;&#039;configstringvalue&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===server===&lt;br /&gt;
et.trap_SendConsoleCommand( &#039;&#039;&#039;when&#039;&#039;&#039;, &#039;&#039;&#039;command&#039;&#039;&#039; )&lt;br /&gt;
:Sends the command &#039;&#039;&#039;command&#039;&#039;&#039; to the server console, to be executed &#039;&#039;&#039;when&#039;&#039;&#039; (see et.EXEC_* constants)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===clients===&lt;br /&gt;
et.trap_DropClient( &#039;&#039;&#039;clientnum&#039;&#039;&#039;, &#039;&#039;&#039;reason&#039;&#039;&#039;, &#039;&#039;&#039;ban_time&#039;&#039;&#039; )&lt;br /&gt;
:Disconnects &#039;&#039;&#039;clientnum&#039;&#039;&#039; from the server, with descriptive string &#039;&#039;&#039;reason&#039;&#039;&#039; reported to clients. &#039;&#039;&#039;ban_time&#039;&#039;&#039; is the time in seconds to ban the client from the server. &#039;&#039;&#039;ban_time&#039;&#039;&#039; is optional and may be entirely omitted, in which case the ban time defaults to the cvar &#039;&#039;b_defaultbantime&#039;&#039;&lt;br /&gt;
et.trap_SendServerCommand( &#039;&#039;&#039;clientnum&#039;&#039;&#039;, &#039;&#039;&#039;command&#039;&#039;&#039; )&lt;br /&gt;
:Sends the command &#039;&#039;&#039;command&#039;&#039;&#039; to the client &#039;&#039;&#039;clientnum&#039;&#039;&#039;. If &#039;&#039;&#039;clientnum&#039;&#039;&#039; is -1, the &#039;&#039;&#039;command&#039;&#039;&#039; is broadcast to all connected clients.&lt;br /&gt;
et.G_Say( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;mode&#039;&#039;&#039;, &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Sends a chat command on behalf of client &#039;&#039;&#039;clientNum&#039;&#039;&#039; with the mode &#039;&#039;&#039;mode&#039;&#039;&#039; (see et.SAY_* constants) and chat text &#039;&#039;&#039;text&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===userinfo===&lt;br /&gt;
&#039;&#039;&#039;userinfo&#039;&#039;&#039; = et.trap_GetUserinfo( &#039;&#039;&#039;clientnum&#039;&#039;&#039; )&lt;br /&gt;
:Returns the contents of the userinfo string for the client &#039;&#039;&#039;clientnum&#039;&#039;&#039;&lt;br /&gt;
et.trap_SetUserinfo( &#039;&#039;&#039;clientnum&#039;&#039;&#039;, &#039;&#039;&#039;userinfo&#039;&#039;&#039; )&lt;br /&gt;
:Sets the userinfo string for the client &#039;&#039;&#039;clientnum&#039;&#039;&#039; to &#039;&#039;&#039;userinfo&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===string utility functions===&lt;br /&gt;
&#039;&#039;&#039;infostring&#039;&#039;&#039; = et.Info_RemoveKey( &#039;&#039;&#039;infostring&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039; )&lt;br /&gt;
:Removes key &#039;&#039;&#039;key&#039;&#039;&#039; from infostring &#039;&#039;&#039;infostring&#039;&#039;&#039; and returns the modified infostring.&lt;br /&gt;
&#039;&#039;&#039;infostring&#039;&#039;&#039; = et.Info_SetValueForKey( &#039;&#039;&#039;infostring&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039;, &#039;&#039;&#039;value&#039;&#039;&#039; )&lt;br /&gt;
:Sets the key &#039;&#039;&#039;key&#039;&#039;&#039; in the infostring &#039;&#039;&#039;infostring&#039;&#039;&#039; to &#039;&#039;&#039;value&#039;&#039;&#039; and returns the modified infostring.&lt;br /&gt;
&#039;&#039;&#039;keyvalue&#039;&#039;&#039; = et.Info_ValueForKey( &#039;&#039;&#039;infostring&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039; )&lt;br /&gt;
:Returns the value of the key &#039;&#039;&#039;key&#039;&#039;&#039; in the infostring &#039;&#039;&#039;infostring&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;cleanstring&#039;&#039;&#039; = et.Q_CleanStr( &#039;&#039;&#039;string&#039;&#039;&#039; )&lt;br /&gt;
:Returns &#039;&#039;&#039;string&#039;&#039;&#039; stripped of all color codes&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ET filesystem===&lt;br /&gt;
&#039;&#039;&#039;fd&#039;&#039;&#039;, &#039;&#039;&#039;len&#039;&#039;&#039; = et.trap_FS_FOpenFile( &#039;&#039;&#039;filename&#039;&#039;&#039;, &#039;&#039;&#039;mode&#039;&#039;&#039; )&lt;br /&gt;
:Attempts to open the file &#039;&#039;&#039;filename&#039;&#039;&#039; with the access mode &#039;&#039;&#039;mode&#039;&#039;&#039; (see et.FS_ constants). Returns the filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039; and file length &#039;&#039;&#039;len&#039;&#039;&#039;. On error, &#039;&#039;&#039;len&#039;&#039;&#039; returns -1.&lt;br /&gt;
&#039;&#039;&#039;filedata&#039;&#039;&#039; = et.trap_FS_Read( fd, count )&lt;br /&gt;
:Reads &#039;&#039;&#039;count&#039;&#039;&#039; bytes from filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039;.&lt;br /&gt;
&#039;&#039;&#039;count&#039;&#039;&#039; = et.trap_FS_Write( &#039;&#039;&#039;filedata&#039;&#039;&#039;, &#039;&#039;&#039;count&#039;&#039;&#039;, &#039;&#039;&#039;fd&#039;&#039;&#039; )&lt;br /&gt;
:Attempts to write &#039;&#039;&#039;count&#039;&#039;&#039; bytes of &#039;&#039;&#039;filedata&#039;&#039;&#039; to filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039;. Returns number of bytes successfully written.&lt;br /&gt;
et.trap_FS_Rename( &#039;&#039;&#039;oldname&#039;&#039;&#039;, &#039;&#039;&#039;newname&#039;&#039;&#039; )&lt;br /&gt;
:Renames file &#039;&#039;&#039;oldname&#039;&#039;&#039; to &#039;&#039;&#039;newname&#039;&#039;&#039;.&lt;br /&gt;
et.trap_FS_FCloseFile( &#039;&#039;&#039;fd&#039;&#039;&#039; )&lt;br /&gt;
:Closes filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===indexes===&lt;br /&gt;
&#039;&#039;&#039;soundindex&#039;&#039;&#039; = et.G_SoundIndex( &#039;&#039;&#039;filename&#039;&#039;&#039; )&lt;br /&gt;
:Returns an index to the soundfile indicated by &#039;&#039;&#039;filename&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;modelindex&#039;&#039;&#039; = et.G_ModelIndex( &#039;&#039;&#039;filename&#039;&#039;&#039; )&lt;br /&gt;
:Returns an index to the model indicated by &#039;&#039;&#039;filename&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sound===&lt;br /&gt;
et.G_globalSound( &#039;&#039;&#039;sound&#039;&#039;&#039; )&lt;br /&gt;
:Plays the global sound indicated by the filename &#039;&#039;&#039;sound&#039;&#039;&#039;.&lt;br /&gt;
et.G_Sound( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;soundindex&#039;&#039;&#039; )&lt;br /&gt;
:Plays the sound &#039;&#039;&#039;soundindex&#039;&#039;&#039; at the location of entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===miscellaneous===&lt;br /&gt;
&#039;&#039;&#039;milliseconds&#039;&#039;&#039; = et.trap_Milliseconds()&lt;br /&gt;
:Returns a number indicating the current server time in milliseconds.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===entities===&lt;br /&gt;
&#039;&#039;&#039;entnum&#039;&#039;&#039; = et.G_Spawn()&lt;br /&gt;
:Spawns a new entity and returns the new entity number.&lt;br /&gt;
&#039;&#039;&#039;entnum&#039;&#039;&#039; = et.G_TempEntity( &#039;&#039;&#039;origin&#039;&#039;&#039;, &#039;&#039;&#039;event&#039;&#039;&#039; )&lt;br /&gt;
:Spawns a new TempEntity of event type &#039;&#039;&#039;event&#039;&#039;&#039; and places it at &#039;&#039;&#039;origin&#039;&#039;&#039; in the world.&lt;br /&gt;
et.G_FreeEntity( &#039;&#039;&#039;entnum&#039;&#039;&#039; )&lt;br /&gt;
:Frees the entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;spawnval&#039;&#039;&#039; = et.G_GetSpawnVar( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039; )&lt;br /&gt;
:Returns the value of spawnvar &#039;&#039;&#039;key&#039;&#039;&#039; for entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
et.G_SetSpawnVar( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039;, &#039;&#039;&#039;value&#039;&#039;&#039; )&lt;br /&gt;
:Sets the spawnvar &#039;&#039;&#039;key&#039;&#039;&#039; to &#039;&#039;&#039;value&#039;&#039;&#039; for entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;integer entnum&#039;&#039;&#039; = et.G_SpawnGEntityFromSpawnVars( string spawnvar, string spawnvalue, ... )&lt;br /&gt;
:This function can only be called inside the &#039;&#039;&#039;et_InitGame&#039;&#039;&#039; callback&lt;br /&gt;
et.trap_LinkEntity( &#039;&#039;&#039;entnum&#039;&#039;&#039; )&lt;br /&gt;
:Links the entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
et.trap_UnlinkEntity( &#039;&#039;&#039;entnum&#039;&#039;&#039; )&lt;br /&gt;
:Unlinks the entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;(variable)&#039;&#039;&#039; = et.gentity_get ( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;[[Fieldname]]&#039;&#039;&#039; )&lt;br /&gt;
:Gets the value of &#039;&#039;&#039;[[Fieldname]]&#039;&#039;&#039; from entity &#039;&#039;&#039;entnum&#039;&#039;&#039; out of the g_entity struct&amp;lt;br&amp;gt;&lt;br /&gt;
et.gentity_set( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;[[Fieldname]]&#039;&#039;&#039;, &#039;&#039;&#039;(variable)&#039;&#039;&#039; )&lt;br /&gt;
:Sets the value of &#039;&#039;&#039;[[Fieldname]]&#039;&#039;&#039; from entity &#039;&#039;&#039;entnum&#039;&#039;&#039; in the g_entity struct to &#039;&#039;&#039;(variable)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==callbacks==&lt;br /&gt;
&lt;br /&gt;
===qagame execution===&lt;br /&gt;
et_InitGame( &#039;&#039;&#039;levelTime&#039;&#039;&#039;, &#039;&#039;&#039;randomSeed&#039;&#039;&#039;, &#039;&#039;&#039;restart&#039;&#039;&#039; )&lt;br /&gt;
:Called when qagame initializes. &#039;&#039;&#039;levelTime&#039;&#039;&#039; is the current level time in milliseconds. &#039;&#039;&#039;randomSeed&#039;&#039;&#039; is a number that can be used to seed random number generators. &#039;&#039;&#039;restart&#039;&#039;&#039; indicates if et_InitGame() is being called due to a map restart (1) or not (0).&lt;br /&gt;
et_ShutdownGame( &#039;&#039;&#039;restart&#039;&#039;&#039; )&lt;br /&gt;
:Called when qagame shuts down. &#039;&#039;&#039;restart&#039;&#039;&#039; indicates if the shutdown is being called due to a map_restart (1) or not (0).&lt;br /&gt;
et_RunFrame( &#039;&#039;&#039;levelTime&#039;&#039;&#039; )&lt;br /&gt;
:Called when qagame runs a server frame. &#039;&#039;&#039;levelTime&#039;&#039;&#039; is the current level time in milliseconds.&lt;br /&gt;
et_Quit()&lt;br /&gt;
:Called when ETPro unloads the mod. The mod should close all open filedescriptors and perform all cleanup.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===client management===&lt;br /&gt;
&#039;&#039;&#039;rejectreason&#039;&#039;&#039; = et_ClientConnect( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;firstTime&#039;&#039;&#039;, &#039;&#039;&#039;isBot&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client attempts to connect to the server. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id, &#039;&#039;&#039;firstTime&#039;&#039;&#039; indicates if this is a new connection (1) or a reconnection (0). &#039;&#039;&#039;isBot&#039;&#039;&#039; indicates if the client is a bot (1) or not (0). If the mod accepts the connection, it should return nil. Otherwise, the mod should return a string describing the reason the client connection was rejected.&lt;br /&gt;
et_ClientDisconnect( &#039;&#039;&#039;clientNum&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client disconnects. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id.&lt;br /&gt;
et_ClientBegin( &#039;&#039;&#039;clientNum&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client begins (becomes active, and enters the gameworld). &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id.&lt;br /&gt;
et_ClientUserinfoChanged( &#039;&#039;&#039;clientNum&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client&#039;s Userinfo string has changed. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===commands===&lt;br /&gt;
&#039;&#039;&#039;intercepted&#039;&#039;&#039; = et_ClientCommand( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;command&#039;&#039;&#039; )&lt;br /&gt;
:Called when a command is received from a client. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id. &#039;&#039;&#039;command&#039;&#039;&#039; is the command. The mod should return 1 if the command was intercepted by the mod, and 0 if the command was ignored by the mod and should be passed through to the server (and other mods in the chain).&lt;br /&gt;
:The actual command can be accessed through the [[#argument_handling|argument handling]] functions, as seen in the [[ETPro:Lua Sample Code]].&lt;br /&gt;
&#039;&#039;&#039;intercepted&#039;&#039;&#039; = et_ConsoleCommand()&lt;br /&gt;
:Called when a command is entered on the server console. The mod should return 1 if the command was intercepted by the mod, and 0 if the command was ignored by the mod and should be passed through to the server (and other mods in the chain).&lt;br /&gt;
:The actual command can be accessed through the [[#argument_handling|argument handling]] functions, as seen in the [[ETPro:Lua Sample Code]].&lt;br /&gt;
&#039;&#039;&#039;intercepted&#039;&#039;&#039; = et_ClientSay( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;mode&#039;&#039;&#039;, &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client sends a chat command. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id. &#039;&#039;&#039;mode&#039;&#039;&#039; is the chat mode (see et.SAY_* constants). &#039;&#039;&#039;text&#039;&#039;&#039; is the chat text. The mod should return 1 if the command was intercepted by the mod, and 0 if the command was ignored by the mod and should be passed through to the server (and other mods in the chain)&lt;br /&gt;
:Note that this command &#039;&#039;&#039;does not&#039;&#039;&#039; use the [[#argument_handling|argument handling]] functions.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===miscellaneous===&lt;br /&gt;
et_IPCReceive( &#039;&#039;&#039;vmnumber&#039;&#039;&#039;, &#039;&#039;&#039;message&#039;&#039;&#039; )&lt;br /&gt;
:Called when another mod sends an et.IPCSend() message to this mod. &#039;&#039;&#039;vmnumber&#039;&#039;&#039; is the VM slot number of the sender, and &#039;&#039;&#039;message&#039;&#039;&#039; is the message.&lt;br /&gt;
et_Print( &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Called whenever the server or qagame prints a string to the console.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==predefined constants==&lt;br /&gt;
et.EXEC_NOW&amp;lt;br&amp;gt;&lt;br /&gt;
et.EXEC_INSERT&amp;lt;br&amp;gt;&lt;br /&gt;
et.EXEC_APPEND&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_READ&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_WRITE&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_APPEND&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_APPEND_SYNC&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_ALL&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_TEAM&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_BUDDY&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_TEAMNL&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
et.HOSTARCH&lt;br /&gt;
:set to WIN32 or UNIX depending on the host architecture qagame is running on.&lt;br /&gt;
LUA_PATH&lt;br /&gt;
:set to fs_homepath/fs_game/?.lua in order to ease use of the [http://www.lua.org/pil/8.1.html require] function.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==configs==&lt;br /&gt;
If a config is loaded, all modules are shutdown and reloaded. If a &#039;&#039;certified&#039;&#039; config is loaded, all modules are shutdown and reloaded, and additionally the following functions are disabled: &#039;&#039;&#039;require()&#039;&#039;&#039;, &#039;&#039;&#039;loadfile()&#039;&#039;&#039;, &#039;&#039;&#039;loadlib()&#039;&#039;&#039;, &#039;&#039;&#039;loadstring()&#039;&#039;&#039;, &#039;&#039;&#039;dofile()&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==caveats==&lt;br /&gt;
Like qagame, lua modules are unloaded and reloaded on map_restart and map changes. This means that all global variables and other information is lost. Mods may choose to store persistent data in cvars or external files.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
&lt;br /&gt;
Q: OMG I hate the libary prefix et.* on everything!!11!1oneone&amp;lt;br&amp;gt;&lt;br /&gt;
A: table.foreach(et, function (func, value) _G[func] = value; end)&lt;br /&gt;
&lt;br /&gt;
Q: How do a re-load my lua file without restarting the whole server ?&amp;lt;br&amp;gt;&lt;br /&gt;
A: change maps or map_restart&lt;br /&gt;
&lt;br /&gt;
Q: Can I see some sample code?&amp;lt;br&amp;gt;&lt;br /&gt;
A: [[ETPro:Lua Sample Code]]&lt;br /&gt;
&lt;br /&gt;
Q: Is there a list of [[ETPro]] mods?&amp;lt;br&amp;gt;&lt;br /&gt;
A: Yes, [[:Category:ETPro:Mods|here]].&lt;br /&gt;
&lt;br /&gt;
Q: OMG my mod doesn&#039;t work!&amp;lt;br&amp;gt;&lt;br /&gt;
A: Make sure you added your mod&#039;s filename to the lua_modules cvar (e.g. set lua_modules mymod.lua).&lt;br /&gt;
&lt;br /&gt;
[[Category:ETPro]]&lt;br /&gt;
[[Category:ETPro:Mods]]&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=User_talk:Bani&amp;diff=1769</id>
		<title>User talk:Bani</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=User_talk:Bani&amp;diff=1769"/>
		<updated>2005-11-15T19:42:04Z</updated>

		<summary type="html">&lt;p&gt;Bani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The best method to contact [[Bani]] is through the [http://bani.anime.net/banimod/forums/ Banimod Forums] [http://bani.anime.net/banimod/forums/privmsg.php?folder=inbox Private Messenging] system. Alternatively you may join the [[ETPro]] [[IRC]] channel and talk to him there, but be warned that the Bani Monster rarely talks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;nicked&amp;quot; ooo look at Bani trying to be English ;P&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sarcasm&amp;gt;By Jove! Are you implying that this charming young gentleman is not indeed English?&amp;lt;/sarcasm&amp;gt; --Rookie One 10:49, 15 November 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
wtf mate? we use &#039;nicked&#039; this side of the pond too. --[[User:Bani|Bani]] 11:42, 15 November 2005 (PST)&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Main_Page&amp;diff=1737</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Main_Page&amp;diff=1737"/>
		<updated>2005-11-15T12:21:51Z</updated>

		<summary type="html">&lt;p&gt;Bani: added __NOEDITSECTION__&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;center&amp;gt;&amp;lt;span style=&amp;quot;color:#cf7606; font-size:200%;&amp;quot;&amp;gt;&#039;&#039;&#039;Welcome to&#039;&#039;&#039;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color:#005288; font-size:200%;&amp;quot;&amp;gt;&#039;&#039;&#039;[[WolfWiki]]&#039;&#039;&#039;&amp;lt;/span&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table cellspacing=&amp;quot;8&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr valign=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;td width=&amp;quot;60%&amp;quot; style=&amp;quot;border: 1px solid #FABD23; color: #000; background-color: #fcfae3&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: .5em .9em .9em&amp;quot;&amp;gt;&lt;br /&gt;
__NOTOC__&lt;br /&gt;
==About==&lt;br /&gt;
[[WolfWiki]] is a collaborative site for the ETPro / ETTV / BayonET community.&lt;br /&gt;
&lt;br /&gt;
==Getting Started==&lt;br /&gt;
Anyone with a [http://bani.anime.net/banimod/forums/ Banimod Forums] account may edit pages. If you do not have an account, you may [http://bani.anime.net/banimod/forums/profile.php?mode=register apply] for one. Please follow the [[Help:Editing]] guidelines when editing pages.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;There are currently {{NUMBEROFARTICLES}} [[:Special:Allpages|articles available]].&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px solid #3e48fb; color: #000; background-color: #f0f0ff&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: .5em .9em .9em&amp;quot;&amp;gt;&lt;br /&gt;
==[[:Category:ETPro|ETPro]]==&lt;br /&gt;
{{ETPro_Topics}}&lt;br /&gt;
==[[:Category:ETTV|ETTV]]==&lt;br /&gt;
[http://bani.anime.net/banimod/forums/viewforum.php?f=18 Discussion Forums]&amp;lt;br&amp;gt;&lt;br /&gt;
[[ETTV:Server Configuration|Server Configuration]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[ETTV:Viewer&#039;s Guide|Viewer&#039;s Guide]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==[[:Category:BayonET|BayonET]]==&lt;br /&gt;
[http://bani.anime.net/banimod/forums/viewforum.php?f=10 Discussion Forums]&lt;br /&gt;
&amp;lt;!-- [[BayonET:Server Configuration|Server Configuration]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[BayonET:Client Configuration|Client Configuration]] --&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__NOEDITSECTION__&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Main_Page&amp;diff=1736</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Main_Page&amp;diff=1736"/>
		<updated>2005-11-15T12:20:25Z</updated>

		<summary type="html">&lt;p&gt;Bani: nicked layout from http://wiki.osx86project.org/wiki/index.php/Main_Page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;center&amp;gt;&amp;lt;span style=&amp;quot;color:#cf7606; font-size:200%;&amp;quot;&amp;gt;&#039;&#039;&#039;Welcome to&#039;&#039;&#039;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color:#005288; font-size:200%;&amp;quot;&amp;gt;&#039;&#039;&#039;[[WolfWiki]]&#039;&#039;&#039;&amp;lt;/span&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table cellspacing=&amp;quot;8&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr valign=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;td width=&amp;quot;60%&amp;quot; style=&amp;quot;border: 1px solid #FABD23; color: #000; background-color: #fcfae3&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: .5em .9em .9em&amp;quot;&amp;gt;&lt;br /&gt;
__NOTOC__&lt;br /&gt;
==About==&lt;br /&gt;
[[WolfWiki]] is a collaborative site for the ETPro / ETTV / BayonET community.&lt;br /&gt;
&lt;br /&gt;
==Getting Started==&lt;br /&gt;
Anyone with a [http://bani.anime.net/banimod/forums/ Banimod Forums] account may edit pages. If you do not have an account, you may [http://bani.anime.net/banimod/forums/profile.php?mode=register apply] for one. Please follow the [[Help:Editing]] guidelines when editing pages.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;There are currently {{NUMBEROFARTICLES}} [[:Special:Allpages|articles available]].&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px solid #3e48fb; color: #000; background-color: #f0f0ff&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: .5em .9em .9em&amp;quot;&amp;gt;&lt;br /&gt;
==[[:Category:ETPro|ETPro]]==&lt;br /&gt;
{{ETPro_Topics}}&lt;br /&gt;
==[[:Category:ETTV|ETTV]]==&lt;br /&gt;
[http://bani.anime.net/banimod/forums/viewforum.php?f=18 Discussion Forums]&amp;lt;br&amp;gt;&lt;br /&gt;
[[ETTV:Server Configuration|Server Configuration]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[ETTV:Viewer&#039;s Guide|Viewer&#039;s Guide]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==[[:Category:BayonET|BayonET]]==&lt;br /&gt;
[http://bani.anime.net/banimod/forums/viewforum.php?f=10 Discussion Forums]&lt;br /&gt;
&amp;lt;!-- [[BayonET:Server Configuration|Server Configuration]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[BayonET:Client Configuration|Client Configuration]] --&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=User_talk:%3DFF%3Dim2good4u&amp;diff=1730</id>
		<title>User talk:=FF=im2good4u</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=User_talk:%3DFF%3Dim2good4u&amp;diff=1730"/>
		<updated>2005-11-14T20:59:40Z</updated>

		<summary type="html">&lt;p&gt;Bani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The links lead to 404 errors. --Rookie One 10:42, 14 November 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
:I think that&#039;s about normal for im2good4u. --[[User:Bani|Bani]] 12:59, 14 November 2005 (PST)&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Talk:Fieldname&amp;diff=1725</id>
		<title>Talk:Fieldname</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Talk:Fieldname&amp;diff=1725"/>
		<updated>2005-11-14T13:40:51Z</updated>

		<summary type="html">&lt;p&gt;Bani: use of color...bad!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;someone feel free to make this table pretty.&lt;br /&gt;
&lt;br /&gt;
Roger that. --Rookie One 03:31, 13 November 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
// Comment by Deus 13:22, 13 November 2005 (CET)&lt;br /&gt;
I liked the former one more.&lt;br /&gt;
I thought about some colorisation like red for readonly and green for r/w. maybe some mouseover stuff, or just the one tr light the next darker, to have a better viewability ?&lt;br /&gt;
// End of Deus Comment&lt;br /&gt;
&lt;br /&gt;
Alright, I&#039;ll restore the previous borders and add some colour. --Rookie One 04:33, 13 November 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
That was just my suggestion. Maybe this differs from banis view of beautification :) --Deus 04:46, 13 November 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
== use of color...bad! ==&lt;br /&gt;
&lt;br /&gt;
use of color to convey specific data (ro/rw) is bad. red/green is the worst possible choice too :)&amp;lt;br&amp;gt;&lt;br /&gt;
consider someone who is colorblind. check the article via http://colorfilter.wickline.org/ to see how bad this is.&lt;br /&gt;
but it looks bad even for those who aren&#039;t color blind :P&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Fieldname&amp;diff=1724</id>
		<title>Fieldname</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Fieldname&amp;diff=1724"/>
		<updated>2005-11-14T13:32:29Z</updated>

		<summary type="html">&lt;p&gt;Bani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;List of fields supported by et.gentity_get() and et.gentity_set()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;table border=1&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&amp;lt;table border=0&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=#555555&amp;gt;&amp;lt;th&amp;gt;&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;field&amp;lt;/font&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;type&amp;lt;/font&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;access&amp;lt;/font&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;activator&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;entity&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;chain&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;entity&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;classname&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;string&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;closespeed&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;float&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;count&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;count2&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;damage&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;deathType&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;delay&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;float&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;dl_atten&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;dl_color&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;vec3&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;dl_shader&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;string&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;dl_stylestring&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;string&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;duration&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;float&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;end_size&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;enemy&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;entity&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;flags&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;harc&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;float&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;health&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;inuse&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;boolean&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;isProp&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;boolean&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;item&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;string&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;key&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;message&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;string&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;methodOfDeath&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;mg42BaseEnt&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;missionLevel&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;model&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;string&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;model2&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;string&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;nextTrain&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;entity&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;noise_index&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;origin&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;vec3&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;prevTrain&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;entity&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;props_frame_state&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;r.absmax&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;vec3&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;r.absmin&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;vec3&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;r.bmodel&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;boolean&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;r.contents&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;r.currentAngles&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;vec3&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;r.currentOrigin&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;vec3&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;r.eventTime&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;r.linkcount&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;r.linked&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;boolean&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;r.maxs&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;vec3&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;r.mins&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;vec3&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;r.ownerNum&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;r.singleClient&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;r.svFlags&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;r.worldflags&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;radius&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;random&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;float&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;rotate&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;vec3&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;s.angles&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;vec3&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;s.angles2&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;vec3&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;s.apos&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;trajectory&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;s.clientNum&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;s.constantLight&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;s.density&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;s.dl_intensity&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;s.dmgFlags&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;s.eFlags&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;s.effect1Time&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;s.effect2Time&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;s.effect3Time&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;s.frame&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;s.groundEntityNum&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;s.loopSound&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;s.modelindex&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;s.modelindex2&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;s.number&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;s.onFireEnd&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;s.onFireStart&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;s.pos&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;trajectory&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;s.powerups&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;s.solid&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;s.teamNum&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;s.time&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;s.time2&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;s.weapon&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;scriptName&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;string&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;sess.damage_given&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;sess.damage_received&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;sess.deaths&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;sess.game_points&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;sess.gibs&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;sess.kills&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;sess.muted&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;sess.referee&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;sess.rounds&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;sess.semiadmin&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;sess.spec_invite&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;sess.spec_team&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;sess.suicides&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;sess.team_damage&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;sess.team_kills&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;sess.team_received&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;spawnflags&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;spawnitem&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;string&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;speed&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;float&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;splashDamage&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;splashMethodOfDeath&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;splashRadius&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;start_size&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;tagName&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;string&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;tagParent&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;entity&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;takedamage&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;boolean&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;tankLink&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;entity&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;target&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;string&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;TargetAngles&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;vec3&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;TargetFlag&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;targetname&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;string&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;teamchain&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;entity&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;teammaster&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;entity&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;track&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;string&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;varc&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;float&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;wait&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;float&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;green&#039;&amp;gt;RW &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;white&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;waterlevel&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr bgcolor=&#039;lightgrey&#039;&amp;gt;&amp;lt;td align=left&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;watertype&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;integer&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td align=center&amp;gt;&amp;lt;font color=&#039;red&#039;&amp;gt;RO &amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
[[Category:ETPro]]&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Talk:Fieldname&amp;diff=1684</id>
		<title>Talk:Fieldname</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Talk:Fieldname&amp;diff=1684"/>
		<updated>2005-11-13T10:43:42Z</updated>

		<summary type="html">&lt;p&gt;Bani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;someone feel free to make this table pretty.&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Lua_Mod_API&amp;diff=1683</id>
		<title>Lua Mod API</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Lua_Mod_API&amp;diff=1683"/>
		<updated>2005-11-13T08:02:46Z</updated>

		<summary type="html">&lt;p&gt;Bani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOEDITSECTION__&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot; style=&amp;quot;background: #FFFFCC; padding: 2px; border: 2px solid #000000;&amp;quot;&amp;gt;The latest version of the lua-enabled ETPro qagame is etpro-lua-3 and can be downloaded [http://etpro.anime.net/etpro-lua-3.zip here].&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ETPro now supports serverside mods via the [http://www.lua.org/ lua] scripting language.&lt;br /&gt;
&lt;br /&gt;
ETPro has an embedded lua 5.0.2 interpreter, and if present will load user-defined scripts from the etpro directory. ETPro also provides an &amp;quot;et&amp;quot; library of function calls for lua to access the server engine, and provides callbacks so a serverside mod may trigger on specific server events.&lt;br /&gt;
&lt;br /&gt;
The following standard lua libraries are initialized by default and available to ETPro lua scripts:&lt;br /&gt;
[http://www.lua.org/manual/5.0/manual.html#5.1 basic], [http://www.lua.org/manual/5.0/manual.html#5.4 table], [http://www.lua.org/manual/5.0/manual.html#5.6 i/o], [http://www.lua.org/manual/5.0/manual.html#5.3 string], [http://www.lua.org/manual/5.0/manual.html#5.5 math].&lt;br /&gt;
&lt;br /&gt;
A list of [[ETPro]] mods can be found [[:Category:ETPro:Mods|here]].&lt;br /&gt;
&lt;br /&gt;
==server commands==&lt;br /&gt;
===lua_status===&lt;br /&gt;
:lists all currently loaded lua modules.&lt;br /&gt;
&lt;br /&gt;
==cvars==&lt;br /&gt;
===lua_modules===&lt;br /&gt;
:(default &amp;quot;&amp;quot;, disabled)&lt;br /&gt;
:space separated list of lua modules for ETPro to load. modules will be run in the order listed.&lt;br /&gt;
&lt;br /&gt;
===lua_allowedmodules===&lt;br /&gt;
:(default &amp;quot;&amp;quot;, disabled)&lt;br /&gt;
:if set, only lua modules with the matching sha1 signatures listed in this cvar will be allowed to load.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
changing either cvar will cause all currently loaded modules to quit and be unloaded until the next map_restart.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==et library calls==&lt;br /&gt;
&lt;br /&gt;
===modules===&lt;br /&gt;
et.RegisterModname( &#039;&#039;&#039;modname&#039;&#039;&#039; )&lt;br /&gt;
:Registers a descriptive string &#039;&#039;&#039;modname&#039;&#039;&#039; for this mod.&lt;br /&gt;
&#039;&#039;&#039;vmnumber&#039;&#039;&#039; = et.FindSelf()&lt;br /&gt;
:Returns a number indicating the VM slot the current mod is loaded into.&lt;br /&gt;
&#039;&#039;&#039;modname&#039;&#039;&#039;, &#039;&#039;&#039;signature&#039;&#039;&#039; = et.FindMod( &#039;&#039;&#039;vmnumber&#039;&#039;&#039; )&lt;br /&gt;
:Returns the &#039;&#039;&#039;modname&#039;&#039;&#039; and sha1 &#039;&#039;&#039;signature&#039;&#039;&#039; for the mod loaded in the VM slot &#039;&#039;&#039;vmnumber&#039;&#039;&#039;. Returns nil, nil if the VM slot is invalid.&lt;br /&gt;
&#039;&#039;&#039;success&#039;&#039;&#039; = et.IPCSend( &#039;&#039;&#039;vmnumber&#039;&#039;&#039;, &#039;&#039;&#039;message&#039;&#039;&#039; )&lt;br /&gt;
:Sends the string &#039;&#039;&#039;message&#039;&#039;&#039; to the mod in the VM slot indicated by &#039;&#039;&#039;vmnumber&#039;&#039;&#039;. The mod receiving &#039;&#039;&#039;message&#039;&#039;&#039; must have an &#039;&#039;et_IPCReceive()&#039;&#039; callback. If the message is successfully sent, &#039;&#039;&#039;success&#039;&#039;&#039; will be 1. On failure it will be 0.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===printing===&lt;br /&gt;
et.G_Print( &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Prints the string &#039;&#039;&#039;text&#039;&#039;&#039; to the server console.&lt;br /&gt;
et.G_LogPrint( &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Prints the string &#039;&#039;&#039;text&#039;&#039;&#039; to the server console and writes it to the server log.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===argument handling===&lt;br /&gt;
&#039;&#039;&#039;args&#039;&#039;&#039; = et.ConcatArgs( &#039;&#039;&#039;index&#039;&#039;&#039; )&lt;br /&gt;
:Returns all arguments beginning from &#039;&#039;&#039;index&#039;&#039;&#039; concatenated into a single string &#039;&#039;&#039;args&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;argcount&#039;&#039;&#039; = et.trap_Argc()&lt;br /&gt;
:Returns a number indicating the number of command line arguments in the command buffer.&lt;br /&gt;
&#039;&#039;&#039;arg&#039;&#039;&#039; = et.trap_Argv( &#039;&#039;&#039;argnum&#039;&#039;&#039; )&lt;br /&gt;
:Returns the contents of the command line argument &#039;&#039;&#039;argnum&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===cvars===&lt;br /&gt;
&#039;&#039;&#039;cvarvalue&#039;&#039;&#039; = et.trap_Cvar_Get( &#039;&#039;&#039;cvarname&#039;&#039;&#039; )&lt;br /&gt;
:Returns the value of the cvar &#039;&#039;&#039;cvarname&#039;&#039;&#039;&lt;br /&gt;
et.trap_Cvar_Set( &#039;&#039;&#039;cvarname&#039;&#039;&#039;, &#039;&#039;&#039;cvarvalue&#039;&#039;&#039; )&lt;br /&gt;
:Sets the cvar &#039;&#039;&#039;cvarname&#039;&#039;&#039; to &#039;&#039;&#039;cvarvalue&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===configstrings===&lt;br /&gt;
&#039;&#039;&#039;configstringvalue&#039;&#039;&#039; = et.trap_GetConfigstring( &#039;&#039;&#039;index&#039;&#039;&#039; )&lt;br /&gt;
:Returns the string &#039;&#039;&#039;configstringvalue&#039;&#039;&#039; containing the contents of the configstring &#039;&#039;&#039;index&#039;&#039;&#039;&lt;br /&gt;
et.trap_SetConfigstring( &#039;&#039;&#039;index&#039;&#039;&#039;, &#039;&#039;&#039;configstringvalue&#039;&#039;&#039; )&lt;br /&gt;
:Sets the configstring &#039;&#039;&#039;index&#039;&#039;&#039; to the string &#039;&#039;&#039;configstringvalue&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===server===&lt;br /&gt;
et.trap_SendConsoleCommand( &#039;&#039;&#039;when&#039;&#039;&#039;, &#039;&#039;&#039;command&#039;&#039;&#039; )&lt;br /&gt;
:Sends the command &#039;&#039;&#039;command&#039;&#039;&#039; to the server console, to be executed &#039;&#039;&#039;when&#039;&#039;&#039; (see et.EXEC_* constants)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===clients===&lt;br /&gt;
et.trap_DropClient( &#039;&#039;&#039;clientnum&#039;&#039;&#039;, &#039;&#039;&#039;reason&#039;&#039;&#039;, &#039;&#039;&#039;ban_time&#039;&#039;&#039; )&lt;br /&gt;
:Disconnects &#039;&#039;&#039;clientnum&#039;&#039;&#039; from the server, with descriptive string &#039;&#039;&#039;reason&#039;&#039;&#039; reported to clients. &#039;&#039;&#039;ban_time&#039;&#039;&#039; is the time in seconds to ban the client from the server. &#039;&#039;&#039;ban_time&#039;&#039;&#039; is optional and may be entirely omitted, in which case the ban time defaults to the cvar &#039;&#039;b_defaultbantime&#039;&#039;&lt;br /&gt;
et.trap_SendServerCommand( &#039;&#039;&#039;clientnum&#039;&#039;&#039;, &#039;&#039;&#039;command&#039;&#039;&#039; )&lt;br /&gt;
:Sends the command &#039;&#039;&#039;command&#039;&#039;&#039; to the client &#039;&#039;&#039;clientnum&#039;&#039;&#039;. If &#039;&#039;&#039;clientnum&#039;&#039;&#039; is -1, the &#039;&#039;&#039;command&#039;&#039;&#039; is broadcast to all connected clients.&lt;br /&gt;
et.G_Say( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;mode&#039;&#039;&#039;, &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Sends a chat command on behalf of client &#039;&#039;&#039;clientNum&#039;&#039;&#039; with the mode &#039;&#039;&#039;mode&#039;&#039;&#039; (see et.SAY_* constants) and chat text &#039;&#039;&#039;text&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===userinfo===&lt;br /&gt;
&#039;&#039;&#039;userinfo&#039;&#039;&#039; = et.trap_GetUserinfo( &#039;&#039;&#039;clientnum&#039;&#039;&#039; )&lt;br /&gt;
:Returns the contents of the userinfo string for the client &#039;&#039;&#039;clientnum&#039;&#039;&#039;&lt;br /&gt;
et.trap_SetUserinfo( &#039;&#039;&#039;clientnum&#039;&#039;&#039;, &#039;&#039;&#039;userinfo&#039;&#039;&#039; )&lt;br /&gt;
:Sets the userinfo string for the client &#039;&#039;&#039;clientnum&#039;&#039;&#039; to &#039;&#039;&#039;userinfo&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===string utility functions===&lt;br /&gt;
&#039;&#039;&#039;infostring&#039;&#039;&#039; = et.Info_RemoveKey( &#039;&#039;&#039;infostring&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039; )&lt;br /&gt;
:Removes key &#039;&#039;&#039;key&#039;&#039;&#039; from infostring &#039;&#039;&#039;infostring&#039;&#039;&#039; and returns the modified infostring.&lt;br /&gt;
&#039;&#039;&#039;infostring&#039;&#039;&#039; = et.Info_SetValueForKey( &#039;&#039;&#039;infostring&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039;, &#039;&#039;&#039;value&#039;&#039;&#039; )&lt;br /&gt;
:Sets the key &#039;&#039;&#039;key&#039;&#039;&#039; in the infostring &#039;&#039;&#039;infostring&#039;&#039;&#039; to &#039;&#039;&#039;value&#039;&#039;&#039; and returns the modified infostring.&lt;br /&gt;
&#039;&#039;&#039;infostring&#039;&#039;&#039; = et.Info_ValueForKey( &#039;&#039;&#039;infostring&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039; )&lt;br /&gt;
:Returns the value of the key &#039;&#039;&#039;key&#039;&#039;&#039; in the infostring &#039;&#039;&#039;infostring&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;cleanstring&#039;&#039;&#039; = et.Q_CleanStr( &#039;&#039;&#039;string&#039;&#039;&#039; )&lt;br /&gt;
:Returns &#039;&#039;&#039;string&#039;&#039;&#039; stripped of all color codes&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ET filesystem===&lt;br /&gt;
&#039;&#039;&#039;fd&#039;&#039;&#039;, &#039;&#039;&#039;len&#039;&#039;&#039; = et.trap_FS_FOpenFile( &#039;&#039;&#039;filename&#039;&#039;&#039;, &#039;&#039;&#039;mode&#039;&#039;&#039; )&lt;br /&gt;
:Attempts to open the file &#039;&#039;&#039;filename&#039;&#039;&#039; with the access mode &#039;&#039;&#039;mode&#039;&#039;&#039; (see et.FS_ constants). Returns the filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039; and file length &#039;&#039;&#039;len&#039;&#039;&#039;. On error, &#039;&#039;&#039;len&#039;&#039;&#039; returns -1.&lt;br /&gt;
&#039;&#039;&#039;filedata&#039;&#039;&#039; = et.trap_FS_Read( fd, count )&lt;br /&gt;
:Reads &#039;&#039;&#039;count&#039;&#039;&#039; bytes from filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039;.&lt;br /&gt;
&#039;&#039;&#039;count&#039;&#039;&#039; = et.trap_FS_Write( &#039;&#039;&#039;filedata&#039;&#039;&#039;, &#039;&#039;&#039;count&#039;&#039;&#039;, &#039;&#039;&#039;fd&#039;&#039;&#039; )&lt;br /&gt;
:Attempts to write &#039;&#039;&#039;count&#039;&#039;&#039; bytes of &#039;&#039;&#039;filedata&#039;&#039;&#039; to filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039;. Returns number of bytes successfully written.&lt;br /&gt;
et.trap_FS_Rename( &#039;&#039;&#039;oldname&#039;&#039;&#039;, &#039;&#039;&#039;newname&#039;&#039;&#039; )&lt;br /&gt;
:Renames file &#039;&#039;&#039;oldname&#039;&#039;&#039; to &#039;&#039;&#039;newname&#039;&#039;&#039;.&lt;br /&gt;
et.trap_FS_FCloseFile( &#039;&#039;&#039;fd&#039;&#039;&#039; )&lt;br /&gt;
:Closes filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===indexes===&lt;br /&gt;
&#039;&#039;&#039;soundindex&#039;&#039;&#039; = et.G_SoundIndex( &#039;&#039;&#039;filename&#039;&#039;&#039; )&lt;br /&gt;
:Returns an index to the soundfile indicated by &#039;&#039;&#039;filename&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;modelindex&#039;&#039;&#039; = et.G_ModelIndex( &#039;&#039;&#039;filename&#039;&#039;&#039; )&lt;br /&gt;
:Returns an index to the model indicated by &#039;&#039;&#039;filename&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sound===&lt;br /&gt;
et.G_globalSound( &#039;&#039;&#039;sound&#039;&#039;&#039; )&lt;br /&gt;
:Plays the global sound indicated by the filename &#039;&#039;&#039;sound&#039;&#039;&#039;.&lt;br /&gt;
et.G_Sound( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;soundindex&#039;&#039;&#039; )&lt;br /&gt;
:Plays the sound &#039;&#039;&#039;soundindex&#039;&#039;&#039; at the location of entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===miscellaneous===&lt;br /&gt;
&#039;&#039;&#039;milliseconds&#039;&#039;&#039; = et.trap_Milliseconds()&lt;br /&gt;
:Returns a number indicating the current server time in milliseconds.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===entities===&lt;br /&gt;
&#039;&#039;&#039;entnum&#039;&#039;&#039; = et.G_Spawn()&lt;br /&gt;
:Spawns a new entity and returns the new entity number.&lt;br /&gt;
&#039;&#039;&#039;entnum&#039;&#039;&#039; = et.G_TempEntity( &#039;&#039;&#039;origin&#039;&#039;&#039;, &#039;&#039;&#039;event&#039;&#039;&#039; )&lt;br /&gt;
:Spawns a new TempEntity of event type &#039;&#039;&#039;event&#039;&#039;&#039; and places it at &#039;&#039;&#039;origin&#039;&#039;&#039; in the world.&lt;br /&gt;
et.G_FreeEntity( &#039;&#039;&#039;entnum&#039;&#039;&#039; )&lt;br /&gt;
:Frees the entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;spawnval&#039;&#039;&#039; = et.G_GetSpawnVar( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039; )&lt;br /&gt;
:Returns the value of spawnvar &#039;&#039;&#039;key&#039;&#039;&#039; for entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
et.G_SetSpawnVar( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039;, &#039;&#039;&#039;value&#039;&#039;&#039; )&lt;br /&gt;
:Sets the spawnvar &#039;&#039;&#039;key&#039;&#039;&#039; to &#039;&#039;&#039;value&#039;&#039;&#039; for entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;integer entnum&#039;&#039;&#039; = et.G_SpawnGEntityFromSpawnVars( string spawnvar, string spawnvalue, ... )&lt;br /&gt;
:This function can only be called inside the &#039;&#039;&#039;et_InitGame&#039;&#039;&#039; callback&lt;br /&gt;
et.trap_LinkEntity( &#039;&#039;&#039;entnum&#039;&#039;&#039; )&lt;br /&gt;
:Links the entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
et.trap_UnlinkEntity( &#039;&#039;&#039;entnum&#039;&#039;&#039; )&lt;br /&gt;
:Unlinks the entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;(variable)&#039;&#039;&#039; = et.gentity_get( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;fieldname&#039;&#039;&#039; )&lt;br /&gt;
:Gets the value of &#039;&#039;&#039;[[Fieldname]]&#039;&#039;&#039; from entity &#039;&#039;&#039;entnum&#039;&#039;&#039; out of the g_entity struct&amp;lt;br&amp;gt;&lt;br /&gt;
et.gentity_set( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;[[Fieldname]]&#039;&#039;&#039;, &#039;&#039;&#039;(variable)&#039;&#039;&#039; )&lt;br /&gt;
:Sets the value of &#039;&#039;&#039;[[Fieldname]]&#039;&#039;&#039; from entity &#039;&#039;&#039;entnum&#039;&#039;&#039; in the g_entity struct to &#039;&#039;&#039;(variable)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==callbacks==&lt;br /&gt;
&lt;br /&gt;
===qagame execution===&lt;br /&gt;
et_InitGame( &#039;&#039;&#039;levelTime&#039;&#039;&#039;, &#039;&#039;&#039;randomSeed&#039;&#039;&#039;, &#039;&#039;&#039;restart&#039;&#039;&#039; )&lt;br /&gt;
:Called when qagame initializes. &#039;&#039;&#039;levelTime&#039;&#039;&#039; is the current level time in milliseconds. &#039;&#039;&#039;randomSeed&#039;&#039;&#039; is a number that can be used to seed random number generators. &#039;&#039;&#039;restart&#039;&#039;&#039; indicates if et_InitGame() is being called due to a map restart (1) or not (0).&lt;br /&gt;
et_ShutdownGame( &#039;&#039;&#039;restart&#039;&#039;&#039; )&lt;br /&gt;
:Called when qagame shuts down. &#039;&#039;&#039;restart&#039;&#039;&#039; indicates if the shutdown is being called due to a map_restart (1) or not (0).&lt;br /&gt;
et_RunFrame( &#039;&#039;&#039;levelTime&#039;&#039;&#039; )&lt;br /&gt;
:Called when qagame runs a server frame. &#039;&#039;&#039;levelTime&#039;&#039;&#039; is the current level time in milliseconds.&lt;br /&gt;
et_Quit()&lt;br /&gt;
:Called when ETPro unloads the mod. The mod should close all open filedescriptors and perform all cleanup.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===client management===&lt;br /&gt;
&#039;&#039;&#039;rejectreason&#039;&#039;&#039; = et_ClientConnect( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;firstTime&#039;&#039;&#039;, &#039;&#039;&#039;isBot&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client attempts to connect to the server. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id, &#039;&#039;&#039;firstTime&#039;&#039;&#039; indicates if this is a new connection (1) or a reconnection (0). &#039;&#039;&#039;isBot&#039;&#039;&#039; indicates if the client is a bot (1) or not (0). If the mod accepts the connection, it should return nil. Otherwise, the mod should return a string describing the reason the client connection was rejected.&lt;br /&gt;
et_ClientDisconnect( &#039;&#039;&#039;clientNum&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client disconnects. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id.&lt;br /&gt;
et_ClientBegin( &#039;&#039;&#039;clientNum&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client begins (becomes active, and enters the gameworld). &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id.&lt;br /&gt;
et_ClientUserinfoChanged( &#039;&#039;&#039;clientNum&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client&#039;s Userinfo string has changed. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===commands===&lt;br /&gt;
&#039;&#039;&#039;intercepted&#039;&#039;&#039; = et_ClientCommand( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;command&#039;&#039;&#039; )&lt;br /&gt;
:Called when a command is received from a client. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id. &#039;&#039;&#039;command&#039;&#039;&#039; is the command. The mod should return 1 if the command was intercepted by the mod, and 0 if the command was ignored by the mod and should be passed through to the server (and other mods in the chain).&lt;br /&gt;
&#039;&#039;&#039;intercepted&#039;&#039;&#039; = et_ConsoleCommand()&lt;br /&gt;
:Called when a command is entered on the server console. The mod should return 1 if the command was intercepted by the mod, and 0 if the command was ignored by the mod and should be passed through to the server (and other mods in the chain).&lt;br /&gt;
&#039;&#039;&#039;intercepted&#039;&#039;&#039; = et_ClientSay( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;mode&#039;&#039;&#039;, &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client sends a chat command. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id. &#039;&#039;&#039;mode&#039;&#039;&#039; is the chat mode (see et.SAY_* constants). &#039;&#039;&#039;text&#039;&#039;&#039; is the chat text. The mod should return 1 if the command was intercepted by the mod, and 0 if the command was ignored by the mod and should be passed through to the server (and other mods in the chain)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===miscellaneous===&lt;br /&gt;
et_IPCReceive( &#039;&#039;&#039;vmnumber&#039;&#039;&#039;, &#039;&#039;&#039;message&#039;&#039;&#039; )&lt;br /&gt;
:Called when another mod sends an et.IPCSend() message to this mod. &#039;&#039;&#039;vmnumber&#039;&#039;&#039; is the VM slot number of the sender, and &#039;&#039;&#039;message&#039;&#039;&#039; is the message.&lt;br /&gt;
et_Print( &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Called whenever the server or qagame prints a string to the console.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==predefined constants==&lt;br /&gt;
et.EXEC_NOW&amp;lt;br&amp;gt;&lt;br /&gt;
et.EXEC_INSERT&amp;lt;br&amp;gt;&lt;br /&gt;
et.EXEC_APPEND&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_READ&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_WRITE&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_APPEND&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_APPEND_SYNC&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_ALL&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_TEAM&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_BUDDY&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_TEAMNL&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
et.HOSTARCH&lt;br /&gt;
:set to WIN32 or UNIX depending on the host architecture qagame is running on.&lt;br /&gt;
LUA_PATH&lt;br /&gt;
:set to fs_homepath/fs_game/?.lua in order to ease use of the [http://www.lua.org/pil/8.1.html require] function.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==configs==&lt;br /&gt;
If a config is loaded, all modules are shutdown and reloaded. If a &#039;&#039;certified&#039;&#039; config is loaded, all modules are shutdown and reloaded, and additionally the following functions are disabled: &#039;&#039;&#039;require()&#039;&#039;&#039;, &#039;&#039;&#039;loadfile()&#039;&#039;&#039;, &#039;&#039;&#039;loadlib()&#039;&#039;&#039;, &#039;&#039;&#039;loadstring()&#039;&#039;&#039;, &#039;&#039;&#039;dofile()&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==caveats==&lt;br /&gt;
Like qagame, lua modules are unloaded and reloaded on map_restart and map changes. This means that all global variables and other information is lost. Mods may choose to store persistent data in cvars or external files.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
&lt;br /&gt;
Q: OMG I hate the libary prefix et.* on everything!!11!1oneone&amp;lt;br&amp;gt;&lt;br /&gt;
A: table.foreach(et, function (func, value) _G[func] = value; end)&lt;br /&gt;
&lt;br /&gt;
Q: How do a re-load my lua file without restarting the whole server ?&amp;lt;br&amp;gt;&lt;br /&gt;
A: change maps or map_restart&lt;br /&gt;
&lt;br /&gt;
Q: Can I see some sample code?&amp;lt;br&amp;gt;&lt;br /&gt;
A: [[ETPro:Lua Sample Code]]&lt;br /&gt;
&lt;br /&gt;
Q: Is there a list of [[ETPro]] mods?&amp;lt;br&amp;gt;&lt;br /&gt;
A: Yes, [[:Category:ETPro:Mods|here]].&lt;br /&gt;
&lt;br /&gt;
Q: OMG my mod doesn&#039;t work!&amp;lt;br&amp;gt;&lt;br /&gt;
A: Make sure you added your mod&#039;s filename to the lua_modules cvar (e.g. set lua_modules mymod.lua).&lt;br /&gt;
&lt;br /&gt;
Q: I can&#039;t access ent-&amp;gt;client, how can I get a player&#039;s team?&amp;lt;br&amp;gt;&lt;br /&gt;
A: Parse the userinfo string.&lt;br /&gt;
&lt;br /&gt;
[[Category:ETPro]]&lt;br /&gt;
[[Category:ETPro:Mods]]&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Lua_Mod_API&amp;diff=1682</id>
		<title>Lua Mod API</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Lua_Mod_API&amp;diff=1682"/>
		<updated>2005-11-13T07:54:09Z</updated>

		<summary type="html">&lt;p&gt;Bani: link to Fieldname article&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOEDITSECTION__&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot; style=&amp;quot;background: #FFFFCC; padding: 2px; border: 2px solid #000000;&amp;quot;&amp;gt;The latest version of the lua-enabled ETPro qagame is etpro-lua-2 and can be downloaded [http://etpro.anime.net/etpro-lua-2.zip here].&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ETPro now supports serverside mods via the [http://www.lua.org/ lua] scripting language.&lt;br /&gt;
&lt;br /&gt;
ETPro has an embedded lua 5.0.2 interpreter, and if present will load user-defined scripts from the etpro directory. ETPro also provides an &amp;quot;et&amp;quot; library of function calls for lua to access the server engine, and provides callbacks so a serverside mod may trigger on specific server events.&lt;br /&gt;
&lt;br /&gt;
The following standard lua libraries are initialized by default and available to ETPro lua scripts:&lt;br /&gt;
[http://www.lua.org/manual/5.0/manual.html#5.1 basic], [http://www.lua.org/manual/5.0/manual.html#5.4 table], [http://www.lua.org/manual/5.0/manual.html#5.6 i/o], [http://www.lua.org/manual/5.0/manual.html#5.3 string], [http://www.lua.org/manual/5.0/manual.html#5.5 math].&lt;br /&gt;
&lt;br /&gt;
A list of [[ETPro]] mods can be found [[:Category:ETPro:Mods|here]].&lt;br /&gt;
&lt;br /&gt;
==server commands==&lt;br /&gt;
===lua_status===&lt;br /&gt;
:lists all currently loaded lua modules.&lt;br /&gt;
&lt;br /&gt;
==cvars==&lt;br /&gt;
===lua_modules===&lt;br /&gt;
:(default &amp;quot;&amp;quot;, disabled)&lt;br /&gt;
:space separated list of lua modules for ETPro to load. modules will be run in the order listed.&lt;br /&gt;
&lt;br /&gt;
===lua_allowedmodules===&lt;br /&gt;
:(default &amp;quot;&amp;quot;, disabled)&lt;br /&gt;
:if set, only lua modules with the matching sha1 signatures listed in this cvar will be allowed to load.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
changing either cvar will cause all currently loaded modules to quit and be unloaded until the next map_restart.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==et library calls==&lt;br /&gt;
&lt;br /&gt;
===modules===&lt;br /&gt;
et.RegisterModname( &#039;&#039;&#039;modname&#039;&#039;&#039; )&lt;br /&gt;
:Registers a descriptive string &#039;&#039;&#039;modname&#039;&#039;&#039; for this mod.&lt;br /&gt;
&#039;&#039;&#039;vmnumber&#039;&#039;&#039; = et.FindSelf()&lt;br /&gt;
:Returns a number indicating the VM slot the current mod is loaded into.&lt;br /&gt;
&#039;&#039;&#039;modname&#039;&#039;&#039;, &#039;&#039;&#039;signature&#039;&#039;&#039; = et.FindMod( &#039;&#039;&#039;vmnumber&#039;&#039;&#039; )&lt;br /&gt;
:Returns the &#039;&#039;&#039;modname&#039;&#039;&#039; and sha1 &#039;&#039;&#039;signature&#039;&#039;&#039; for the mod loaded in the VM slot &#039;&#039;&#039;vmnumber&#039;&#039;&#039;. Returns nil, nil if the VM slot is invalid.&lt;br /&gt;
&#039;&#039;&#039;success&#039;&#039;&#039; = et.IPCSend( &#039;&#039;&#039;vmnumber&#039;&#039;&#039;, &#039;&#039;&#039;message&#039;&#039;&#039; )&lt;br /&gt;
:Sends the string &#039;&#039;&#039;message&#039;&#039;&#039; to the mod in the VM slot indicated by &#039;&#039;&#039;vmnumber&#039;&#039;&#039;. The mod receiving &#039;&#039;&#039;message&#039;&#039;&#039; must have an &#039;&#039;et_IPCReceive()&#039;&#039; callback. If the message is successfully sent, &#039;&#039;&#039;success&#039;&#039;&#039; will be 1. On failure it will be 0.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===printing===&lt;br /&gt;
et.G_Print( &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Prints the string &#039;&#039;&#039;text&#039;&#039;&#039; to the server console.&lt;br /&gt;
et.G_LogPrint( &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Prints the string &#039;&#039;&#039;text&#039;&#039;&#039; to the server console and writes it to the server log.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===argument handling===&lt;br /&gt;
&#039;&#039;&#039;args&#039;&#039;&#039; = et.ConcatArgs( &#039;&#039;&#039;index&#039;&#039;&#039; )&lt;br /&gt;
:Returns all arguments beginning from &#039;&#039;&#039;index&#039;&#039;&#039; concatenated into a single string &#039;&#039;&#039;args&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;argcount&#039;&#039;&#039; = et.trap_Argc()&lt;br /&gt;
:Returns a number indicating the number of command line arguments in the command buffer.&lt;br /&gt;
&#039;&#039;&#039;arg&#039;&#039;&#039; = et.trap_Argv( &#039;&#039;&#039;argnum&#039;&#039;&#039; )&lt;br /&gt;
:Returns the contents of the command line argument &#039;&#039;&#039;argnum&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===cvars===&lt;br /&gt;
&#039;&#039;&#039;cvarvalue&#039;&#039;&#039; = et.trap_Cvar_Get( &#039;&#039;&#039;cvarname&#039;&#039;&#039; )&lt;br /&gt;
:Returns the value of the cvar &#039;&#039;&#039;cvarname&#039;&#039;&#039;&lt;br /&gt;
et.trap_Cvar_Set( &#039;&#039;&#039;cvarname&#039;&#039;&#039;, &#039;&#039;&#039;cvarvalue&#039;&#039;&#039; )&lt;br /&gt;
:Sets the cvar &#039;&#039;&#039;cvarname&#039;&#039;&#039; to &#039;&#039;&#039;cvarvalue&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===configstrings===&lt;br /&gt;
&#039;&#039;&#039;configstringvalue&#039;&#039;&#039; = et.trap_GetConfigstring( &#039;&#039;&#039;index&#039;&#039;&#039; )&lt;br /&gt;
:Returns the string &#039;&#039;&#039;configstringvalue&#039;&#039;&#039; containing the contents of the configstring &#039;&#039;&#039;index&#039;&#039;&#039;&lt;br /&gt;
et.trap_SetConfigstring( &#039;&#039;&#039;index&#039;&#039;&#039;, &#039;&#039;&#039;configstringvalue&#039;&#039;&#039; )&lt;br /&gt;
:Sets the configstring &#039;&#039;&#039;index&#039;&#039;&#039; to the string &#039;&#039;&#039;configstringvalue&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===server===&lt;br /&gt;
et.trap_SendConsoleCommand( &#039;&#039;&#039;when&#039;&#039;&#039;, &#039;&#039;&#039;command&#039;&#039;&#039; )&lt;br /&gt;
:Sends the command &#039;&#039;&#039;command&#039;&#039;&#039; to the server console, to be executed &#039;&#039;&#039;when&#039;&#039;&#039; (see et.EXEC_* constants)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===clients===&lt;br /&gt;
et.trap_DropClient( &#039;&#039;&#039;clientnum&#039;&#039;&#039;, &#039;&#039;&#039;reason&#039;&#039;&#039;, &#039;&#039;&#039;ban_time&#039;&#039;&#039; )&lt;br /&gt;
:Disconnects &#039;&#039;&#039;clientnum&#039;&#039;&#039; from the server, with descriptive string &#039;&#039;&#039;reason&#039;&#039;&#039; reported to clients. &#039;&#039;&#039;ban_time&#039;&#039;&#039; is the time in seconds to ban the client from the server. &#039;&#039;&#039;ban_time&#039;&#039;&#039; is optional and may be entirely omitted, in which case the ban time defaults to the cvar &#039;&#039;b_defaultbantime&#039;&#039;&lt;br /&gt;
et.trap_SendServerCommand( &#039;&#039;&#039;clientnum&#039;&#039;&#039;, &#039;&#039;&#039;command&#039;&#039;&#039; )&lt;br /&gt;
:Sends the command &#039;&#039;&#039;command&#039;&#039;&#039; to the client &#039;&#039;&#039;clientnum&#039;&#039;&#039;. If &#039;&#039;&#039;clientnum&#039;&#039;&#039; is -1, the &#039;&#039;&#039;command&#039;&#039;&#039; is broadcast to all connected clients.&lt;br /&gt;
et.G_Say( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;mode&#039;&#039;&#039;, &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Sends a chat command on behalf of client &#039;&#039;&#039;clientNum&#039;&#039;&#039; with the mode &#039;&#039;&#039;mode&#039;&#039;&#039; (see et.SAY_* constants) and chat text &#039;&#039;&#039;text&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===userinfo===&lt;br /&gt;
&#039;&#039;&#039;userinfo&#039;&#039;&#039; = et.trap_GetUserinfo( &#039;&#039;&#039;clientnum&#039;&#039;&#039; )&lt;br /&gt;
:Returns the contents of the userinfo string for the client &#039;&#039;&#039;clientnum&#039;&#039;&#039;&lt;br /&gt;
et.trap_SetUserinfo( &#039;&#039;&#039;clientnum&#039;&#039;&#039;, &#039;&#039;&#039;userinfo&#039;&#039;&#039; )&lt;br /&gt;
:Sets the userinfo string for the client &#039;&#039;&#039;clientnum&#039;&#039;&#039; to &#039;&#039;&#039;userinfo&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===string utility functions===&lt;br /&gt;
&#039;&#039;&#039;infostring&#039;&#039;&#039; = et.Info_RemoveKey( &#039;&#039;&#039;infostring&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039; )&lt;br /&gt;
:Removes key &#039;&#039;&#039;key&#039;&#039;&#039; from infostring &#039;&#039;&#039;infostring&#039;&#039;&#039; and returns the modified infostring.&lt;br /&gt;
&#039;&#039;&#039;infostring&#039;&#039;&#039; = et.Info_SetValueForKey( &#039;&#039;&#039;infostring&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039;, &#039;&#039;&#039;value&#039;&#039;&#039; )&lt;br /&gt;
:Sets the key &#039;&#039;&#039;key&#039;&#039;&#039; in the infostring &#039;&#039;&#039;infostring&#039;&#039;&#039; to &#039;&#039;&#039;value&#039;&#039;&#039; and returns the modified infostring.&lt;br /&gt;
&#039;&#039;&#039;infostring&#039;&#039;&#039; = et.Info_ValueForKey( &#039;&#039;&#039;infostring&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039; )&lt;br /&gt;
:Returns the value of the key &#039;&#039;&#039;key&#039;&#039;&#039; in the infostring &#039;&#039;&#039;infostring&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;cleanstring&#039;&#039;&#039; = et.Q_CleanStr( &#039;&#039;&#039;string&#039;&#039;&#039; )&lt;br /&gt;
:Returns &#039;&#039;&#039;string&#039;&#039;&#039; stripped of all color codes&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ET filesystem===&lt;br /&gt;
&#039;&#039;&#039;fd&#039;&#039;&#039;, &#039;&#039;&#039;len&#039;&#039;&#039; = et.trap_FS_FOpenFile( &#039;&#039;&#039;filename&#039;&#039;&#039;, &#039;&#039;&#039;mode&#039;&#039;&#039; )&lt;br /&gt;
:Attempts to open the file &#039;&#039;&#039;filename&#039;&#039;&#039; with the access mode &#039;&#039;&#039;mode&#039;&#039;&#039; (see et.FS_ constants). Returns the filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039; and file length &#039;&#039;&#039;len&#039;&#039;&#039;. On error, &#039;&#039;&#039;len&#039;&#039;&#039; returns -1.&lt;br /&gt;
&#039;&#039;&#039;filedata&#039;&#039;&#039; = et.trap_FS_Read( fd, count )&lt;br /&gt;
:Reads &#039;&#039;&#039;count&#039;&#039;&#039; bytes from filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039;.&lt;br /&gt;
&#039;&#039;&#039;count&#039;&#039;&#039; = et.trap_FS_Write( &#039;&#039;&#039;filedata&#039;&#039;&#039;, &#039;&#039;&#039;count&#039;&#039;&#039;, &#039;&#039;&#039;fd&#039;&#039;&#039; )&lt;br /&gt;
:Attempts to write &#039;&#039;&#039;count&#039;&#039;&#039; bytes of &#039;&#039;&#039;filedata&#039;&#039;&#039; to filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039;. Returns number of bytes successfully written.&lt;br /&gt;
et.trap_FS_Rename( &#039;&#039;&#039;oldname&#039;&#039;&#039;, &#039;&#039;&#039;newname&#039;&#039;&#039; )&lt;br /&gt;
:Renames file &#039;&#039;&#039;oldname&#039;&#039;&#039; to &#039;&#039;&#039;newname&#039;&#039;&#039;.&lt;br /&gt;
et.trap_FS_FCloseFile( &#039;&#039;&#039;fd&#039;&#039;&#039; )&lt;br /&gt;
:Closes filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===indexes===&lt;br /&gt;
&#039;&#039;&#039;soundindex&#039;&#039;&#039; = et.G_SoundIndex( &#039;&#039;&#039;filename&#039;&#039;&#039; )&lt;br /&gt;
:Returns an index to the soundfile indicated by &#039;&#039;&#039;filename&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;modelindex&#039;&#039;&#039; = et.G_ModelIndex( &#039;&#039;&#039;filename&#039;&#039;&#039; )&lt;br /&gt;
:Returns an index to the model indicated by &#039;&#039;&#039;filename&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sound===&lt;br /&gt;
et.G_globalSound( &#039;&#039;&#039;sound&#039;&#039;&#039; )&lt;br /&gt;
:Plays the global sound indicated by the filename &#039;&#039;&#039;sound&#039;&#039;&#039;.&lt;br /&gt;
et.G_Sound( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;soundindex&#039;&#039;&#039; )&lt;br /&gt;
:Plays the sound &#039;&#039;&#039;soundindex&#039;&#039;&#039; at the location of entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===miscellaneous===&lt;br /&gt;
&#039;&#039;&#039;milliseconds&#039;&#039;&#039; = et.trap_Milliseconds()&lt;br /&gt;
:Returns a number indicating the current server time in milliseconds.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===entities===&lt;br /&gt;
&#039;&#039;&#039;entnum&#039;&#039;&#039; = et.G_Spawn()&lt;br /&gt;
:Spawns a new entity and returns the new entity number.&lt;br /&gt;
&#039;&#039;&#039;entnum&#039;&#039;&#039; = et.G_TempEntity( &#039;&#039;&#039;origin&#039;&#039;&#039;, &#039;&#039;&#039;event&#039;&#039;&#039; )&lt;br /&gt;
:Spawns a new TempEntity of event type &#039;&#039;&#039;event&#039;&#039;&#039; and places it at &#039;&#039;&#039;origin&#039;&#039;&#039; in the world.&lt;br /&gt;
et.G_FreeEntity( &#039;&#039;&#039;entnum&#039;&#039;&#039; )&lt;br /&gt;
:Frees the entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;spawnval&#039;&#039;&#039; = et.G_GetSpawnVar( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039; )&lt;br /&gt;
:Returns the value of spawnvar &#039;&#039;&#039;key&#039;&#039;&#039; for entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
et.G_SetSpawnVar( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039;, &#039;&#039;&#039;value&#039;&#039;&#039; )&lt;br /&gt;
:Sets the spawnvar &#039;&#039;&#039;key&#039;&#039;&#039; to &#039;&#039;&#039;value&#039;&#039;&#039; for entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;integer entnum&#039;&#039;&#039; = et.G_SpawnGEntityFromSpawnVars( string spawnvar, string spawnvalue, ... )&lt;br /&gt;
:This function can only be called inside the &#039;&#039;&#039;et_InitGame&#039;&#039;&#039; callback&lt;br /&gt;
et.trap_LinkEntity( &#039;&#039;&#039;entnum&#039;&#039;&#039; )&lt;br /&gt;
:Links the entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
et.trap_UnlinkEntity( &#039;&#039;&#039;entnum&#039;&#039;&#039; )&lt;br /&gt;
:Unlinks the entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;(variable)&#039;&#039;&#039; = et.gentity_get( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;fieldname&#039;&#039;&#039; )&lt;br /&gt;
:Gets the value of &#039;&#039;&#039;[[Fieldname]]&#039;&#039;&#039; from entity &#039;&#039;&#039;entnum&#039;&#039;&#039; out of the g_entity struct&amp;lt;br&amp;gt;&lt;br /&gt;
et.gentity_set( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;[[Fieldname]]&#039;&#039;&#039;, &#039;&#039;&#039;(variable)&#039;&#039;&#039; )&lt;br /&gt;
:Sets the value of &#039;&#039;&#039;[[Fieldname]]&#039;&#039;&#039; from entity &#039;&#039;&#039;entnum&#039;&#039;&#039; in the g_entity struct to &#039;&#039;&#039;(variable)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==callbacks==&lt;br /&gt;
&lt;br /&gt;
===qagame execution===&lt;br /&gt;
et_InitGame( &#039;&#039;&#039;levelTime&#039;&#039;&#039;, &#039;&#039;&#039;randomSeed&#039;&#039;&#039;, &#039;&#039;&#039;restart&#039;&#039;&#039; )&lt;br /&gt;
:Called when qagame initializes. &#039;&#039;&#039;levelTime&#039;&#039;&#039; is the current level time in milliseconds. &#039;&#039;&#039;randomSeed&#039;&#039;&#039; is a number that can be used to seed random number generators. &#039;&#039;&#039;restart&#039;&#039;&#039; indicates if et_InitGame() is being called due to a map restart (1) or not (0).&lt;br /&gt;
et_ShutdownGame( &#039;&#039;&#039;restart&#039;&#039;&#039; )&lt;br /&gt;
:Called when qagame shuts down. &#039;&#039;&#039;restart&#039;&#039;&#039; indicates if the shutdown is being called due to a map_restart (1) or not (0).&lt;br /&gt;
et_RunFrame( &#039;&#039;&#039;levelTime&#039;&#039;&#039; )&lt;br /&gt;
:Called when qagame runs a server frame. &#039;&#039;&#039;levelTime&#039;&#039;&#039; is the current level time in milliseconds.&lt;br /&gt;
et_Quit()&lt;br /&gt;
:Called when ETPro unloads the mod. The mod should close all open filedescriptors and perform all cleanup.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===client management===&lt;br /&gt;
&#039;&#039;&#039;rejectreason&#039;&#039;&#039; = et_ClientConnect( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;firstTime&#039;&#039;&#039;, &#039;&#039;&#039;isBot&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client attempts to connect to the server. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id, &#039;&#039;&#039;firstTime&#039;&#039;&#039; indicates if this is a new connection (1) or a reconnection (0). &#039;&#039;&#039;isBot&#039;&#039;&#039; indicates if the client is a bot (1) or not (0). If the mod accepts the connection, it should return nil. Otherwise, the mod should return a string describing the reason the client connection was rejected.&lt;br /&gt;
et_ClientDisconnect( &#039;&#039;&#039;clientNum&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client disconnects. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id.&lt;br /&gt;
et_ClientBegin( &#039;&#039;&#039;clientNum&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client begins (becomes active, and enters the gameworld). &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id.&lt;br /&gt;
et_ClientUserinfoChanged( &#039;&#039;&#039;clientNum&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client&#039;s Userinfo string has changed. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===commands===&lt;br /&gt;
&#039;&#039;&#039;intercepted&#039;&#039;&#039; = et_ClientCommand( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;command&#039;&#039;&#039; )&lt;br /&gt;
:Called when a command is received from a client. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id. &#039;&#039;&#039;command&#039;&#039;&#039; is the command. The mod should return 1 if the command was intercepted by the mod, and 0 if the command was ignored by the mod and should be passed through to the server (and other mods in the chain).&lt;br /&gt;
&#039;&#039;&#039;intercepted&#039;&#039;&#039; = et_ConsoleCommand()&lt;br /&gt;
:Called when a command is entered on the server console. The mod should return 1 if the command was intercepted by the mod, and 0 if the command was ignored by the mod and should be passed through to the server (and other mods in the chain).&lt;br /&gt;
&#039;&#039;&#039;intercepted&#039;&#039;&#039; = et_ClientSay( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;mode&#039;&#039;&#039;, &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client sends a chat command. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id. &#039;&#039;&#039;mode&#039;&#039;&#039; is the chat mode (see et.SAY_* constants). &#039;&#039;&#039;text&#039;&#039;&#039; is the chat text. The mod should return 1 if the command was intercepted by the mod, and 0 if the command was ignored by the mod and should be passed through to the server (and other mods in the chain)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===miscellaneous===&lt;br /&gt;
et_IPCReceive( &#039;&#039;&#039;vmnumber&#039;&#039;&#039;, &#039;&#039;&#039;message&#039;&#039;&#039; )&lt;br /&gt;
:Called when another mod sends an et.IPCSend() message to this mod. &#039;&#039;&#039;vmnumber&#039;&#039;&#039; is the VM slot number of the sender, and &#039;&#039;&#039;message&#039;&#039;&#039; is the message.&lt;br /&gt;
et_Print( &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Called whenever the server or qagame prints a string to the console.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==predefined constants==&lt;br /&gt;
et.EXEC_NOW&amp;lt;br&amp;gt;&lt;br /&gt;
et.EXEC_INSERT&amp;lt;br&amp;gt;&lt;br /&gt;
et.EXEC_APPEND&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_READ&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_WRITE&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_APPEND&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_APPEND_SYNC&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_ALL&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_TEAM&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_BUDDY&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_TEAMNL&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
et.HOSTARCH&lt;br /&gt;
:set to WIN32 or UNIX depending on the host architecture qagame is running on.&lt;br /&gt;
LUA_PATH&lt;br /&gt;
:set to fs_homepath/fs_game/?.lua in order to ease use of the [http://www.lua.org/pil/8.1.html require] function.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==configs==&lt;br /&gt;
If a config is loaded, all modules are shutdown and reloaded. If a &#039;&#039;certified&#039;&#039; config is loaded, all modules are shutdown and reloaded, and additionally the following functions are disabled: &#039;&#039;&#039;require()&#039;&#039;&#039;, &#039;&#039;&#039;loadfile()&#039;&#039;&#039;, &#039;&#039;&#039;loadlib()&#039;&#039;&#039;, &#039;&#039;&#039;loadstring()&#039;&#039;&#039;, &#039;&#039;&#039;dofile()&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==caveats==&lt;br /&gt;
Like qagame, lua modules are unloaded and reloaded on map_restart and map changes. This means that all global variables and other information is lost. Mods may choose to store persistent data in cvars or external files.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
&lt;br /&gt;
Q: OMG I hate the libary prefix et.* on everything!!11!1oneone&amp;lt;br&amp;gt;&lt;br /&gt;
A: table.foreach(et, function (func, value) _G[func] = value; end)&lt;br /&gt;
&lt;br /&gt;
Q: How do a re-load my lua file without restarting the whole server ?&amp;lt;br&amp;gt;&lt;br /&gt;
A: change maps or map_restart&lt;br /&gt;
&lt;br /&gt;
Q: Can I see some sample code?&amp;lt;br&amp;gt;&lt;br /&gt;
A: [[ETPro:Lua Sample Code]]&lt;br /&gt;
&lt;br /&gt;
Q: Is there a list of [[ETPro]] mods?&amp;lt;br&amp;gt;&lt;br /&gt;
A: Yes, [[:Category:ETPro:Mods|here]].&lt;br /&gt;
&lt;br /&gt;
Q: OMG my mod doesn&#039;t work!&amp;lt;br&amp;gt;&lt;br /&gt;
A: Make sure you added your mod&#039;s filename to the lua_modules cvar (e.g. set lua_modules mymod.lua).&lt;br /&gt;
&lt;br /&gt;
Q: I can&#039;t access ent-&amp;gt;client, how can I get a player&#039;s team?&amp;lt;br&amp;gt;&lt;br /&gt;
A: Parse the userinfo string.&lt;br /&gt;
&lt;br /&gt;
[[Category:ETPro]]&lt;br /&gt;
[[Category:ETPro:Mods]]&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Fieldname&amp;diff=1681</id>
		<title>Fieldname</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Fieldname&amp;diff=1681"/>
		<updated>2005-11-13T07:51:39Z</updated>

		<summary type="html">&lt;p&gt;Bani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;List of fields supported by et.gentity_get() and et.gentity_set()&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=2&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;field&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;type&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;access&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;inuse&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;boolean&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;classname&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;origin&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;vec3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;spawnflags&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;flags&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;model&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;model2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;nextTrain&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;entity&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;prevTrain&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;entity&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;message&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;target&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;targetname&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;speed&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;float&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;closespeed&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;float&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;health&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;takedamage&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;boolean&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;damage&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;splashDamage&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;splashRadius&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;methodOfDeath&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;splashMethodOfDeath&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;count&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;chain&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;entity&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;enemy&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;entity&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;activator&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;entity&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;teamchain&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;entity&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;teammaster&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;entity&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;deathType&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;watertype&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;waterlevel&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;noise_index&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;wait&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;float&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;random&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;float&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;radius&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;delay&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;float&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;TargetFlag&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;duration&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;float&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;rotate&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;vec3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;TargetAngles&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;vec3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;item&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;dl_color&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;vec3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;dl_stylestring&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;dl_shader&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;dl_atten&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;key&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;harc&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;float&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;varc&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;float&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;props_frame_state&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;missionLevel&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;start_size&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;end_size&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;isProp&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;boolean&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;mg42BaseEnt&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;spawnitem&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;count2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;track&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;scriptName&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;tagName&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;string&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;tagParent&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;entity&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;tankLink&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;entity&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;s.number&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;s.eFlags&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;s.pos&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;trajectory&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;s.apos&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;trajectory&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;s.time&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;s.time2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;s.groundEntityNum&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;s.constantLight&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;s.dl_intensity&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;s.loopSound&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;s.clientNum&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;s.frame&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;s.solid&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;s.powerups&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;s.weapon&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;s.density&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;s.dmgFlags&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;s.onFireStart&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;s.onFireEnd&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;s.teamNum&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;s.effect1Time&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;s.effect2Time&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;s.effect3Time&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;s.modelindex&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;s.modelindex2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;s.angles&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;vec3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;s.angles2&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;vec3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;r.linked&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;boolean&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;r.linkcount&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;r.svFlags&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;r.singleClient&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;r.bmodel&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;boolean&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;r.mins&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;vec3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;r.maxs&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;vec3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;r.contents&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;r.absmin&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;vec3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;r.absmax&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;vec3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;r.currentOrigin&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;vec3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;r.currentAngles&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;vec3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;r.ownerNum&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;r.eventTime&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RW&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;r.worldflags&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;sess.muted&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;sess.damage_given&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;sess.damage_received&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;sess.deaths&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;sess.game_points&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;sess.kills&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;sess.referee&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;sess.rounds&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;sess.spec_invite&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;sess.spec_team&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;sess.suicides&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;sess.team_damage&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;sess.team_received&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;sess.team_kills&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;sess.gibs&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;sess.semiadmin&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;RO&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Lua_Mod_API&amp;diff=1648</id>
		<title>Lua Mod API</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Lua_Mod_API&amp;diff=1648"/>
		<updated>2005-11-09T08:49:44Z</updated>

		<summary type="html">&lt;p&gt;Bani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOEDITSECTION__&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot; style=&amp;quot;background: #FFFFCC; padding: 2px; border: 2px solid #000000;&amp;quot;&amp;gt;The latest version of the lua-enabled ETPro qagame is etpro-lua-2 and can be downloaded [http://etpro.anime.net/etpro-lua-2.zip here].&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ETPro now supports serverside mods via the [http://www.lua.org/ lua] scripting language.&lt;br /&gt;
&lt;br /&gt;
ETPro has an embedded lua 5.0.2 interpreter, and if present will load user-defined scripts from the etpro directory. ETPro also provides an &amp;quot;et&amp;quot; library of function calls for lua to access the server engine, and provides callbacks so a serverside mod may trigger on specific server events.&lt;br /&gt;
&lt;br /&gt;
The following standard lua libraries are initialized by default and available to ETPro lua scripts:&lt;br /&gt;
[http://www.lua.org/manual/5.0/manual.html#5.1 basic], [http://www.lua.org/manual/5.0/manual.html#5.4 table], [http://www.lua.org/manual/5.0/manual.html#5.6 i/o], [http://www.lua.org/manual/5.0/manual.html#5.3 string], [http://www.lua.org/manual/5.0/manual.html#5.5 math].&lt;br /&gt;
&lt;br /&gt;
A list of [[ETPro]] mods can be found [[:Category:ETPro:Mods|here]].&lt;br /&gt;
&lt;br /&gt;
==server commands==&lt;br /&gt;
===lua_status===&lt;br /&gt;
:lists all currently loaded lua modules.&lt;br /&gt;
&lt;br /&gt;
==cvars==&lt;br /&gt;
===lua_modules===&lt;br /&gt;
:(default &amp;quot;&amp;quot;, disabled)&lt;br /&gt;
:space separated list of lua modules for ETPro to load. modules will be run in the order listed.&lt;br /&gt;
&lt;br /&gt;
===lua_allowedmodules===&lt;br /&gt;
:(default &amp;quot;&amp;quot;, disabled)&lt;br /&gt;
:if set, only lua modules with the matching sha1 signatures listed in this cvar will be allowed to load.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
changing either cvar will cause all currently loaded modules to quit and be unloaded until the next map_restart.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==et library calls==&lt;br /&gt;
&lt;br /&gt;
===modules===&lt;br /&gt;
et.RegisterModname( &#039;&#039;&#039;modname&#039;&#039;&#039; )&lt;br /&gt;
:Registers a descriptive string &#039;&#039;&#039;modname&#039;&#039;&#039; for this mod.&lt;br /&gt;
&#039;&#039;&#039;vmnumber&#039;&#039;&#039; = et.FindSelf()&lt;br /&gt;
:Returns a number indicating the VM slot the current mod is loaded into.&lt;br /&gt;
&#039;&#039;&#039;modname&#039;&#039;&#039;, &#039;&#039;&#039;signature&#039;&#039;&#039; = et.FindMod( &#039;&#039;&#039;vmnumber&#039;&#039;&#039; )&lt;br /&gt;
:Returns the &#039;&#039;&#039;modname&#039;&#039;&#039; and sha1 &#039;&#039;&#039;signature&#039;&#039;&#039; for the mod loaded in the VM slot &#039;&#039;&#039;vmnumber&#039;&#039;&#039;. Returns nil, nil if the VM slot is invalid.&lt;br /&gt;
&#039;&#039;&#039;success&#039;&#039;&#039; = et.IPCSend( &#039;&#039;&#039;vmnumber&#039;&#039;&#039;, &#039;&#039;&#039;message&#039;&#039;&#039; )&lt;br /&gt;
:Sends the string &#039;&#039;&#039;message&#039;&#039;&#039; to the mod in the VM slot indicated by &#039;&#039;&#039;vmnumber&#039;&#039;&#039;. The mod receiving &#039;&#039;&#039;message&#039;&#039;&#039; must have an &#039;&#039;et_IPCReceive()&#039;&#039; callback. If the message is successfully sent, &#039;&#039;&#039;success&#039;&#039;&#039; will be 1. On failure it will be 0.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===printing===&lt;br /&gt;
et.G_Print( &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Prints the string &#039;&#039;&#039;text&#039;&#039;&#039; to the server console.&lt;br /&gt;
et.G_LogPrint( &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Prints the string &#039;&#039;&#039;text&#039;&#039;&#039; to the server console and writes it to the server log.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===argument handling===&lt;br /&gt;
&#039;&#039;&#039;args&#039;&#039;&#039; = et.ConcatArgs( &#039;&#039;&#039;index&#039;&#039;&#039; )&lt;br /&gt;
:Returns all arguments beginning from &#039;&#039;&#039;index&#039;&#039;&#039; concatenated into a single string &#039;&#039;&#039;args&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;argcount&#039;&#039;&#039; = et.trap_Argc()&lt;br /&gt;
:Returns a number indicating the number of command line arguments in the command buffer.&lt;br /&gt;
&#039;&#039;&#039;arg&#039;&#039;&#039; = et.trap_Argv( &#039;&#039;&#039;argnum&#039;&#039;&#039; )&lt;br /&gt;
:Returns the contents of the command line argument &#039;&#039;&#039;argnum&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===cvars===&lt;br /&gt;
&#039;&#039;&#039;cvarvalue&#039;&#039;&#039; = et.trap_Cvar_Get( &#039;&#039;&#039;cvarname&#039;&#039;&#039; )&lt;br /&gt;
:Returns the value of the cvar &#039;&#039;&#039;cvarname&#039;&#039;&#039;&lt;br /&gt;
et.trap_Cvar_Set( &#039;&#039;&#039;cvarname&#039;&#039;&#039;, &#039;&#039;&#039;cvarvalue&#039;&#039;&#039; )&lt;br /&gt;
:Sets the cvar &#039;&#039;&#039;cvarname&#039;&#039;&#039; to &#039;&#039;&#039;cvarvalue&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===configstrings===&lt;br /&gt;
&#039;&#039;&#039;configstringvalue&#039;&#039;&#039; = et.trap_GetConfigstring( &#039;&#039;&#039;index&#039;&#039;&#039; )&lt;br /&gt;
:Returns the string &#039;&#039;&#039;configstringvalue&#039;&#039;&#039; containing the contents of the configstring &#039;&#039;&#039;index&#039;&#039;&#039;&lt;br /&gt;
et.trap_SetConfigstring( &#039;&#039;&#039;index&#039;&#039;&#039;, &#039;&#039;&#039;configstringvalue&#039;&#039;&#039; )&lt;br /&gt;
:Sets the configstring &#039;&#039;&#039;index&#039;&#039;&#039; to the string &#039;&#039;&#039;configstringvalue&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===server===&lt;br /&gt;
et.trap_SendConsoleCommand( &#039;&#039;&#039;when&#039;&#039;&#039;, &#039;&#039;&#039;command&#039;&#039;&#039; )&lt;br /&gt;
:Sends the command &#039;&#039;&#039;command&#039;&#039;&#039; to the server console, to be executed &#039;&#039;&#039;when&#039;&#039;&#039; (see et.EXEC_* constants)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===clients===&lt;br /&gt;
et.trap_DropClient( &#039;&#039;&#039;clientnum&#039;&#039;&#039;, &#039;&#039;&#039;reason&#039;&#039;&#039;, &#039;&#039;&#039;ban_time&#039;&#039;&#039; )&lt;br /&gt;
:Disconnects &#039;&#039;&#039;clientnum&#039;&#039;&#039; from the server, with descriptive string &#039;&#039;&#039;reason&#039;&#039;&#039; reported to clients. &#039;&#039;&#039;ban_time&#039;&#039;&#039; is the time in seconds to ban the client from the server. &#039;&#039;&#039;ban_time&#039;&#039;&#039; is optional and may be entirely omitted, in which case the ban time defaults to the cvar &#039;&#039;b_defaultbantime&#039;&#039;&lt;br /&gt;
et.trap_SendServerCommand( &#039;&#039;&#039;clientnum&#039;&#039;&#039;, &#039;&#039;&#039;command&#039;&#039;&#039; )&lt;br /&gt;
:Sends the command &#039;&#039;&#039;command&#039;&#039;&#039; to the client &#039;&#039;&#039;clientnum&#039;&#039;&#039;. If &#039;&#039;&#039;clientnum&#039;&#039;&#039; is -1, the &#039;&#039;&#039;command&#039;&#039;&#039; is broadcast to all connected clients.&lt;br /&gt;
et.G_Say( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;mode&#039;&#039;&#039;, &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Sends a chat command on behalf of client &#039;&#039;&#039;clientNum&#039;&#039;&#039; with the mode &#039;&#039;&#039;mode&#039;&#039;&#039; (see et.SAY_* constants) and chat text &#039;&#039;&#039;text&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===userinfo===&lt;br /&gt;
&#039;&#039;&#039;userinfo&#039;&#039;&#039; = et.trap_GetUserinfo( &#039;&#039;&#039;clientnum&#039;&#039;&#039; )&lt;br /&gt;
:Returns the contents of the userinfo string for the client &#039;&#039;&#039;clientnum&#039;&#039;&#039;&lt;br /&gt;
et.trap_SetUserinfo( &#039;&#039;&#039;clientnum&#039;&#039;&#039;, &#039;&#039;&#039;userinfo&#039;&#039;&#039; )&lt;br /&gt;
:Sets the userinfo string for the client &#039;&#039;&#039;clientnum&#039;&#039;&#039; to &#039;&#039;&#039;userinfo&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===string utility functions===&lt;br /&gt;
&#039;&#039;&#039;infostring&#039;&#039;&#039; = et.Info_RemoveKey( &#039;&#039;&#039;infostring&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039; )&lt;br /&gt;
:Removes key &#039;&#039;&#039;key&#039;&#039;&#039; from infostring &#039;&#039;&#039;infostring&#039;&#039;&#039; and returns the modified infostring.&lt;br /&gt;
&#039;&#039;&#039;infostring&#039;&#039;&#039; = et.Info_SetValueForKey( &#039;&#039;&#039;infostring&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039;, &#039;&#039;&#039;value&#039;&#039;&#039; )&lt;br /&gt;
:Sets the key &#039;&#039;&#039;key&#039;&#039;&#039; in the infostring &#039;&#039;&#039;infostring&#039;&#039;&#039; to &#039;&#039;&#039;value&#039;&#039;&#039; and returns the modified infostring.&lt;br /&gt;
&#039;&#039;&#039;infostring&#039;&#039;&#039; = et.Info_ValueForKey( &#039;&#039;&#039;infostring&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039; )&lt;br /&gt;
:Returns the value of the key &#039;&#039;&#039;key&#039;&#039;&#039; in the infostring &#039;&#039;&#039;infostring&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;cleanstring&#039;&#039;&#039; = et.Q_CleanStr( &#039;&#039;&#039;string&#039;&#039;&#039; )&lt;br /&gt;
:Returns &#039;&#039;&#039;string&#039;&#039;&#039; stripped of all color codes&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ET filesystem===&lt;br /&gt;
&#039;&#039;&#039;fd&#039;&#039;&#039;, &#039;&#039;&#039;len&#039;&#039;&#039; = et.trap_FS_FOpenFile( &#039;&#039;&#039;filename&#039;&#039;&#039;, &#039;&#039;&#039;mode&#039;&#039;&#039; )&lt;br /&gt;
:Attempts to open the file &#039;&#039;&#039;filename&#039;&#039;&#039; with the access mode &#039;&#039;&#039;mode&#039;&#039;&#039; (see et.FS_ constants). Returns the filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039; and file length &#039;&#039;&#039;len&#039;&#039;&#039;. On error, &#039;&#039;&#039;len&#039;&#039;&#039; returns -1.&lt;br /&gt;
&#039;&#039;&#039;filedata&#039;&#039;&#039; = et.trap_FS_Read( fd, count )&lt;br /&gt;
:Reads &#039;&#039;&#039;count&#039;&#039;&#039; bytes from filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039;.&lt;br /&gt;
&#039;&#039;&#039;count&#039;&#039;&#039; = et.trap_FS_Write( &#039;&#039;&#039;filedata&#039;&#039;&#039;, &#039;&#039;&#039;count&#039;&#039;&#039;, &#039;&#039;&#039;fd&#039;&#039;&#039; )&lt;br /&gt;
:Attempts to write &#039;&#039;&#039;count&#039;&#039;&#039; bytes of &#039;&#039;&#039;filedata&#039;&#039;&#039; to filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039;. Returns number of bytes successfully written.&lt;br /&gt;
et.trap_FS_Rename( &#039;&#039;&#039;oldname&#039;&#039;&#039;, &#039;&#039;&#039;newname&#039;&#039;&#039; )&lt;br /&gt;
:Renames file &#039;&#039;&#039;oldname&#039;&#039;&#039; to &#039;&#039;&#039;newname&#039;&#039;&#039;.&lt;br /&gt;
et.trap_FS_FCloseFile( &#039;&#039;&#039;fd&#039;&#039;&#039; )&lt;br /&gt;
:Closes filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===indexes===&lt;br /&gt;
&#039;&#039;&#039;soundindex&#039;&#039;&#039; = et.G_SoundIndex( &#039;&#039;&#039;filename&#039;&#039;&#039; )&lt;br /&gt;
:Returns an index to the soundfile indicated by &#039;&#039;&#039;filename&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;modelindex&#039;&#039;&#039; = et.G_ModelIndex( &#039;&#039;&#039;filename&#039;&#039;&#039; )&lt;br /&gt;
:Returns an index to the model indicated by &#039;&#039;&#039;filename&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sound===&lt;br /&gt;
et.G_globalSound( &#039;&#039;&#039;sound&#039;&#039;&#039; )&lt;br /&gt;
:Plays the global sound indicated by the filename &#039;&#039;&#039;sound&#039;&#039;&#039;.&lt;br /&gt;
et.G_Sound( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;soundindex&#039;&#039;&#039; )&lt;br /&gt;
:Plays the sound &#039;&#039;&#039;soundindex&#039;&#039;&#039; at the location of entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===miscellaneous===&lt;br /&gt;
&#039;&#039;&#039;milliseconds&#039;&#039;&#039; = et.trap_Milliseconds()&lt;br /&gt;
:Returns a number indicating the current server time in milliseconds.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===entities===&lt;br /&gt;
&#039;&#039;&#039;entnum&#039;&#039;&#039; = et.G_Spawn()&lt;br /&gt;
:Spawns a new entity and returns the new entity number.&lt;br /&gt;
&#039;&#039;&#039;entnum&#039;&#039;&#039; = et.G_TempEntity( &#039;&#039;&#039;origin&#039;&#039;&#039;, &#039;&#039;&#039;event&#039;&#039;&#039; )&lt;br /&gt;
:Spawns a new TempEntity of event type &#039;&#039;&#039;event&#039;&#039;&#039; and places it at &#039;&#039;&#039;origin&#039;&#039;&#039; in the world.&lt;br /&gt;
et.G_FreeEntity( &#039;&#039;&#039;entnum&#039;&#039;&#039; )&lt;br /&gt;
:Frees the entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;spawnval&#039;&#039;&#039; = et.G_GetSpawnVar( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039; )&lt;br /&gt;
:Returns the value of spawnvar &#039;&#039;&#039;key&#039;&#039;&#039; for entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
et.G_SetSpawnVar( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039;, &#039;&#039;&#039;value&#039;&#039;&#039; )&lt;br /&gt;
:Sets the spawnvar &#039;&#039;&#039;key&#039;&#039;&#039; to &#039;&#039;&#039;value&#039;&#039;&#039; for entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
integer entnum = et.G_SpawnGEntityFromSpawnVars( string spawnvar, string spawnvalue, ... )&amp;lt;br&amp;gt;&lt;br /&gt;
et.trap_LinkEntity( &#039;&#039;&#039;entnum&#039;&#039;&#039; )&lt;br /&gt;
:Links the entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
et.trap_UnlinkEntity( &#039;&#039;&#039;entnum&#039;&#039;&#039; )&lt;br /&gt;
:Unlinks the entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
(variable) = et.gentity_get( int entnum, string fieldname )&amp;lt;br&amp;gt;&lt;br /&gt;
et.gentity_set( int entnum, string fieldname, (variable) )&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==callbacks==&lt;br /&gt;
&lt;br /&gt;
===qagame execution===&lt;br /&gt;
et_InitGame( &#039;&#039;&#039;levelTime&#039;&#039;&#039;, &#039;&#039;&#039;randomSeed&#039;&#039;&#039;, &#039;&#039;&#039;restart&#039;&#039;&#039; )&lt;br /&gt;
:Called when qagame initializes. &#039;&#039;&#039;levelTime&#039;&#039;&#039; is the current level time in milliseconds. &#039;&#039;&#039;randomSeed&#039;&#039;&#039; is a number that can be used to seed random number generators. &#039;&#039;&#039;restart&#039;&#039;&#039; indicates if et_InitGame() is being called due to a map restart (1) or not (0).&lt;br /&gt;
et_ShutdownGame( &#039;&#039;&#039;restart&#039;&#039;&#039; )&lt;br /&gt;
:Called when qagame shuts down. &#039;&#039;&#039;restart&#039;&#039;&#039; indicates if the shutdown is being called due to a map_restart (1) or not (0).&lt;br /&gt;
et_RunFrame( &#039;&#039;&#039;levelTime&#039;&#039;&#039; )&lt;br /&gt;
:Called when qagame runs a server frame. &#039;&#039;&#039;levelTime&#039;&#039;&#039; is the current level time in milliseconds.&lt;br /&gt;
et_Quit()&lt;br /&gt;
:Called when ETPro unloads the mod. The mod should close all open filedescriptors and perform all cleanup.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===client management===&lt;br /&gt;
&#039;&#039;&#039;rejectreason&#039;&#039;&#039; = et_ClientConnect( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;firstTime&#039;&#039;&#039;, &#039;&#039;&#039;isBot&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client attempts to connect to the server. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id, &#039;&#039;&#039;firstTime&#039;&#039;&#039; indicates if this is a new connection (1) or a reconnection (0). &#039;&#039;&#039;isBot&#039;&#039;&#039; indicates if the client is a bot (1) or not (0). If the mod accepts the connection, it should return nil. Otherwise, the mod should return a string describing the reason the client connection was rejected.&lt;br /&gt;
et_ClientDisconnect( &#039;&#039;&#039;clientNum&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client disconnects. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id.&lt;br /&gt;
et_ClientBegin( &#039;&#039;&#039;clientNum&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client begins (becomes active, and enters the gameworld). &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id.&lt;br /&gt;
et_ClientUserinfoChanged( &#039;&#039;&#039;clientNum&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client&#039;s Userinfo string has changed. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===commands===&lt;br /&gt;
&#039;&#039;&#039;intercepted&#039;&#039;&#039; = et_ClientCommand( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;command&#039;&#039;&#039; )&lt;br /&gt;
:Called when a command is received from a client. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id. &#039;&#039;&#039;command&#039;&#039;&#039; is the command. The mod should return 1 if the command was intercepted by the mod, and 0 if the command was ignored by the mod and should be passed through to the server (and other mods in the chain).&lt;br /&gt;
&#039;&#039;&#039;intercepted&#039;&#039;&#039; = et_ConsoleCommand()&lt;br /&gt;
:Called when a command is entered on the server console. The mod should return 1 if the command was intercepted by the mod, and 0 if the command was ignored by the mod and should be passed through to the server (and other mods in the chain).&lt;br /&gt;
&#039;&#039;&#039;intercepted&#039;&#039;&#039; = et_ClientSay( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;mode&#039;&#039;&#039;, &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client sends a chat command. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id. &#039;&#039;&#039;mode&#039;&#039;&#039; is the chat mode (see et.SAY_* constants). &#039;&#039;&#039;text&#039;&#039;&#039; is the chat text. The mod should return 1 if the command was intercepted by the mod, and 0 if the command was ignored by the mod and should be passed through to the server (and other mods in the chain)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===miscellaneous===&lt;br /&gt;
et_IPCReceive( &#039;&#039;&#039;vmnumber&#039;&#039;&#039;, &#039;&#039;&#039;message&#039;&#039;&#039; )&lt;br /&gt;
:Called when another mod sends an et.IPCSend() message to this mod. &#039;&#039;&#039;vmnumber&#039;&#039;&#039; is the VM slot number of the sender, and &#039;&#039;&#039;message&#039;&#039;&#039; is the message.&lt;br /&gt;
et_Print( &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Called whenever the server or qagame prints a string to the console.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==predefined constants==&lt;br /&gt;
et.EXEC_NOW&amp;lt;br&amp;gt;&lt;br /&gt;
et.EXEC_INSERT&amp;lt;br&amp;gt;&lt;br /&gt;
et.EXEC_APPEND&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_READ&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_WRITE&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_APPEND&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_APPEND_SYNC&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_ALL&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_TEAM&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_BUDDY&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_TEAMNL&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
et.HOSTARCH&lt;br /&gt;
:set to WIN32 or UNIX depending on the host architecture qagame is running on.&lt;br /&gt;
LUA_PATH&lt;br /&gt;
:set to fs_homepath/fs_game/?.lua in order to ease use of the [http://www.lua.org/pil/8.1.html require] function.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==configs==&lt;br /&gt;
If a config is loaded, all modules are shutdown and reloaded. If a &#039;&#039;certified&#039;&#039; config is loaded, all modules are shutdown and reloaded, and additionally the following functions are disabled: &#039;&#039;&#039;require()&#039;&#039;&#039;, &#039;&#039;&#039;loadfile()&#039;&#039;&#039;, &#039;&#039;&#039;loadlib()&#039;&#039;&#039;, &#039;&#039;&#039;loadstring()&#039;&#039;&#039;, &#039;&#039;&#039;dofile()&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==caveats==&lt;br /&gt;
Like qagame, lua modules are unloaded and reloaded on map_restart and map changes. This means that all global variables and other information is lost. Mods may choose to store persistent data in cvars or external files.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
&lt;br /&gt;
Q: OMG I hate the libary prefix et.* on everything!!11!1oneone&amp;lt;br&amp;gt;&lt;br /&gt;
A: table.foreach(et, function (func, value) _G[func] = value; end)&lt;br /&gt;
&lt;br /&gt;
Q: How do a re-load my lua file without restarting the whole server ?&amp;lt;br&amp;gt;&lt;br /&gt;
A: Use the following in the server console:&lt;br /&gt;
 lua_modules &amp;quot;&amp;quot;&lt;br /&gt;
 lua_modules &amp;quot;mymod.lua&amp;quot; ; map_restart&lt;br /&gt;
Note that lua_modules &amp;quot;&amp;quot; must be on a line by itself.&lt;br /&gt;
&lt;br /&gt;
Q: Can I see some sample code?&amp;lt;br&amp;gt;&lt;br /&gt;
A: [[ETPro:Lua Sample Code]]&lt;br /&gt;
&lt;br /&gt;
Q: Is there a list of [[ETPro]] mods?&amp;lt;br&amp;gt;&lt;br /&gt;
A: Yes, [[:Category:ETPro:Mods|here]].&lt;br /&gt;
&lt;br /&gt;
[[Category:ETPro]]&lt;br /&gt;
[[Category:ETPro:Mods]]&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Lua_Mod_API&amp;diff=1647</id>
		<title>Lua Mod API</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Lua_Mod_API&amp;diff=1647"/>
		<updated>2005-11-09T08:46:12Z</updated>

		<summary type="html">&lt;p&gt;Bani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOEDITSECTION__&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot; style=&amp;quot;background: #FFFFCC; padding: 2px; border: 2px solid #000000;&amp;quot;&amp;gt;The latest version of the lua-enabled ETPro qagame is etpro-lua-2 and can be downloaded [http://etpro.anime.net/etpro-lua-2.zip here].&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ETPro now supports serverside mods via the [http://www.lua.org/ lua] scripting language.&lt;br /&gt;
&lt;br /&gt;
ETPro has an embedded lua 5.0.2 interpreter, and if present will load user-defined scripts from the etpro directory. ETPro also provides an &amp;quot;et&amp;quot; library of function calls for lua to access the server engine, and provides callbacks so a serverside mod may trigger on specific server events.&lt;br /&gt;
&lt;br /&gt;
The following standard lua libraries are initialized by default and available to ETPro lua scripts:&lt;br /&gt;
[http://www.lua.org/manual/5.0/manual.html#5.1 basic], [http://www.lua.org/manual/5.0/manual.html#5.4 table], [http://www.lua.org/manual/5.0/manual.html#5.6 i/o], [http://www.lua.org/manual/5.0/manual.html#5.3 string], [http://www.lua.org/manual/5.0/manual.html#5.5 math].&lt;br /&gt;
&lt;br /&gt;
A list of [[ETPro]] mods can be found [[:Category:ETPro:Mods|here]].&lt;br /&gt;
&lt;br /&gt;
==server commands==&lt;br /&gt;
===lua_status===&lt;br /&gt;
:lists all currently loaded lua modules.&lt;br /&gt;
&lt;br /&gt;
==cvars==&lt;br /&gt;
===lua_modules===&lt;br /&gt;
:(default &amp;quot;&amp;quot;, disabled)&lt;br /&gt;
:space separated list of lua modules for ETPro to load. modules will be run in the order listed.&lt;br /&gt;
&lt;br /&gt;
===lua_allowedmodules===&lt;br /&gt;
:(default &amp;quot;&amp;quot;, disabled)&lt;br /&gt;
:if set, only lua modules with the matching sha1 signatures listed in this cvar will be allowed to load.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
changing either cvar will cause all currently loaded modules to quit and be unloaded until the next map_restart.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==et library calls==&lt;br /&gt;
&lt;br /&gt;
===modules===&lt;br /&gt;
et.RegisterModname( &#039;&#039;&#039;modname&#039;&#039;&#039; )&lt;br /&gt;
:Registers a descriptive string &#039;&#039;&#039;modname&#039;&#039;&#039; for this mod.&lt;br /&gt;
&#039;&#039;&#039;vmnumber&#039;&#039;&#039; = et.FindSelf()&lt;br /&gt;
:Returns a number indicating the VM slot the current mod is loaded into.&lt;br /&gt;
&#039;&#039;&#039;modname&#039;&#039;&#039;, &#039;&#039;&#039;signature&#039;&#039;&#039; = et.FindMod( &#039;&#039;&#039;vmnumber&#039;&#039;&#039; )&lt;br /&gt;
:Returns the &#039;&#039;&#039;modname&#039;&#039;&#039; and sha1 &#039;&#039;&#039;signature&#039;&#039;&#039; for the mod loaded in the VM slot &#039;&#039;&#039;vmnumber&#039;&#039;&#039;. Returns nil, nil if the VM slot is invalid.&lt;br /&gt;
&#039;&#039;&#039;success&#039;&#039;&#039; = et.IPCSend( &#039;&#039;&#039;vmnumber&#039;&#039;&#039;, &#039;&#039;&#039;message&#039;&#039;&#039; )&lt;br /&gt;
:Sends the string &#039;&#039;&#039;message&#039;&#039;&#039; to the mod in the VM slot indicated by &#039;&#039;&#039;vmnumber&#039;&#039;&#039;. The mod receiving &#039;&#039;&#039;message&#039;&#039;&#039; must have an &#039;&#039;et_IPCReceive()&#039;&#039; callback. If the message is successfully sent, &#039;&#039;&#039;success&#039;&#039;&#039; will be 1. On failure it will be 0.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===printing===&lt;br /&gt;
et.G_Print( &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Prints the string &#039;&#039;&#039;text&#039;&#039;&#039; to the server console.&lt;br /&gt;
et.G_LogPrint( &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Prints the string &#039;&#039;&#039;text&#039;&#039;&#039; to the server console and writes it to the server log.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===argument handling===&lt;br /&gt;
&#039;&#039;&#039;args&#039;&#039;&#039; = et.ConcatArgs( &#039;&#039;&#039;index&#039;&#039;&#039; )&lt;br /&gt;
:Returns all arguments beginning from &#039;&#039;&#039;index&#039;&#039;&#039; concatenated into a single string &#039;&#039;&#039;args&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;argcount&#039;&#039;&#039; = et.trap_Argc()&lt;br /&gt;
:Returns a number indicating the number of command line arguments in the command buffer.&lt;br /&gt;
&#039;&#039;&#039;arg&#039;&#039;&#039; = et.trap_Argv( &#039;&#039;&#039;argnum&#039;&#039;&#039; )&lt;br /&gt;
:Returns the contents of the command line argument &#039;&#039;&#039;argnum&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===cvars===&lt;br /&gt;
&#039;&#039;&#039;cvarvalue&#039;&#039;&#039; = et.trap_Cvar_Get( &#039;&#039;&#039;cvarname&#039;&#039;&#039; )&lt;br /&gt;
:Returns the value of the cvar &#039;&#039;&#039;cvarname&#039;&#039;&#039;&lt;br /&gt;
et.trap_Cvar_Set( &#039;&#039;&#039;cvarname&#039;&#039;&#039;, &#039;&#039;&#039;cvarvalue&#039;&#039;&#039; )&lt;br /&gt;
:Sets the cvar &#039;&#039;&#039;cvarname&#039;&#039;&#039; to &#039;&#039;&#039;cvarvalue&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===configstrings===&lt;br /&gt;
&#039;&#039;&#039;configstringvalue&#039;&#039;&#039; = et.trap_GetConfigstring( &#039;&#039;&#039;index&#039;&#039;&#039; )&lt;br /&gt;
:Returns the string &#039;&#039;&#039;configstringvalue&#039;&#039;&#039; containing the contents of the configstring &#039;&#039;&#039;index&#039;&#039;&#039;&lt;br /&gt;
et.trap_SetConfigstring( &#039;&#039;&#039;index&#039;&#039;&#039;, &#039;&#039;&#039;configstringvalue&#039;&#039;&#039; )&lt;br /&gt;
:Sets the configstring &#039;&#039;&#039;index&#039;&#039;&#039; to the string &#039;&#039;&#039;configstringvalue&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===server===&lt;br /&gt;
et.trap_SendConsoleCommand( &#039;&#039;&#039;when&#039;&#039;&#039;, &#039;&#039;&#039;command&#039;&#039;&#039; )&lt;br /&gt;
:Sends the command &#039;&#039;&#039;command&#039;&#039;&#039; to the server console, to be executed &#039;&#039;&#039;when&#039;&#039;&#039; (see et.EXEC_* constants)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===clients===&lt;br /&gt;
et.trap_DropClient( &#039;&#039;&#039;clientnum&#039;&#039;&#039;, &#039;&#039;&#039;reason&#039;&#039;&#039;, &#039;&#039;&#039;ban_time&#039;&#039;&#039; )&lt;br /&gt;
:Disconnects &#039;&#039;&#039;clientnum&#039;&#039;&#039; from the server, with descriptive string &#039;&#039;&#039;reason&#039;&#039;&#039; reported to clients. &#039;&#039;&#039;ban_time&#039;&#039;&#039; is the time in seconds to ban the client from the server. &#039;&#039;&#039;ban_time&#039;&#039;&#039; is optional and may be entirely omitted, in which case the ban time defaults to the cvar &#039;&#039;b_defaultbantime&#039;&#039;&lt;br /&gt;
et.trap_SendServerCommand( &#039;&#039;&#039;clientnum&#039;&#039;&#039;, &#039;&#039;&#039;command&#039;&#039;&#039; )&lt;br /&gt;
:Sends the command &#039;&#039;&#039;command&#039;&#039;&#039; to the client &#039;&#039;&#039;clientnum&#039;&#039;&#039;. If &#039;&#039;&#039;clientnum&#039;&#039;&#039; is -1, the &#039;&#039;&#039;command&#039;&#039;&#039; is broadcast to all connected clients.&lt;br /&gt;
et.G_Say( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;mode&#039;&#039;&#039;, &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Sends a chat command on behalf of client &#039;&#039;&#039;clientNum&#039;&#039;&#039; with the mode &#039;&#039;&#039;mode&#039;&#039;&#039; (see et.SAY_* constants) and chat text &#039;&#039;&#039;text&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===userinfo===&lt;br /&gt;
&#039;&#039;&#039;userinfo&#039;&#039;&#039; = et.trap_GetUserinfo( &#039;&#039;&#039;clientnum&#039;&#039;&#039; )&lt;br /&gt;
:Returns the contents of the userinfo string for the client &#039;&#039;&#039;clientnum&#039;&#039;&#039;&lt;br /&gt;
et.trap_SetUserinfo( &#039;&#039;&#039;clientnum&#039;&#039;&#039;, &#039;&#039;&#039;userinfo&#039;&#039;&#039; )&lt;br /&gt;
:Sets the userinfo string for the client &#039;&#039;&#039;clientnum&#039;&#039;&#039; to &#039;&#039;&#039;userinfo&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===string utility functions===&lt;br /&gt;
&#039;&#039;&#039;infostring&#039;&#039;&#039; = et.Info_RemoveKey( &#039;&#039;&#039;infostring&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039; )&lt;br /&gt;
:Removes key &#039;&#039;&#039;key&#039;&#039;&#039; from infostring &#039;&#039;&#039;infostring&#039;&#039;&#039; and returns the modified infostring.&lt;br /&gt;
&#039;&#039;&#039;infostring&#039;&#039;&#039; = et.Info_SetValueForKey( &#039;&#039;&#039;infostring&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039;, &#039;&#039;&#039;value&#039;&#039;&#039; )&lt;br /&gt;
:Sets the key &#039;&#039;&#039;key&#039;&#039;&#039; in the infostring &#039;&#039;&#039;infostring&#039;&#039;&#039; to &#039;&#039;&#039;value&#039;&#039;&#039; and returns the modified infostring.&lt;br /&gt;
&#039;&#039;&#039;infostring&#039;&#039;&#039; = et.Info_ValueForKey( &#039;&#039;&#039;infostring&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039; )&lt;br /&gt;
:Returns the value of the key &#039;&#039;&#039;key&#039;&#039;&#039; in the infostring &#039;&#039;&#039;infostring&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;cleanstring&#039;&#039;&#039; = et.Q_CleanStr( &#039;&#039;&#039;string&#039;&#039;&#039; )&lt;br /&gt;
:Returns &#039;&#039;&#039;string&#039;&#039;&#039; stripped of all color codes&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ET filesystem===&lt;br /&gt;
&#039;&#039;&#039;fd&#039;&#039;&#039;, &#039;&#039;&#039;len&#039;&#039;&#039; = et.trap_FS_FOpenFile( &#039;&#039;&#039;filename&#039;&#039;&#039;, &#039;&#039;&#039;mode&#039;&#039;&#039; )&lt;br /&gt;
:Attempts to open the file &#039;&#039;&#039;filename&#039;&#039;&#039; with the access mode &#039;&#039;&#039;mode&#039;&#039;&#039; (see et.FS_ constants). Returns the filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039; and file length &#039;&#039;&#039;len&#039;&#039;&#039;. On error, &#039;&#039;&#039;len&#039;&#039;&#039; returns -1.&lt;br /&gt;
&#039;&#039;&#039;filedata&#039;&#039;&#039; = et.trap_FS_Read( fd, count )&lt;br /&gt;
:Reads &#039;&#039;&#039;count&#039;&#039;&#039; bytes from filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039;.&lt;br /&gt;
&#039;&#039;&#039;count&#039;&#039;&#039; = et.trap_FS_Write( &#039;&#039;&#039;filedata&#039;&#039;&#039;, &#039;&#039;&#039;count&#039;&#039;&#039;, &#039;&#039;&#039;fd&#039;&#039;&#039; )&lt;br /&gt;
:Attempts to write &#039;&#039;&#039;count&#039;&#039;&#039; bytes of &#039;&#039;&#039;filedata&#039;&#039;&#039; to filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039;. Returns number of bytes successfully written.&lt;br /&gt;
et.trap_FS_Rename( &#039;&#039;&#039;oldname&#039;&#039;&#039;, &#039;&#039;&#039;newname&#039;&#039;&#039; )&lt;br /&gt;
:Renames file &#039;&#039;&#039;oldname&#039;&#039;&#039; to &#039;&#039;&#039;newname&#039;&#039;&#039;.&lt;br /&gt;
et.trap_FS_FCloseFile( &#039;&#039;&#039;fd&#039;&#039;&#039; )&lt;br /&gt;
:Closes filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===indexes===&lt;br /&gt;
&#039;&#039;&#039;soundindex&#039;&#039;&#039; = et.G_SoundIndex( &#039;&#039;&#039;filename&#039;&#039;&#039; )&lt;br /&gt;
:Returns an index to the soundfile indicated by &#039;&#039;&#039;filename&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;modelindex&#039;&#039;&#039; = et.G_ModelIndex( &#039;&#039;&#039;filename&#039;&#039;&#039; )&lt;br /&gt;
:Returns an index to the model indicated by &#039;&#039;&#039;filename&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sound===&lt;br /&gt;
et.G_globalSound( &#039;&#039;&#039;sound&#039;&#039;&#039; )&lt;br /&gt;
:Plays the global sound indicated by the filename &#039;&#039;&#039;sound&#039;&#039;&#039;.&lt;br /&gt;
et.G_Sound( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;soundindex&#039;&#039;&#039; )&lt;br /&gt;
:Plays the sound &#039;&#039;&#039;soundindex&#039;&#039;&#039; at the location of entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===miscellaneous===&lt;br /&gt;
&#039;&#039;&#039;milliseconds&#039;&#039;&#039; = et.trap_Milliseconds()&lt;br /&gt;
:Returns a number indicating the current server time in milliseconds.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===entities===&lt;br /&gt;
&#039;&#039;&#039;entnum&#039;&#039;&#039; = et.G_Spawn()&lt;br /&gt;
:Spawns a new entity and returns the new entity number.&lt;br /&gt;
&#039;&#039;&#039;entnum&#039;&#039;&#039; = et.G_TempEntity( &#039;&#039;&#039;origin&#039;&#039;&#039;, &#039;&#039;&#039;event&#039;&#039;&#039; )&lt;br /&gt;
:Spawns a new TempEntity of event type &#039;&#039;&#039;event&#039;&#039;&#039; and places it at &#039;&#039;&#039;origin&#039;&#039;&#039; in the world.&lt;br /&gt;
et.G_FreeEntity( &#039;&#039;&#039;entnum&#039;&#039;&#039; )&lt;br /&gt;
:Frees the entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;spawnval&#039;&#039;&#039; = et.G_GetSpawnVar( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039; )&lt;br /&gt;
:Returns the value of spawnvar &#039;&#039;&#039;key&#039;&#039;&#039; for entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
et.G_SetSpawnVar( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039;, &#039;&#039;&#039;value&#039;&#039;&#039; )&lt;br /&gt;
:Sets the spawnvar &#039;&#039;&#039;key&#039;&#039;&#039; to &#039;&#039;&#039;value&#039;&#039;&#039; for entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
integer entnum = et.G_SpawnGEntityFromSpawnVars( string spawnvar, string spawnvalue, ... )&amp;lt;br&amp;gt;&lt;br /&gt;
et.trap_LinkEntity( &#039;&#039;&#039;entnum&#039;&#039;&#039; )&lt;br /&gt;
:Links the entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
et.trap_UnlinkEntity( &#039;&#039;&#039;entnum&#039;&#039;&#039; )&lt;br /&gt;
:Unlinks the entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
(variable) = et.gentity_get( int entnum, string fieldname )&amp;lt;br&amp;gt;&lt;br /&gt;
et.gentity_set( int entnum, string fieldname, (variable) )&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==callbacks==&lt;br /&gt;
&lt;br /&gt;
===qagame execution===&lt;br /&gt;
et_InitGame( &#039;&#039;&#039;levelTime&#039;&#039;&#039;, &#039;&#039;&#039;randomSeed&#039;&#039;&#039;, &#039;&#039;&#039;restart&#039;&#039;&#039; )&lt;br /&gt;
:Called when qagame initializes. &#039;&#039;&#039;levelTime&#039;&#039;&#039; is the current level time in milliseconds. &#039;&#039;&#039;randomSeed&#039;&#039;&#039; is a number that can be used to seed random number generators. &#039;&#039;&#039;restart&#039;&#039;&#039; indicates if et_InitGame() is being called due to a map restart (1) or not (0).&lt;br /&gt;
et_ShutdownGame( &#039;&#039;&#039;restart&#039;&#039;&#039; )&lt;br /&gt;
:Called when qagame shuts down. &#039;&#039;&#039;restart&#039;&#039;&#039; indicates if the shutdown is being called due to a map_restart (1) or not (0).&lt;br /&gt;
et_RunFrame( &#039;&#039;&#039;levelTime&#039;&#039;&#039; )&lt;br /&gt;
:Called when qagame runs a server frame. &#039;&#039;&#039;levelTime&#039;&#039;&#039; is the current level time in milliseconds.&lt;br /&gt;
et_Quit()&lt;br /&gt;
:Called when ETPro unloads the mod. The mod should close all open filedescriptors and perform all cleanup.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===client management===&lt;br /&gt;
&#039;&#039;&#039;rejectreason&#039;&#039;&#039; = et_ClientConnect( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;firstTime&#039;&#039;&#039;, &#039;&#039;&#039;isBot&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client attempts to connect to the server. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id, &#039;&#039;&#039;firstTime&#039;&#039;&#039; indicates if this is a new connection (1) or a reconnection (0). &#039;&#039;&#039;isBot&#039;&#039;&#039; indicates if the client is a bot (1) or not (0). If the mod accepts the connection, it should return nil. Otherwise, the mod should return a string describing the reason the client connection was rejected.&lt;br /&gt;
et_ClientDisconnect( &#039;&#039;&#039;clientNum&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client disconnects. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id.&lt;br /&gt;
et_ClientBegin( &#039;&#039;&#039;clientNum&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client begins (becomes active, and enters the gameworld). &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id.&lt;br /&gt;
et_ClientUserinfoChanged( &#039;&#039;&#039;clientNum&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client&#039;s Userinfo string has changed. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===commands===&lt;br /&gt;
&#039;&#039;&#039;intercepted&#039;&#039;&#039; = et_ClientCommand( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;command&#039;&#039;&#039; )&lt;br /&gt;
:Called when a command is received from a client. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id. &#039;&#039;&#039;command&#039;&#039;&#039; is the command. The mod should return 1 if the command was intercepted by the mod, and 0 if the command was ignored by the mod and should be passed through to the server (and other mods in the chain).&lt;br /&gt;
&#039;&#039;&#039;intercepted&#039;&#039;&#039; = et_ConsoleCommand()&lt;br /&gt;
:Called when a command is entered on the server console. The mod should return 1 if the command was intercepted by the mod, and 0 if the command was ignored by the mod and should be passed through to the server (and other mods in the chain).&lt;br /&gt;
&#039;&#039;&#039;intercepted&#039;&#039;&#039; = et_ClientSay( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;mode&#039;&#039;&#039;, &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client sends a chat command. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id. &#039;&#039;&#039;mode&#039;&#039;&#039; is the chat mode (see et.SAY_* constants). &#039;&#039;&#039;text&#039;&#039;&#039; is the chat text. The mod should return 1 if the command was intercepted by the mod, and 0 if the command was ignored by the mod and should be passed through to the server (and other mods in the chain)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===miscellaneous===&lt;br /&gt;
et_IPCReceive( &#039;&#039;&#039;vmnumber&#039;&#039;&#039;, &#039;&#039;&#039;message&#039;&#039;&#039; )&lt;br /&gt;
:Called when another mod sends an et.IPCSend() message to this mod. &#039;&#039;&#039;vmnumber&#039;&#039;&#039; is the VM slot number of the sender, and &#039;&#039;&#039;message&#039;&#039;&#039; is the message.&lt;br /&gt;
et_Print( &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Called whenever the server or qagame prints a string to the console.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==predefined constants==&lt;br /&gt;
et.EXEC_NOW&amp;lt;br&amp;gt;&lt;br /&gt;
et.EXEC_INSERT&amp;lt;br&amp;gt;&lt;br /&gt;
et.EXEC_APPEND&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_READ&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_WRITE&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_APPEND&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_APPEND_SYNC&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_ALL&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_TEAM&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_BUDDY&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_TEAMNL&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
et.HOSTARCH&lt;br /&gt;
:set to WIN32 or UNIX depending on the host architecture qagame is running on.&lt;br /&gt;
LUA_PATH&lt;br /&gt;
:set to fs_homepath/fs_game/?.lua in order to ease use of the [http://www.lua.org/pil/8.1.html require] function.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==configs==&lt;br /&gt;
If a config is loaded, all modules are shutdown and reloaded. If a &#039;&#039;certified&#039;&#039; config is loaded, all modules are shutdown and reloaded, and additionally the following functions are disabled: &#039;&#039;&#039;require()&#039;&#039;&#039;, &#039;&#039;&#039;loadfile()&#039;&#039;&#039;, &#039;&#039;&#039;loadlib()&#039;&#039;&#039;, &#039;&#039;&#039;loadstring()&#039;&#039;&#039;, &#039;&#039;&#039;dofile()&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
&lt;br /&gt;
Q: OMG I hate the libary prefix et.* on everything!!11!1oneone&amp;lt;br&amp;gt;&lt;br /&gt;
A: table.foreach(et, function (func, value) _G[func] = value; end)&lt;br /&gt;
&lt;br /&gt;
Q: How do a re-load my lua file without restarting the whole server ?&amp;lt;br&amp;gt;&lt;br /&gt;
A: Use the following in the server console:&lt;br /&gt;
 lua_modules &amp;quot;&amp;quot;&lt;br /&gt;
 lua_modules &amp;quot;mymod.lua&amp;quot; ; map_restart&lt;br /&gt;
Note that lua_modules &amp;quot;&amp;quot; must be on a line by itself.&lt;br /&gt;
&lt;br /&gt;
Q: Can I see some sample code?&amp;lt;br&amp;gt;&lt;br /&gt;
A: [[ETPro:Lua Sample Code]]&lt;br /&gt;
&lt;br /&gt;
Q: Is there a list of [[ETPro]] mods?&amp;lt;br&amp;gt;&lt;br /&gt;
A: Yes, [[:Category:ETPro:Mods|here]].&lt;br /&gt;
&lt;br /&gt;
[[Category:ETPro]]&lt;br /&gt;
[[Category:ETPro:Mods]]&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=B_placebo&amp;diff=1646</id>
		<title>B placebo</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=B_placebo&amp;diff=1646"/>
		<updated>2005-11-09T08:42:43Z</updated>

		<summary type="html">&lt;p&gt;Bani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Mysterious Beginning ==&lt;br /&gt;
&lt;br /&gt;
Mysteriously, when this cvar was discovered in the source code for [[ETPro]], nobody could be identified as having coded it, and still to this day nobody knows where it came from.&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
When this cvar is enabled, anything is possible.  As an example, you might be empowered with the &#039;&#039;sticky bullet syndrome&#039;&#039; and be able to shoot people around corners when they run away. &lt;br /&gt;
&lt;br /&gt;
Other reported abilities:&lt;br /&gt;
&lt;br /&gt;
* Resistance to explosive damage &#039;&#039;(as long as you aren&#039;t too close to the explosion)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Win every game &#039;&#039;(as long as your team is better than the opposing team)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* When defusing dynamite, it won&#039;t matter how far into the 30 second countdown it is, you will always be able to defuse it on time. &#039;&#039;(as long as you start defusing before 5 seconds is left on the timer)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Jumping twice as far as normal &#039;&#039;(as long as you have 333fps)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Grenades will always damage your target 100% &#039;&#039;(as long as your grenade is really close to the target)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Why keep it? ==&lt;br /&gt;
&lt;br /&gt;
The cvar can&#039;t be removed as it lurks in the deepest, darkest recesses of the ETPro source code; it is so well hidden that even the legendary [[User:Rain|Rain]] cannot remove it.&lt;br /&gt;
&lt;br /&gt;
== I Can&#039;t Find it ==&lt;br /&gt;
&lt;br /&gt;
The cvar does not show up when you try to tab complete it within the console. You merely have to insert it in your config and then you can rest assured that it is working.&lt;br /&gt;
&lt;br /&gt;
== I Don&#039;t Believe You ==&lt;br /&gt;
&lt;br /&gt;
This cvar most certainly does exist. The mountains of uncorroborated evidence from endless forum posts should surely be enough to convince even the most hardened skeptic.&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Target_location&amp;diff=1611</id>
		<title>Target location</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Target_location&amp;diff=1611"/>
		<updated>2005-11-07T21:53:56Z</updated>

		<summary type="html">&lt;p&gt;Bani: /* Viewing locations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== For Maps In Production ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;target_locations&#039;&#039; is a non-brush entity that allows a mapper to specify the name of a certain area to be displayed instead of map coordinates in both the fireteam box and the location displayed when you chat, unless it is set to use coordinates on the client side.&lt;br /&gt;
&lt;br /&gt;
Note that using these will throw an error into the console for every one you have if use in etmain, or as of now, shrub and etpub. The map will still run, though. To use them, first make a file called &#039;&#039;et_entities_location.def&#039;&#039; in the scripts directory of your mapping install. Then, open the file in notepad and paste the following in the file, and then save.&lt;br /&gt;
&lt;br /&gt;
===Target_location entity===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*QUAKED target_location (0 0.5 0) (-8 -8 -8) (8 8 8)&lt;br /&gt;
Set &amp;quot;message&amp;quot; to the name of this location.&lt;br /&gt;
&lt;br /&gt;
The message can contain colorcodes, default color is ^3(yellow)&lt;br /&gt;
&lt;br /&gt;
Closest target_location in sight used for the location, if none&lt;br /&gt;
in site, closest in distance, within PVS&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will allow you to place a target_location into your map inside of GTK Radiant. It will appear as a small green box. When selected, give it a key called &#039;&#039;message&#039;&#039; with a value that is the name you want at that location. You only need to place target_locations so you can always see one, any more are a waste of resources.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== For Completed Maps ==&lt;br /&gt;
&lt;br /&gt;
Note: This method is less efficient engine-wise than using actual target_locations.&lt;br /&gt;
&lt;br /&gt;
target_locations on exisitng maps are saved into a file (maps/$MAPNAME_loc_override.dat). this way they are seperated from the map and its .pk3&lt;br /&gt;
&lt;br /&gt;
When adding target_locations to a map you will have acces to the following commands:&lt;br /&gt;
&lt;br /&gt;
===Loc_commands===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loc_add &amp;lt;message&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:Add a new target_location at your current position whit name &amp;lt;message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loc_del&#039;&#039;&#039;&lt;br /&gt;
:Deletes the target_location that you are currently &amp;quot;in&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loc_move&#039;&#039;&#039;&lt;br /&gt;
:Moves the target_location that you are currently &amp;quot;in&amp;quot; to your current position&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loc_rename &amp;lt;message&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:Renames the target_location that you are currently &amp;quot;in&amp;quot; to &amp;lt;message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loc_show&#039;&#039;&#039;&lt;br /&gt;
:Shows the target_location that you are currently &amp;quot;in&amp;quot; as text in console&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loc_save&#039;&#039;&#039;&lt;br /&gt;
:Saves all target_locations to a file (maps/&#039;&#039;mapname&#039;&#039;_loc_override.dat)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loc_load&#039;&#039;&#039;&lt;br /&gt;
:Reloads all target_locations from a file (maps/&#039;&#039;mapname&#039;&#039;_loc_override.dat)&lt;br /&gt;
&lt;br /&gt;
==Viewing locations==&lt;br /&gt;
&lt;br /&gt;
While adding locations to your map you are able to monitor your changes. This can be enabled using a cvar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b_debuglocations&#039;&#039;&#039; (default: 0) - Bitmask to enable debugging/design aids for location names.  Works with external .dats as well as target_location ents. The following values can be added together:&lt;br /&gt;
* 1 - Draw a bubble sprite at each location marker.&amp;lt;br&amp;gt;The nearest location is drawn in green, with all the others being drawn in red.&lt;br /&gt;
*2 - Add a dynamic light at each location marker.&amp;lt;br&amp;gt;The nearest location is lit in red, with all the others being lit in green.&lt;br /&gt;
*4 - Draw floating text at each location marker containing the location&#039;s name.&amp;lt;br&amp;gt;The nearest location is colored green instead of white.&lt;br /&gt;
*8 - Send updates to other players when a location is added, deleted, or renamed.&amp;lt;br&amp;gt;This function allows multiple people to cooperatively edit locations in a level.&lt;br /&gt;
*16 - Accept updates to locations from other players who are using b_debuglocations 8.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Target_location&amp;diff=1607</id>
		<title>Target location</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Target_location&amp;diff=1607"/>
		<updated>2005-11-07T21:51:36Z</updated>

		<summary type="html">&lt;p&gt;Bani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== For Maps In Production ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;target_locations&#039;&#039; is a non-brush entity that allows a mapper to specify the name of a certain area to be displayed instead of map coordinates in both the fireteam box and the location displayed when you chat, unless it is set to use coordinates on the client side.&lt;br /&gt;
&lt;br /&gt;
Note that using these will throw an error into the console for every one you have if use in etmain, or as of now, shrub and etpub. The map will still run, though. To use them, first make a file called &#039;&#039;et_entities_location.def&#039;&#039; in the scripts directory of your mapping install. Then, open the file in notepad and paste the following in the file, and then save.&lt;br /&gt;
&lt;br /&gt;
===Target_location entity===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*QUAKED target_location (0 0.5 0) (-8 -8 -8) (8 8 8)&lt;br /&gt;
Set &amp;quot;message&amp;quot; to the name of this location.&lt;br /&gt;
&lt;br /&gt;
The message can contain colorcodes, default color is ^3(yellow)&lt;br /&gt;
&lt;br /&gt;
Closest target_location in sight used for the location, if none&lt;br /&gt;
in site, closest in distance, within PVS&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will allow you to place a target_location into your map inside of GTK Radiant. It will appear as a small green box. When selected, give it a key called &#039;&#039;message&#039;&#039; with a value that is the name you want at that location. You only need to place target_locations so you can always see one, any more are a waste of resources.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== For Completed Maps ==&lt;br /&gt;
&lt;br /&gt;
Note: This method is less efficient engine-wise than using actual target_locations.&lt;br /&gt;
&lt;br /&gt;
target_locations on exisitng maps are saved into a file (maps/$MAPNAME_loc_override.dat). this way they are seperated from the map and its .pk3&lt;br /&gt;
&lt;br /&gt;
When adding target_locations to a map you will have acces to the following commands:&lt;br /&gt;
&lt;br /&gt;
===Loc_commands===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loc_add &amp;lt;message&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:Add a new target_location at your current position whit name &amp;lt;message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loc_del&#039;&#039;&#039;&lt;br /&gt;
:Deletes the target_location that you are currently &amp;quot;in&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loc_move&#039;&#039;&#039;&lt;br /&gt;
:Moves the target_location that you are currently &amp;quot;in&amp;quot; to your current position&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loc_rename &amp;lt;message&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:Renames the target_location that you are currently &amp;quot;in&amp;quot; to &amp;lt;message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loc_show&#039;&#039;&#039;&lt;br /&gt;
:Shows the target_location that you are currently &amp;quot;in&amp;quot; as text in console&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loc_save&#039;&#039;&#039;&lt;br /&gt;
:Saves all target_locations to a file (maps/&#039;&#039;mapname&#039;&#039;_loc_override.dat)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Loc_load&#039;&#039;&#039;&lt;br /&gt;
:Reloads all target_locations from a file (maps/&#039;&#039;mapname&#039;&#039;_loc_override.dat)&lt;br /&gt;
&lt;br /&gt;
==Viewing locations==&lt;br /&gt;
&lt;br /&gt;
While adding locations to your map you are willing to see your progress. This can be done using a cvar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;b_debuglocations&#039;&#039;&#039; (default: 0) - Bitmask to enable debugging/design aids for location names.  Works with external .dats as well as target_location ents. The following values can be added together:&lt;br /&gt;
* 1 - Draw a bubble sprite at each location marker.&amp;lt;br&amp;gt;The nearest location is drawn in green, with all the others being drawn in red.&lt;br /&gt;
*2 - Add a dynamic light at each location marker.&amp;lt;br&amp;gt;The nearest location is lit in red, with all the others being lit in green.&lt;br /&gt;
*4 - Draw floating text at each location marker containing the location&#039;s name.&amp;lt;br&amp;gt;The nearest location is colored green instead of white.&lt;br /&gt;
*8 - Send updates to other players when a location is added, deleted, or renamed.&amp;lt;br&amp;gt;This function allows multiple people to cooperatively edit locations in a level.&lt;br /&gt;
*16 - Accept updates to locations from other players who are using b_debuglocations 8.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;NOTE: while using &#039;&#039;&#039;b_debuglocations&#039;&#039;&#039; make sure you use &#039;&#039;&#039;loc_save&#039;&#039;&#039; a lot, this is becase of engine limits the client can crash while drawing to many sprites&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Lua_Mod_API&amp;diff=1574</id>
		<title>Lua Mod API</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Lua_Mod_API&amp;diff=1574"/>
		<updated>2005-11-07T07:53:30Z</updated>

		<summary type="html">&lt;p&gt;Bani: link to lua documentation for libraries&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOEDITSECTION__&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot; style=&amp;quot;background: #FFFFCC; padding: 2px; border: 2px solid #000000;&amp;quot;&amp;gt;The latest version of the lua-enabled ETPro qagame is etpro-lua-1 and can be downloaded [http://etpro.anime.net/etpro-lua-1.zip here].&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ETPro now supports serverside mods via the [http://www.lua.org/ lua] scripting language.&lt;br /&gt;
&lt;br /&gt;
ETPro has an embedded lua 5.0.2 interpreter, and if present will load user-defined scripts from the etpro directory. ETPro also provides an &amp;quot;et&amp;quot; library of function calls for lua to access the server engine, and provides callbacks so a serverside mod may trigger on specific server events.&lt;br /&gt;
&lt;br /&gt;
The following standard lua libraries are initialized by default and available to ETPro lua scripts:&lt;br /&gt;
[http://www.lua.org/manual/5.0/manual.html#5.1 basic], [http://www.lua.org/manual/5.0/manual.html#5.4 table], [http://www.lua.org/manual/5.0/manual.html#5.6 i/o], [http://www.lua.org/manual/5.0/manual.html#5.3 string], [http://www.lua.org/manual/5.0/manual.html#5.5 math].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==server commands==&lt;br /&gt;
===lua_status===&lt;br /&gt;
:lists all currently loaded lua modules.&lt;br /&gt;
&lt;br /&gt;
==cvars==&lt;br /&gt;
===lua_modules===&lt;br /&gt;
:(default &amp;quot;&amp;quot;, disabled)&lt;br /&gt;
:space separated list of lua modules for ETPro to load. modules will be run in the order listed.&lt;br /&gt;
&lt;br /&gt;
===lua_allowedmodules===&lt;br /&gt;
:(default &amp;quot;&amp;quot;, disabled)&lt;br /&gt;
:if set, only lua modules with the matching sha1 signatures listed in this cvar will be allowed to load.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
changing either cvar will cause all currently loaded modules to quit and be unloaded until the next map_restart.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==et library calls==&lt;br /&gt;
&lt;br /&gt;
===modules===&lt;br /&gt;
et.RegisterModname( &#039;&#039;&#039;modname&#039;&#039;&#039; )&lt;br /&gt;
:Registers a descriptive string &#039;&#039;&#039;modname&#039;&#039;&#039; for this mod.&lt;br /&gt;
&#039;&#039;&#039;vmnumber&#039;&#039;&#039; = et.FindSelf()&lt;br /&gt;
:Returns a number indicating the VM slot the current mod is loaded into.&lt;br /&gt;
&#039;&#039;&#039;modname&#039;&#039;&#039;, &#039;&#039;&#039;signature&#039;&#039;&#039; = et.FindMod( &#039;&#039;&#039;vmnumber&#039;&#039;&#039; )&lt;br /&gt;
:Returns the &#039;&#039;&#039;modname&#039;&#039;&#039; and sha1 &#039;&#039;&#039;signature&#039;&#039;&#039; for the mod loaded in the VM slot &#039;&#039;&#039;vmnumber&#039;&#039;&#039;. Returns nil, nil if the VM slot is invalid.&lt;br /&gt;
&#039;&#039;&#039;success&#039;&#039;&#039; = et.IPCSend( &#039;&#039;&#039;vmnumber&#039;&#039;&#039;, &#039;&#039;&#039;message&#039;&#039;&#039; )&lt;br /&gt;
:Sends the string &#039;&#039;&#039;message&#039;&#039;&#039; to the mod in the VM slot indicated by &#039;&#039;&#039;vmnumber&#039;&#039;&#039;. The mod receiving &#039;&#039;&#039;message&#039;&#039;&#039; must have an &#039;&#039;et_IPCReceive()&#039;&#039; callback. If the message is successfully sent, &#039;&#039;&#039;success&#039;&#039;&#039; will be 1. On failure it will be 0.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===printing===&lt;br /&gt;
et.G_Print( &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Prints the string &#039;&#039;&#039;text&#039;&#039;&#039; to the server console.&lt;br /&gt;
et.G_LogPrint( &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Prints the string &#039;&#039;&#039;text&#039;&#039;&#039; to the server console and writes it to the server log.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===argument handling===&lt;br /&gt;
&#039;&#039;&#039;args&#039;&#039;&#039; = et.ConcatArgs( &#039;&#039;&#039;index&#039;&#039;&#039; )&lt;br /&gt;
:Returns all arguments beginning from &#039;&#039;&#039;index&#039;&#039;&#039; concatenated into a single string &#039;&#039;&#039;args&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;argcount&#039;&#039;&#039; = et.trap_Argc()&lt;br /&gt;
:Returns a number indicating the number of command line arguments in the command buffer.&lt;br /&gt;
&#039;&#039;&#039;arg&#039;&#039;&#039; = et.trap_Argv( &#039;&#039;&#039;argnum&#039;&#039;&#039; )&lt;br /&gt;
:Returns the contents of the command line argument &#039;&#039;&#039;argnum&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===cvars===&lt;br /&gt;
&#039;&#039;&#039;cvarvalue&#039;&#039;&#039; = et.trap_Cvar_Get( &#039;&#039;&#039;cvarname&#039;&#039;&#039; )&lt;br /&gt;
:Returns the value of the cvar &#039;&#039;&#039;cvarname&#039;&#039;&#039;&lt;br /&gt;
et.trap_Cvar_Set( &#039;&#039;&#039;cvarname&#039;&#039;&#039;, &#039;&#039;&#039;cvarvalue&#039;&#039;&#039; )&lt;br /&gt;
:Sets the cvar &#039;&#039;&#039;cvarname&#039;&#039;&#039; to &#039;&#039;&#039;cvarvalue&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===configstrings===&lt;br /&gt;
&#039;&#039;&#039;configstringvalue&#039;&#039;&#039; = et.trap_GetConfigstring( &#039;&#039;&#039;index&#039;&#039;&#039; )&lt;br /&gt;
:Returns the string &#039;&#039;&#039;configstringvalue&#039;&#039;&#039; containing the contents of the configstring &#039;&#039;&#039;index&#039;&#039;&#039;&lt;br /&gt;
et.trap_SetConfigstring( &#039;&#039;&#039;index&#039;&#039;&#039;, &#039;&#039;&#039;configstringvalue&#039;&#039;&#039; )&lt;br /&gt;
:Sets the configstring &#039;&#039;&#039;index&#039;&#039;&#039; to the string &#039;&#039;&#039;configstringvalue&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===server===&lt;br /&gt;
et.trap_SendConsoleCommand( &#039;&#039;&#039;when&#039;&#039;&#039;, &#039;&#039;&#039;command&#039;&#039;&#039; )&lt;br /&gt;
:Sends the command &#039;&#039;&#039;command&#039;&#039;&#039; to the server console, to be executed &#039;&#039;&#039;when&#039;&#039;&#039; (see et.EXEC_* constants)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===clients===&lt;br /&gt;
et.trap_DropClient( &#039;&#039;&#039;clientnum&#039;&#039;&#039;, &#039;&#039;&#039;reason&#039;&#039;&#039;, &#039;&#039;&#039;ban_time&#039;&#039;&#039; )&lt;br /&gt;
:Disconnects &#039;&#039;&#039;clientnum&#039;&#039;&#039; from the server, with descriptive string &#039;&#039;&#039;reason&#039;&#039;&#039; reported to clients. &#039;&#039;&#039;ban_time&#039;&#039;&#039; is the time in seconds to ban the client from the server. &#039;&#039;&#039;ban_time&#039;&#039;&#039; is optional and may be entirely omitted, in which case the ban time defaults to the cvar &#039;&#039;b_defaultbantime&#039;&#039;&lt;br /&gt;
et.trap_SendServerCommand( &#039;&#039;&#039;clientnum&#039;&#039;&#039;, &#039;&#039;&#039;command&#039;&#039;&#039; )&lt;br /&gt;
:Sends the command &#039;&#039;&#039;command&#039;&#039;&#039; to the client &#039;&#039;&#039;clientnum&#039;&#039;&#039;. If &#039;&#039;&#039;clientnum&#039;&#039;&#039; is -1, the &#039;&#039;&#039;command&#039;&#039;&#039; is broadcast to all connected clients.&lt;br /&gt;
et.G_Say( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;mode&#039;&#039;&#039;, &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Sends a chat command on behalf of client &#039;&#039;&#039;clientNum&#039;&#039;&#039; with the mode &#039;&#039;&#039;mode&#039;&#039;&#039; (see et.SAY_* constants) and chat text &#039;&#039;&#039;text&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===userinfo===&lt;br /&gt;
&#039;&#039;&#039;userinfo&#039;&#039;&#039; = et.trap_GetUserinfo( &#039;&#039;&#039;clientnum&#039;&#039;&#039; )&lt;br /&gt;
:Returns the contents of the userinfo string for the client &#039;&#039;&#039;clientnum&#039;&#039;&#039;&lt;br /&gt;
et.trap_SetUserinfo( &#039;&#039;&#039;clientnum&#039;&#039;&#039;, &#039;&#039;&#039;userinfo&#039;&#039;&#039; )&lt;br /&gt;
:Sets the userinfo string for the client &#039;&#039;&#039;clientnum&#039;&#039;&#039; to &#039;&#039;&#039;userinfo&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===string utility functions===&lt;br /&gt;
&#039;&#039;&#039;infostring&#039;&#039;&#039; = et.Info_RemoveKey( &#039;&#039;&#039;infostring&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039; )&lt;br /&gt;
:Removes key &#039;&#039;&#039;key&#039;&#039;&#039; from infostring &#039;&#039;&#039;infostring&#039;&#039;&#039; and returns the modified infostring.&lt;br /&gt;
&#039;&#039;&#039;infostring&#039;&#039;&#039; = et.Info_SetValueForKey( &#039;&#039;&#039;infostring&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039;, &#039;&#039;&#039;value&#039;&#039;&#039; )&lt;br /&gt;
:Sets the key &#039;&#039;&#039;key&#039;&#039;&#039; in the infostring &#039;&#039;&#039;infostring&#039;&#039;&#039; to &#039;&#039;&#039;value&#039;&#039;&#039; and returns the modified infostring.&lt;br /&gt;
&#039;&#039;&#039;infostring&#039;&#039;&#039; = et.Info_ValueForKey( &#039;&#039;&#039;infostring&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039; )&lt;br /&gt;
:Returns the value of the key &#039;&#039;&#039;key&#039;&#039;&#039; in the infostring &#039;&#039;&#039;infostring&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;cleanstring&#039;&#039;&#039; = et.Q_CleanStr( &#039;&#039;&#039;string&#039;&#039;&#039; )&lt;br /&gt;
:Returns &#039;&#039;&#039;string&#039;&#039;&#039; stripped of all color codes&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ET filesystem===&lt;br /&gt;
&#039;&#039;&#039;fd&#039;&#039;&#039;, &#039;&#039;&#039;len&#039;&#039;&#039; = et.trap_FS_FOpenFile( &#039;&#039;&#039;filename&#039;&#039;&#039;, &#039;&#039;&#039;mode&#039;&#039;&#039; )&lt;br /&gt;
:Attempts to open the file &#039;&#039;&#039;filename&#039;&#039;&#039; with the access mode &#039;&#039;&#039;mode&#039;&#039;&#039; (see et.FS_ constants). Returns the filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039; and file length &#039;&#039;&#039;len&#039;&#039;&#039;. On error, &#039;&#039;&#039;len&#039;&#039;&#039; returns -1.&lt;br /&gt;
&#039;&#039;&#039;filedata&#039;&#039;&#039; = et.trap_FS_Read( fd, count )&lt;br /&gt;
:Reads &#039;&#039;&#039;count&#039;&#039;&#039; bytes from filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039;.&lt;br /&gt;
&#039;&#039;&#039;count&#039;&#039;&#039; = et.trap_FS_Write( &#039;&#039;&#039;filedata&#039;&#039;&#039;, &#039;&#039;&#039;count&#039;&#039;&#039;, &#039;&#039;&#039;fd&#039;&#039;&#039; )&lt;br /&gt;
:Attempts to write &#039;&#039;&#039;count&#039;&#039;&#039; bytes of &#039;&#039;&#039;filedata&#039;&#039;&#039; to filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039;. Returns number of bytes successfully written.&lt;br /&gt;
et.trap_FS_Rename( &#039;&#039;&#039;oldname&#039;&#039;&#039;, &#039;&#039;&#039;newname&#039;&#039;&#039; )&lt;br /&gt;
:Renames file &#039;&#039;&#039;oldname&#039;&#039;&#039; to &#039;&#039;&#039;newname&#039;&#039;&#039;.&lt;br /&gt;
et.trap_FS_FCloseFile( &#039;&#039;&#039;fd&#039;&#039;&#039; )&lt;br /&gt;
:Closes filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===indexes===&lt;br /&gt;
&#039;&#039;&#039;soundindex&#039;&#039;&#039; = et.G_SoundIndex( &#039;&#039;&#039;filename&#039;&#039;&#039; )&lt;br /&gt;
:Returns an index to the soundfile indicated by &#039;&#039;&#039;filename&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;modelindex&#039;&#039;&#039; = et.G_ModelIndex( &#039;&#039;&#039;filename&#039;&#039;&#039; )&lt;br /&gt;
:Returns an index to the model indicated by &#039;&#039;&#039;filename&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sound===&lt;br /&gt;
et.G_globalSound( &#039;&#039;&#039;sound&#039;&#039;&#039; )&lt;br /&gt;
:Plays the global sound indicated by the filename &#039;&#039;&#039;sound&#039;&#039;&#039;.&lt;br /&gt;
et.G_Sound( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;soundindex&#039;&#039;&#039; )&lt;br /&gt;
:Plays the sound &#039;&#039;&#039;soundindex&#039;&#039;&#039; at the location of entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===miscellaneous===&lt;br /&gt;
&#039;&#039;&#039;milliseconds&#039;&#039;&#039; = et.trap_Milliseconds()&lt;br /&gt;
:Returns a number indicating the current server time in milliseconds.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===entities===&lt;br /&gt;
&#039;&#039;&#039;entnum&#039;&#039;&#039; = et.G_Spawn()&lt;br /&gt;
:Spawns a new entity and returns the new entity number.&lt;br /&gt;
&#039;&#039;&#039;entnum&#039;&#039;&#039; = et.G_TempEntity( &#039;&#039;&#039;origin&#039;&#039;&#039;, &#039;&#039;&#039;event&#039;&#039;&#039; )&lt;br /&gt;
:Spawns a new TempEntity of event type &#039;&#039;&#039;event&#039;&#039;&#039; and places it at &#039;&#039;&#039;origin&#039;&#039;&#039; in the world.&lt;br /&gt;
et.G_FreeEntity( &#039;&#039;&#039;entnum&#039;&#039;&#039; )&lt;br /&gt;
:Frees the entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;spawnval&#039;&#039;&#039; = et.G_GetSpawnVar( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039; )&lt;br /&gt;
:Returns the value of spawnvar &#039;&#039;&#039;key&#039;&#039;&#039; for entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
et.G_SetSpawnVar( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039;, &#039;&#039;&#039;value&#039;&#039;&#039; )&lt;br /&gt;
:Sets the spawnvar &#039;&#039;&#039;key&#039;&#039;&#039; to &#039;&#039;&#039;value&#039;&#039;&#039; for entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
integer entnum = et.G_SpawnGEntityFromSpawnVars( string spawnvar, string spawnvalue, ... )&amp;lt;br&amp;gt;&lt;br /&gt;
et.trap_LinkEntity( &#039;&#039;&#039;entnum&#039;&#039;&#039; )&lt;br /&gt;
:Links the entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
et.trap_UnlinkEntity( &#039;&#039;&#039;entnum&#039;&#039;&#039; )&lt;br /&gt;
:Unlinks the entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
(variable) = et.gentity_get( int entnum, string fieldname )&amp;lt;br&amp;gt;&lt;br /&gt;
et.gentity_set( int entnum, string fieldname, (variable) )&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==callbacks==&lt;br /&gt;
&lt;br /&gt;
===qagame execution===&lt;br /&gt;
et_InitGame( &#039;&#039;&#039;levelTime&#039;&#039;&#039;, &#039;&#039;&#039;randomSeed&#039;&#039;&#039;, &#039;&#039;&#039;restart&#039;&#039;&#039; )&lt;br /&gt;
:Called when qagame initializes. &#039;&#039;&#039;levelTime&#039;&#039;&#039; is the current level time in milliseconds. &#039;&#039;&#039;randomSeed&#039;&#039;&#039; is a number that can be used to seed random number generators. &#039;&#039;&#039;restart&#039;&#039;&#039; indicates if et_InitGame() is being called due to a map restart (1) or not (0).&lt;br /&gt;
et_ShutdownGame( &#039;&#039;&#039;restart&#039;&#039;&#039; )&lt;br /&gt;
:Called when qagame shuts down. &#039;&#039;&#039;restart&#039;&#039;&#039; indicates if the shutdown is being called due to a map_restart (1) or not (0).&lt;br /&gt;
et_RunFrame( &#039;&#039;&#039;levelTime&#039;&#039;&#039; )&lt;br /&gt;
:Called when qagame runs a server frame. &#039;&#039;&#039;levelTime&#039;&#039;&#039; is the current level time in milliseconds.&lt;br /&gt;
et_Quit()&lt;br /&gt;
:Called when ETPro unloads the mod. The mod should close all open filedescriptors and perform all cleanup.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===client management===&lt;br /&gt;
&#039;&#039;&#039;rejectreason&#039;&#039;&#039; = et_ClientConnect( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;firstTime&#039;&#039;&#039;, &#039;&#039;&#039;isBot&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client attempts to connect to the server. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id, &#039;&#039;&#039;firstTime&#039;&#039;&#039; indicates if this is a new connection (1) or a reconnection (0). &#039;&#039;&#039;isBot&#039;&#039;&#039; indicates if the client is a bot (1) or not (0). If the mod accepts the connection, it should return nil. Otherwise, the mod should return a string describing the reason the client connection was rejected.&lt;br /&gt;
et_ClientDisconnect( &#039;&#039;&#039;clientNum&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client disconnects. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id.&lt;br /&gt;
et_ClientBegin( &#039;&#039;&#039;clientNum&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client begins (becomes active, and enters the gameworld). &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id.&lt;br /&gt;
et_ClientUserinfoChanged( &#039;&#039;&#039;clientNum&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client&#039;s Userinfo string has changed. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===commands===&lt;br /&gt;
&#039;&#039;&#039;intercepted&#039;&#039;&#039; = et_ClientCommand( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;command&#039;&#039;&#039; )&lt;br /&gt;
:Called when a command is received from a client. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id. &#039;&#039;&#039;command&#039;&#039;&#039; is the command. The mod should return 1 if the command was intercepted by the mod, and 0 if the command was ignored by the mod and should be passed through to the server (and other mods in the chain).&lt;br /&gt;
&#039;&#039;&#039;intercepted&#039;&#039;&#039; = et_ConsoleCommand()&lt;br /&gt;
:Called when a command is entered on the server console. The mod should return 1 if the command was intercepted by the mod, and 0 if the command was ignored by the mod and should be passed through to the server (and other mods in the chain).&lt;br /&gt;
&#039;&#039;&#039;intercepted&#039;&#039;&#039; = et_ClientSay( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;mode&#039;&#039;&#039;, &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client sends a chat command. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id. &#039;&#039;&#039;mode&#039;&#039;&#039; is the chat mode (see et.SAY_* constants). &#039;&#039;&#039;text&#039;&#039;&#039; is the chat text. The mod should return 1 if the command was intercepted by the mod, and 0 if the command was ignored by the mod and should be passed through to the server (and other mods in the chain)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===miscellaneous===&lt;br /&gt;
et_IPCReceive( &#039;&#039;&#039;vmnumber&#039;&#039;&#039;, &#039;&#039;&#039;message&#039;&#039;&#039; )&lt;br /&gt;
:Called when another mod sends an et.IPCSend() message to this mod. &#039;&#039;&#039;vmnumber&#039;&#039;&#039; is the VM slot number of the sender, and &#039;&#039;&#039;message&#039;&#039;&#039; is the message.&lt;br /&gt;
et_Print( &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Called whenever the server or qagame prints a string to the console.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==predefined constants==&lt;br /&gt;
et.EXEC_NOW&amp;lt;br&amp;gt;&lt;br /&gt;
et.EXEC_INSERT&amp;lt;br&amp;gt;&lt;br /&gt;
et.EXEC_APPEND&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_READ&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_WRITE&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_APPEND&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_APPEND_SYNC&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_ALL&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_TEAM&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_BUDDY&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_TEAMNL&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
et.HOSTARCH&lt;br /&gt;
:set to WIN32 or UNIX depending on the host architecture qagame is running on.&lt;br /&gt;
LUA_PATH&lt;br /&gt;
:set to fs_homepath/fs_game/?.lua in order to ease use of the [http://www.lua.org/pil/8.1.html require] function.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==configs==&lt;br /&gt;
If a config is loaded, all modules are shutdown and reloaded. If a &#039;&#039;certified&#039;&#039; config is loaded, all modules are shutdown and reloaded, and additionally the following functions are disabled: &#039;&#039;&#039;require()&#039;&#039;&#039;, &#039;&#039;&#039;loadfile()&#039;&#039;&#039;, &#039;&#039;&#039;loadlib()&#039;&#039;&#039;, &#039;&#039;&#039;loadstring()&#039;&#039;&#039;, &#039;&#039;&#039;dofile()&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
&lt;br /&gt;
Q: OMG I hate the libary prefix et.* on everything!!11!1oneone&amp;lt;br&amp;gt;&lt;br /&gt;
A: table.foreach(et, function (func, value) _G[func] = value; end)&lt;br /&gt;
&lt;br /&gt;
Q: How do a re-load my lua file without restarting the whole server ?&amp;lt;br&amp;gt;&lt;br /&gt;
A: Use the following in the server console:&lt;br /&gt;
 lua_modules &amp;quot;&amp;quot;&lt;br /&gt;
 lua_modules &amp;quot;mymod.lua&amp;quot; ; map_restart&lt;br /&gt;
Note that lua_modules &amp;quot;&amp;quot; must be on a line by itself.&lt;br /&gt;
&lt;br /&gt;
Q: Can I see some sample code?&amp;lt;br&amp;gt;&lt;br /&gt;
A: [[ETPro:Lua Sample Code]]&lt;br /&gt;
&lt;br /&gt;
Q: Is there a list of [[ETPro]] mods?&amp;lt;br&amp;gt;&lt;br /&gt;
A: Yes, [[:Category:ETPro:Mods|here]].&lt;br /&gt;
&lt;br /&gt;
[[Category:ETPro]]&lt;br /&gt;
[[Category:ETPro:Mods]]&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Lua_Mod_API&amp;diff=1571</id>
		<title>Lua Mod API</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Lua_Mod_API&amp;diff=1571"/>
		<updated>2005-11-07T06:47:57Z</updated>

		<summary type="html">&lt;p&gt;Bani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOEDITSECTION__&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot; style=&amp;quot;background: #FFFFCC; padding: 2px; border: 2px solid #000000;&amp;quot;&amp;gt;The latest version of the lua-enabled ETPro qagame is etpro-lua-1 and can be downloaded [http://etpro.anime.net/etpro-lua-1.zip here].&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ETPro now supports serverside mods via the [http://www.lua.org/ lua] scripting language.&lt;br /&gt;
&lt;br /&gt;
ETPro has an embedded lua 5.0.2 interpreter, and if present will load user-defined scripts from the etpro directory. ETPro also provides an &amp;quot;et&amp;quot; library of function calls for lua to access the server engine, and provides callbacks so a serverside mod may trigger on specific server events.&lt;br /&gt;
&lt;br /&gt;
The following standard lua libraries are initialized by default and available to ETPro lua scripts:&lt;br /&gt;
basic, table, i/o, string, math.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==server commands==&lt;br /&gt;
===lua_status===&lt;br /&gt;
:lists all currently loaded lua modules.&lt;br /&gt;
&lt;br /&gt;
==cvars==&lt;br /&gt;
===lua_modules===&lt;br /&gt;
:(default &amp;quot;&amp;quot;, disabled)&lt;br /&gt;
:space separated list of lua modules for ETPro to load. modules will be run in the order listed.&lt;br /&gt;
&lt;br /&gt;
===lua_allowedmodules===&lt;br /&gt;
:(default &amp;quot;&amp;quot;, disabled)&lt;br /&gt;
:if set, only lua modules with the matching sha1 signatures listed in this cvar will be allowed to load.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
changing either cvar will cause all currently loaded modules to quit and be unloaded until the next map_restart.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==et library calls==&lt;br /&gt;
&lt;br /&gt;
===modules===&lt;br /&gt;
et.RegisterModname( &#039;&#039;&#039;modname&#039;&#039;&#039; )&lt;br /&gt;
:Registers a descriptive string &#039;&#039;&#039;modname&#039;&#039;&#039; for this mod.&lt;br /&gt;
&#039;&#039;&#039;vmnumber&#039;&#039;&#039; = et.FindSelf()&lt;br /&gt;
:Returns a number indicating the VM slot the current mod is loaded into.&lt;br /&gt;
&#039;&#039;&#039;modname&#039;&#039;&#039;, &#039;&#039;&#039;signature&#039;&#039;&#039; = et.FindMod( &#039;&#039;&#039;vmnumber&#039;&#039;&#039; )&lt;br /&gt;
:Returns the &#039;&#039;&#039;modname&#039;&#039;&#039; and sha1 &#039;&#039;&#039;signature&#039;&#039;&#039; for the mod loaded in the VM slot &#039;&#039;&#039;vmnumber&#039;&#039;&#039;. Returns nil, nil if the VM slot is invalid.&lt;br /&gt;
&#039;&#039;&#039;success&#039;&#039;&#039; = et.IPCSend( &#039;&#039;&#039;vmnumber&#039;&#039;&#039;, &#039;&#039;&#039;message&#039;&#039;&#039; )&lt;br /&gt;
:Sends the string &#039;&#039;&#039;message&#039;&#039;&#039; to the mod in the VM slot indicated by &#039;&#039;&#039;vmnumber&#039;&#039;&#039;. The mod receiving &#039;&#039;&#039;message&#039;&#039;&#039; must have an &#039;&#039;et_IPCReceive()&#039;&#039; callback. If the message is successfully sent, &#039;&#039;&#039;success&#039;&#039;&#039; will be 1. On failure it will be 0.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===printing===&lt;br /&gt;
et.G_Print( &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Prints the string &#039;&#039;&#039;text&#039;&#039;&#039; to the server console.&lt;br /&gt;
et.G_LogPrint( &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Prints the string &#039;&#039;&#039;text&#039;&#039;&#039; to the server console and writes it to the server log.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===argument handling===&lt;br /&gt;
&#039;&#039;&#039;args&#039;&#039;&#039; = et.ConcatArgs( &#039;&#039;&#039;index&#039;&#039;&#039; )&lt;br /&gt;
:Returns all arguments beginning from &#039;&#039;&#039;index&#039;&#039;&#039; concatenated into a single string &#039;&#039;&#039;args&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;argcount&#039;&#039;&#039; = et.trap_Argc()&lt;br /&gt;
:Returns a number indicating the number of command line arguments in the command buffer.&lt;br /&gt;
&#039;&#039;&#039;arg&#039;&#039;&#039; = et.trap_Argv( &#039;&#039;&#039;argnum&#039;&#039;&#039; )&lt;br /&gt;
:Returns the contents of the command line argument &#039;&#039;&#039;argnum&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===cvars===&lt;br /&gt;
&#039;&#039;&#039;cvarvalue&#039;&#039;&#039; = et.trap_Cvar_Get( &#039;&#039;&#039;cvarname&#039;&#039;&#039; )&lt;br /&gt;
:Returns the value of the cvar &#039;&#039;&#039;cvarname&#039;&#039;&#039;&lt;br /&gt;
et.trap_Cvar_Set( &#039;&#039;&#039;cvarname&#039;&#039;&#039;, &#039;&#039;&#039;cvarvalue&#039;&#039;&#039; )&lt;br /&gt;
:Sets the cvar &#039;&#039;&#039;cvarname&#039;&#039;&#039; to &#039;&#039;&#039;cvarvalue&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===configstrings===&lt;br /&gt;
&#039;&#039;&#039;configstringvalue&#039;&#039;&#039; = et.trap_GetConfigstring( &#039;&#039;&#039;index&#039;&#039;&#039; )&lt;br /&gt;
:Returns the string &#039;&#039;&#039;configstringvalue&#039;&#039;&#039; containing the contents of the configstring &#039;&#039;&#039;index&#039;&#039;&#039;&lt;br /&gt;
et.trap_SetConfigstring( &#039;&#039;&#039;index&#039;&#039;&#039;, &#039;&#039;&#039;configstringvalue&#039;&#039;&#039; )&lt;br /&gt;
:Sets the configstring &#039;&#039;&#039;index&#039;&#039;&#039; to the string &#039;&#039;&#039;configstringvalue&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===server===&lt;br /&gt;
et.trap_SendConsoleCommand( &#039;&#039;&#039;when&#039;&#039;&#039;, &#039;&#039;&#039;command&#039;&#039;&#039; )&lt;br /&gt;
:Sends the command &#039;&#039;&#039;command&#039;&#039;&#039; to the server console, to be executed &#039;&#039;&#039;when&#039;&#039;&#039; (see et.EXEC_* constants)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===clients===&lt;br /&gt;
et.trap_DropClient( &#039;&#039;&#039;clientnum&#039;&#039;&#039;, &#039;&#039;&#039;reason&#039;&#039;&#039;, &#039;&#039;&#039;ban_time&#039;&#039;&#039; )&lt;br /&gt;
:Disconnects &#039;&#039;&#039;clientnum&#039;&#039;&#039; from the server, with descriptive string &#039;&#039;&#039;reason&#039;&#039;&#039; reported to clients. &#039;&#039;&#039;ban_time&#039;&#039;&#039; is the time in seconds to ban the client from the server. &#039;&#039;&#039;ban_time&#039;&#039;&#039; is optional and may be entirely omitted, in which case the ban time defaults to the cvar &#039;&#039;b_defaultbantime&#039;&#039;&lt;br /&gt;
et.trap_SendServerCommand( &#039;&#039;&#039;clientnum&#039;&#039;&#039;, &#039;&#039;&#039;command&#039;&#039;&#039; )&lt;br /&gt;
:Sends the command &#039;&#039;&#039;command&#039;&#039;&#039; to the client &#039;&#039;&#039;clientnum&#039;&#039;&#039;. If &#039;&#039;&#039;clientnum&#039;&#039;&#039; is -1, the &#039;&#039;&#039;command&#039;&#039;&#039; is broadcast to all connected clients.&lt;br /&gt;
et.G_Say( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;mode&#039;&#039;&#039;, &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Sends a chat command on behalf of client &#039;&#039;&#039;clientNum&#039;&#039;&#039; with the mode &#039;&#039;&#039;mode&#039;&#039;&#039; (see et.SAY_* constants) and chat text &#039;&#039;&#039;text&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===userinfo===&lt;br /&gt;
&#039;&#039;&#039;userinfo&#039;&#039;&#039; = et.trap_GetUserinfo( &#039;&#039;&#039;clientnum&#039;&#039;&#039; )&lt;br /&gt;
:Returns the contents of the userinfo string for the client &#039;&#039;&#039;clientnum&#039;&#039;&#039;&lt;br /&gt;
et.trap_SetUserinfo( &#039;&#039;&#039;clientnum&#039;&#039;&#039;, &#039;&#039;&#039;userinfo&#039;&#039;&#039; )&lt;br /&gt;
:Sets the userinfo string for the client &#039;&#039;&#039;clientnum&#039;&#039;&#039; to &#039;&#039;&#039;userinfo&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===string utility functions===&lt;br /&gt;
&#039;&#039;&#039;infostring&#039;&#039;&#039; = et.Info_RemoveKey( &#039;&#039;&#039;infostring&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039; )&lt;br /&gt;
:Removes key &#039;&#039;&#039;key&#039;&#039;&#039; from infostring &#039;&#039;&#039;infostring&#039;&#039;&#039; and returns the modified infostring.&lt;br /&gt;
&#039;&#039;&#039;infostring&#039;&#039;&#039; = et.Info_SetValueForKey( &#039;&#039;&#039;infostring&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039;, &#039;&#039;&#039;value&#039;&#039;&#039; )&lt;br /&gt;
:Sets the key &#039;&#039;&#039;key&#039;&#039;&#039; in the infostring &#039;&#039;&#039;infostring&#039;&#039;&#039; to &#039;&#039;&#039;value&#039;&#039;&#039; and returns the modified infostring.&lt;br /&gt;
&#039;&#039;&#039;infostring&#039;&#039;&#039; = et.Info_ValueForKey( &#039;&#039;&#039;infostring&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039; )&lt;br /&gt;
:Returns the value of the key &#039;&#039;&#039;key&#039;&#039;&#039; in the infostring &#039;&#039;&#039;infostring&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;cleanstring&#039;&#039;&#039; = et.Q_CleanStr( &#039;&#039;&#039;string&#039;&#039;&#039; )&lt;br /&gt;
:Returns &#039;&#039;&#039;string&#039;&#039;&#039; stripped of all color codes&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ET filesystem===&lt;br /&gt;
&#039;&#039;&#039;fd&#039;&#039;&#039;, &#039;&#039;&#039;len&#039;&#039;&#039; = et.trap_FS_FOpenFile( &#039;&#039;&#039;filename&#039;&#039;&#039;, &#039;&#039;&#039;mode&#039;&#039;&#039; )&lt;br /&gt;
:Attempts to open the file &#039;&#039;&#039;filename&#039;&#039;&#039; with the access mode &#039;&#039;&#039;mode&#039;&#039;&#039; (see et.FS_ constants). Returns the filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039; and file length &#039;&#039;&#039;len&#039;&#039;&#039;. On error, &#039;&#039;&#039;len&#039;&#039;&#039; returns -1.&lt;br /&gt;
&#039;&#039;&#039;filedata&#039;&#039;&#039; = et.trap_FS_Read( fd, count )&lt;br /&gt;
:Reads &#039;&#039;&#039;count&#039;&#039;&#039; bytes from filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039;.&lt;br /&gt;
&#039;&#039;&#039;count&#039;&#039;&#039; = et.trap_FS_Write( &#039;&#039;&#039;filedata&#039;&#039;&#039;, &#039;&#039;&#039;count&#039;&#039;&#039;, &#039;&#039;&#039;fd&#039;&#039;&#039; )&lt;br /&gt;
:Attempts to write &#039;&#039;&#039;count&#039;&#039;&#039; bytes of &#039;&#039;&#039;filedata&#039;&#039;&#039; to filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039;. Returns number of bytes successfully written.&lt;br /&gt;
et.trap_FS_Rename( &#039;&#039;&#039;oldname&#039;&#039;&#039;, &#039;&#039;&#039;newname&#039;&#039;&#039; )&lt;br /&gt;
:Renames file &#039;&#039;&#039;oldname&#039;&#039;&#039; to &#039;&#039;&#039;newname&#039;&#039;&#039;.&lt;br /&gt;
et.trap_FS_FCloseFile( &#039;&#039;&#039;fd&#039;&#039;&#039; )&lt;br /&gt;
:Closes filedescriptor &#039;&#039;&#039;fd&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===indexes===&lt;br /&gt;
&#039;&#039;&#039;soundindex&#039;&#039;&#039; = et.G_SoundIndex( &#039;&#039;&#039;filename&#039;&#039;&#039; )&lt;br /&gt;
:Returns an index to the soundfile indicated by &#039;&#039;&#039;filename&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;modelindex&#039;&#039;&#039; = et.G_ModelIndex( &#039;&#039;&#039;filename&#039;&#039;&#039; )&lt;br /&gt;
:Returns an index to the model indicated by &#039;&#039;&#039;filename&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===sound===&lt;br /&gt;
et.G_globalSound( &#039;&#039;&#039;sound&#039;&#039;&#039; )&lt;br /&gt;
:Plays the global sound indicated by the filename &#039;&#039;&#039;sound&#039;&#039;&#039;.&lt;br /&gt;
et.G_Sound( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;soundindex&#039;&#039;&#039; )&lt;br /&gt;
:Plays the sound &#039;&#039;&#039;soundindex&#039;&#039;&#039; at the location of entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===miscellaneous===&lt;br /&gt;
&#039;&#039;&#039;milliseconds&#039;&#039;&#039; = et.trap_Milliseconds()&lt;br /&gt;
:Returns a number indicating the current server time in milliseconds.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===entities===&lt;br /&gt;
&#039;&#039;&#039;entnum&#039;&#039;&#039; = et.G_Spawn()&lt;br /&gt;
:Spawns a new entity and returns the new entity number.&lt;br /&gt;
&#039;&#039;&#039;entnum&#039;&#039;&#039; = et.G_TempEntity( &#039;&#039;&#039;origin&#039;&#039;&#039;, &#039;&#039;&#039;event&#039;&#039;&#039; )&lt;br /&gt;
:Spawns a new TempEntity of event type &#039;&#039;&#039;event&#039;&#039;&#039; and places it at &#039;&#039;&#039;origin&#039;&#039;&#039; in the world.&lt;br /&gt;
et.G_FreeEntity( &#039;&#039;&#039;entnum&#039;&#039;&#039; )&lt;br /&gt;
:Frees the entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;spawnval&#039;&#039;&#039; = et.G_GetSpawnVar( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039; )&lt;br /&gt;
:Returns the value of spawnvar &#039;&#039;&#039;key&#039;&#039;&#039; for entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
et.G_SetSpawnVar( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;key&#039;&#039;&#039;, &#039;&#039;&#039;value&#039;&#039;&#039; )&lt;br /&gt;
:Sets the spawnvar &#039;&#039;&#039;key&#039;&#039;&#039; to &#039;&#039;&#039;value&#039;&#039;&#039; for entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
integer entnum = et.G_SpawnGEntityFromSpawnVars( string spawnvar, string spawnvalue, ... )&amp;lt;br&amp;gt;&lt;br /&gt;
et.trap_LinkEntity( &#039;&#039;&#039;entnum&#039;&#039;&#039; )&lt;br /&gt;
:Links the entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
et.trap_UnlinkEntity( &#039;&#039;&#039;entnum&#039;&#039;&#039; )&lt;br /&gt;
:Unlinks the entity &#039;&#039;&#039;entnum&#039;&#039;&#039;&lt;br /&gt;
(variable) = et.gentity_get( int entnum, string fieldname )&amp;lt;br&amp;gt;&lt;br /&gt;
et.gentity_set( int entnum, string fieldname, (variable) )&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==callbacks==&lt;br /&gt;
&lt;br /&gt;
===qagame execution===&lt;br /&gt;
et_InitGame( &#039;&#039;&#039;levelTime&#039;&#039;&#039;, &#039;&#039;&#039;randomSeed&#039;&#039;&#039;, &#039;&#039;&#039;restart&#039;&#039;&#039; )&lt;br /&gt;
:Called when qagame initializes. &#039;&#039;&#039;levelTime&#039;&#039;&#039; is the current level time in milliseconds. &#039;&#039;&#039;randomSeed&#039;&#039;&#039; is a number that can be used to seed random number generators. &#039;&#039;&#039;restart&#039;&#039;&#039; indicates if et_InitGame() is being called due to a map restart (1) or not (0).&lt;br /&gt;
et_ShutdownGame( &#039;&#039;&#039;restart&#039;&#039;&#039; )&lt;br /&gt;
:Called when qagame shuts down. &#039;&#039;&#039;restart&#039;&#039;&#039; indicates if the shutdown is being called due to a map_restart (1) or not (0).&lt;br /&gt;
et_RunFrame( &#039;&#039;&#039;levelTime&#039;&#039;&#039; )&lt;br /&gt;
:Called when qagame runs a server frame. &#039;&#039;&#039;levelTime&#039;&#039;&#039; is the current level time in milliseconds.&lt;br /&gt;
et_Quit()&lt;br /&gt;
:Called when ETPro unloads the mod. The mod should close all open filedescriptors and perform all cleanup.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===client management===&lt;br /&gt;
&#039;&#039;&#039;rejectreason&#039;&#039;&#039; = et_ClientConnect( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;firstTime&#039;&#039;&#039;, &#039;&#039;&#039;isBot&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client attempts to connect to the server. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id, &#039;&#039;&#039;firstTime&#039;&#039;&#039; indicates if this is a new connection (1) or a reconnection (0). &#039;&#039;&#039;isBot&#039;&#039;&#039; indicates if the client is a bot (1) or not (0). If the mod accepts the connection, it should return nil. Otherwise, the mod should return a string describing the reason the client connection was rejected.&lt;br /&gt;
et_ClientDisconnect( &#039;&#039;&#039;clientNum&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client disconnects. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id.&lt;br /&gt;
et_ClientBegin( &#039;&#039;&#039;clientNum&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client begins (becomes active, and enters the gameworld). &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id.&lt;br /&gt;
et_ClientUserinfoChanged( &#039;&#039;&#039;clientNum&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client&#039;s Userinfo string has changed. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===commands===&lt;br /&gt;
&#039;&#039;&#039;intercepted&#039;&#039;&#039; = et_ClientCommand( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;command&#039;&#039;&#039; )&lt;br /&gt;
:Called when a command is received from a client. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id. &#039;&#039;&#039;command&#039;&#039;&#039; is the command. The mod should return 1 if the command was intercepted by the mod, and 0 if the command was ignored by the mod and should be passed through to the server (and other mods in the chain).&lt;br /&gt;
&#039;&#039;&#039;intercepted&#039;&#039;&#039; = et_ConsoleCommand()&lt;br /&gt;
:Called when a command is entered on the server console. The mod should return 1 if the command was intercepted by the mod, and 0 if the command was ignored by the mod and should be passed through to the server (and other mods in the chain).&lt;br /&gt;
&#039;&#039;&#039;intercepted&#039;&#039;&#039; = et_ClientSay( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;mode&#039;&#039;&#039;, &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client sends a chat command. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id. &#039;&#039;&#039;mode&#039;&#039;&#039; is the chat mode (see et.SAY_* constants). &#039;&#039;&#039;text&#039;&#039;&#039; is the chat text. The mod should return 1 if the command was intercepted by the mod, and 0 if the command was ignored by the mod and should be passed through to the server (and other mods in the chain)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===miscellaneous===&lt;br /&gt;
et_IPCReceive( &#039;&#039;&#039;vmnumber&#039;&#039;&#039;, &#039;&#039;&#039;message&#039;&#039;&#039; )&lt;br /&gt;
:Called when another mod sends an et.IPCSend() message to this mod. &#039;&#039;&#039;vmnumber&#039;&#039;&#039; is the VM slot number of the sender, and &#039;&#039;&#039;message&#039;&#039;&#039; is the message.&lt;br /&gt;
et_Print( &#039;&#039;&#039;text&#039;&#039;&#039; )&lt;br /&gt;
:Called whenever the server or qagame prints a string to the console.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==predefined constants==&lt;br /&gt;
et.EXEC_NOW&amp;lt;br&amp;gt;&lt;br /&gt;
et.EXEC_INSERT&amp;lt;br&amp;gt;&lt;br /&gt;
et.EXEC_APPEND&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_READ&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_WRITE&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_APPEND&amp;lt;br&amp;gt;&lt;br /&gt;
et.FS_APPEND_SYNC&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_ALL&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_TEAM&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_BUDDY&amp;lt;br&amp;gt;&lt;br /&gt;
et.SAY_TEAMNL&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
et.HOSTARCH&lt;br /&gt;
:set to WIN32 or UNIX depending on the host architecture qagame is running on.&lt;br /&gt;
LUA_PATH&lt;br /&gt;
:set to fs_homepath/fs_game/?.lua in order to ease use of the [http://www.lua.org/pil/8.1.html require] function.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==configs==&lt;br /&gt;
If a config is loaded, all modules are shutdown and reloaded. If a &#039;&#039;certified&#039;&#039; config is loaded, all modules are shutdown and reloaded, and additionally the following functions are disabled: &#039;&#039;&#039;require()&#039;&#039;&#039;, &#039;&#039;&#039;loadfile()&#039;&#039;&#039;, &#039;&#039;&#039;loadlib()&#039;&#039;&#039;, &#039;&#039;&#039;loadstring()&#039;&#039;&#039;, &#039;&#039;&#039;dofile()&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
&lt;br /&gt;
Q: OMG I hate the libary prefix et.* on everything!!11!1oneone&amp;lt;br&amp;gt;&lt;br /&gt;
A: table.foreach(et, function (func, value) _G[func] = value; end)&lt;br /&gt;
&lt;br /&gt;
Q: How do a re-load my lua file without restarting the whole server ?&amp;lt;br&amp;gt;&lt;br /&gt;
A: Use the following in the server console:&lt;br /&gt;
 lua_modules &amp;quot;&amp;quot;&lt;br /&gt;
 lua_modules &amp;quot;mymod.lua&amp;quot; ; map_restart&lt;br /&gt;
Note that lua_modules &amp;quot;&amp;quot; must be on a line by itself.&lt;br /&gt;
&lt;br /&gt;
Q: Can I see some sample code?&amp;lt;br&amp;gt;&lt;br /&gt;
A: [[ETPro:Lua Sample Code]]&lt;br /&gt;
&lt;br /&gt;
Q: Is there a list of [[ETPro]] mods?&amp;lt;br&amp;gt;&lt;br /&gt;
A: Yes, [[:Category:ETPro:Mods|here]].&lt;br /&gt;
&lt;br /&gt;
[[Category:ETPro]]&lt;br /&gt;
[[Category:ETPro:Mods]]&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=ETTV:Server_Configuration&amp;diff=1564</id>
		<title>ETTV:Server Configuration</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=ETTV:Server_Configuration&amp;diff=1564"/>
		<updated>2005-11-06T10:28:06Z</updated>

		<summary type="html">&lt;p&gt;Bani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;dot_graph&amp;gt;&lt;br /&gt;
digraph ettv {&lt;br /&gt;
master -&amp;gt; slave1&lt;br /&gt;
master -&amp;gt; slave2&lt;br /&gt;
slave1 -&amp;gt; &amp;quot;client1..&amp;quot;&lt;br /&gt;
slave1 -&amp;gt; &amp;quot;..client50&amp;quot;&lt;br /&gt;
slave2 -&amp;gt; &amp;quot;client51..&amp;quot;&lt;br /&gt;
slave2 -&amp;gt; &amp;quot;..client100&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dot_graph&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Installation - &amp;quot;Master&amp;quot; (gameserver)==&lt;br /&gt;
&lt;br /&gt;
Copy ettv.x86 to the same directory your etded.x86 is located.&lt;br /&gt;
Start your gameserver as normal, but run ettv.x86 instead of etded.x86.&lt;br /&gt;
&lt;br /&gt;
===Set some cvars===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ettv_sv_maxslaves&#039;&#039;&#039; (default 0, no slave connections allowed)&lt;br /&gt;
:Number of ettv slaves allowed to connect.&lt;br /&gt;
:&#039;&#039;Note:&#039;&#039; Slave slots are always reserved, like private slots.&lt;br /&gt;
&#039;&#039;&#039;ettv_password&#039;&#039;&#039; (default &amp;quot;&amp;quot;, no slave connections allowed) &lt;br /&gt;
:Password for ettv slaves.&lt;br /&gt;
:Must be set, or no slaves will be able to connect!&lt;br /&gt;
&#039;&#039;&#039;b_ettv_flags&#039;&#039;&#039; (default 1)&lt;br /&gt;
:1 = prevent slaves from being callvote kicked&lt;br /&gt;
:2 = grant shoutcaster status to slaves&lt;br /&gt;
:values can be added together, eg 3 for both features.&lt;br /&gt;
&lt;br /&gt;
===Playing on the master===&lt;br /&gt;
Players may now connect to your gameserver as normal.&lt;br /&gt;
&lt;br /&gt;
==Installation - &amp;quot;Slave&amp;quot; (broadcast server)==&lt;br /&gt;
&lt;br /&gt;
Copy ettv.x86 to the same directory your etded.x86 is located.&lt;br /&gt;
Copy tvgame.mp.i386.so to the same directory as your etpro/qagame.mp.i386.so is located.&lt;br /&gt;
&lt;br /&gt;
===Set some cvars===&lt;br /&gt;
&#039;&#039;&#039;sv_maxclients&#039;&#039;&#039;&lt;br /&gt;
:Number of spectator clients to allow. This number is only limited by available cpu and memory.&lt;br /&gt;
:Some guidelines when provisioning a broadcast server:&lt;br /&gt;
:*100 spectator slots will require ~ 128mb ram. Use com_hunkmegs to set this.&lt;br /&gt;
:*100 spectator slots will require ~ 768kbyte/sec (6mbits), roughly 6kbyte/sec per client&lt;br /&gt;
:*100 spectator slots will take ~ 80% cpu of a Xeon 2.2ghz&lt;br /&gt;
:*Each slave will require ~20-40kbyte/sec from the master.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ettv_clientname&#039;&#039;&#039; (default &amp;quot;ETTV&amp;quot;)&lt;br /&gt;
:Playername the slave will use when connecting to the master, eg &amp;quot;ETTV-xyz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ettv_delay&#039;&#039;&#039; (default 0, disabled)&lt;br /&gt;
:number of seconds for slave to delay the master feed. Recording/playback chains should no longer be needed, and slaves should always maintain an exact delay from the master server. &lt;br /&gt;
:&#039;&#039;note&#039;&#039;: this should ONLY be set on the slave.&lt;br /&gt;
:&#039;&#039;note&#039;&#039;: only supported in ettv beta8 and later&lt;br /&gt;
&lt;br /&gt;
===Chat passwords===&lt;br /&gt;
In order to curb the rampant abuse of ettv chat, admins may set &amp;quot;chat passwords&amp;quot; on their servers. If enabled, viewers are not allowed to chat unless they have a password. You can define as many passwords as you like, so you can easily track down individual abusers and limit the damage of stolen passwords.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ettv_chatpasswords&#039;&#039;&#039; (default 0, disabled)&lt;br /&gt;
:number of chat passwords defined.&lt;br /&gt;
&#039;&#039;&#039;ettv_chatpassword&#039;&#039;&#039;(1-99999)&lt;br /&gt;
:individual chat passwords.&lt;br /&gt;
&lt;br /&gt;
viewers use &amp;lt;tt&amp;gt;/chatpassword &amp;lt;b&amp;gt;&amp;lt;i&amp;gt;&amp;lt;password&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/tt&amp;gt; to login.&lt;br /&gt;
&lt;br /&gt;
if logged in, ettv chats will be tagged with a number in parentheses identifying which chat password the viewer is using. &lt;br /&gt;
===Misc commands for viewers===&lt;br /&gt;
;For ettv beta 4 and above&lt;br /&gt;
* spectators may &amp;lt;tt&amp;gt;/ignore&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;/unignore&amp;lt;/tt&amp;gt; other spectators&lt;br /&gt;
* &amp;lt;i&amp;gt;semiadmin&amp;lt;/i&amp;gt; functionality now works for slaves&lt;br /&gt;
* rcon may now mute/unmute specs &lt;br /&gt;
&lt;br /&gt;
===Connect the slave===&lt;br /&gt;
Now start your slave server by running ettv.x86&lt;br /&gt;
&lt;br /&gt;
Tell the slave server to connect up to the master server:&lt;br /&gt;
:&amp;lt;tt&amp;gt;tv connect master.ip.address:port &amp;lt;i&amp;gt;&amp;lt;b&amp;gt;ettv_password&amp;lt;/b&amp;gt;(required)&amp;lt;/i&amp;gt; &amp;lt;i&amp;gt;&amp;lt;b&amp;gt;g_password&amp;lt;/b&amp;gt;(if the master has a g_password set)&amp;lt;/i&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have configured everything correctly, the slave should connect to the master.&lt;br /&gt;
Clients should now be able to connect to the slave and spectate the game in progress.&lt;br /&gt;
&lt;br /&gt;
This is a &amp;quot;live broadcast&amp;quot; with no delay.&lt;br /&gt;
&lt;br /&gt;
===Disconnect the slave===&lt;br /&gt;
To tell the slave to disconnect from the master:&lt;br /&gt;
:&amp;lt;tt&amp;gt;tv disconnect&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Slave Chaining===&lt;br /&gt;
;something cool goes here&lt;br /&gt;
&lt;br /&gt;
==ETTV Demos==&lt;br /&gt;
You may record the match in progress to a file, with the command:&lt;br /&gt;
:&amp;lt;tt&amp;gt;record &amp;lt;&#039;&#039;&#039;demo name&#039;&#039;&#039;&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
If you omit the demo name, ettv will start recording using a filename of demoXXXX where XXXX is the first available number starting from 0000.&lt;br /&gt;
&lt;br /&gt;
Demos will stop recording when a map changes.&lt;br /&gt;
&lt;br /&gt;
To stop recording a demo:&lt;br /&gt;
:&amp;lt;tt&amp;gt;stoprecord&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To play back a recorded demo:&lt;br /&gt;
:&amp;lt;tt&amp;gt;demo &amp;lt;&#039;&#039;&#039;demo name&#039;&#039;&#039;&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To check the status of an ettv slave:&lt;br /&gt;
:&amp;lt;tt&amp;gt;tv status&amp;lt;/tt&amp;gt;&lt;br /&gt;
This will tell you if the slave is connected to a master, or if it is currently playing back a demo.&lt;br /&gt;
&lt;br /&gt;
To fastforward a demo:&lt;br /&gt;
:&amp;lt;tt&amp;gt;ff &amp;lt;i&amp;gt;&amp;lt;seconds&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
Eg &amp;lt;tt&amp;gt;ff 30&amp;lt;/tt&amp;gt; will fast foward 30 seconds. Fast forward stops at map restarts, so you can safely ff 999 to fast forward through a warmup. &lt;br /&gt;
:&#039;&#039;note&#039;&#039;: requires ettv beta 7 or later&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Autorecording demos===&lt;br /&gt;
ettv is able to automatically continuously record demos, creating new demofiles when the map changes. To do this, set the cvar ettv_autorecord to 1. ettv will start recording demos with the name demoXXXX where XXXX is a number starting at 0000 and incrementing on each map change.&lt;br /&gt;
&lt;br /&gt;
Server admins may find it useful to use the demo recording feature of ettv to record matches, instead of requiring individual players to record them. An ettv demo records everything that happens on a server, including all player viewpoints.&lt;br /&gt;
&lt;br /&gt;
===How to create demo based delayed feeds===&lt;br /&gt;
Autorecording demos is the first half of the process for delayed feeds. Typically you would run a passworded slave server with the smallest number of sv_maxclients possible. No spectators should connect to this server. The only purpose of this slave is to connect up to the master and record the match to sequentially numbered demofiles.&lt;br /&gt;
&lt;br /&gt;
Now start up a slave, and tell it to broadcast the demo being recorded.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tt&amp;gt;demo demo0000&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you wait approx. 60 seconds after the master begins recording before issuing this command to your slaves, then you have a 60 second delay on your broadcast.&lt;br /&gt;
&lt;br /&gt;
If you want slaves to automatically switch to the next demo when the end of the demo is reached (eg on a map change), you would set the cvar ettv_autoplay to 1. If a slave is playing demo0000 and it reaches the end, it will then try to play demo0001 and so on.&lt;br /&gt;
&lt;br /&gt;
Disadvantage of this method: It is not automated in ettv itself, though admins can script it.&lt;br /&gt;
Advantage of this method: You may run multiple broadcast servers from the same single demo stream.&lt;br /&gt;
&lt;br /&gt;
Automated delayed feeds are supported in ettv beta 8. See the above.&lt;br /&gt;
&lt;br /&gt;
==Troubleshooting==&lt;br /&gt;
&lt;br /&gt;
* The slave server must be running the same fs_game setting as the master server.&lt;br /&gt;
* The slave server must have a copy of every map pk3 the master server is using.&lt;br /&gt;
* If the master server loads a map the slave server doesn&#039;t have, the slave will get stuck.&lt;br /&gt;
* Spectators will be forced to download any custom pk3 you are using.&lt;br /&gt;
* It is a good idea to keep the master server pk3 list to a minimum.&lt;br /&gt;
* If you are using the autorecord/autoplay feature for running delayed feeds, you will usually want to make sure you clear out the demos directory first. Autorecording will start numbering demofiles using the first available number, so if you have old recorded demos then ettv might start recording from eg demo0017. If your scripts expect to start playback from demo0000 then you might end up broadcasting a game recorded at some earlier date...&lt;br /&gt;
&lt;br /&gt;
==Miscellaneous==&lt;br /&gt;
&lt;br /&gt;
Slaves may send chats to the master with the command msay&lt;br /&gt;
Slaves may list players on the master with the command players&lt;br /&gt;
&lt;br /&gt;
==Performance tuning==&lt;br /&gt;
&lt;br /&gt;
Spectator servers with large numbers of clients (eg &amp;gt;100) will push the OS very hard with huge amounts of UDP traffic. The default OS buffer settings for Linux are inadequate and can hurt performance, causing lag and/or disconnects.&lt;br /&gt;
&lt;br /&gt;
If you get messages like&lt;br /&gt;
:&amp;lt;tt&amp;gt;NET_SendPacket ERROR: No buffer space available to 192.168.120.142:27960&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then you definitely need to increase your kernel network buffers.&lt;br /&gt;
&lt;br /&gt;
Large spectator servers should increase the kernel buffers.&lt;br /&gt;
&lt;br /&gt;
The following commands should be issued as root on linux:&lt;br /&gt;
:&amp;lt;tt&amp;gt;echo &amp;quot;524288&amp;quot; &amp;gt; /proc/sys/net/core/rmem_max&amp;lt;/tt&amp;gt;&lt;br /&gt;
:&amp;lt;tt&amp;gt;echo &amp;quot;524288&amp;quot; &amp;gt; /proc/sys/net/core/wmem_max&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FreeBSD can try this:&lt;br /&gt;
:&amp;lt;tt&amp;gt;sysctl -w net.inet.udp.recvspace=65535&amp;lt;/tt&amp;gt;&lt;br /&gt;
:&amp;lt;tt&amp;gt;sysctl -w net.inet.udp.maxdgram=57344&amp;lt;/tt&amp;gt;&lt;br /&gt;
:&amp;lt;tt&amp;gt;sysctl -w kern.ipc.maxsockbuf=8388608&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Network tuning cvars===&lt;br /&gt;
;The following are only available in ettv beta 7 and later.&lt;br /&gt;
By default, et uses small packets of 1400 bytes or less to send to clients. If messages need to be larger, they are &#039;fragmented&#039; and sent over several server frames. ettv slave messages tend to be large and often fragment. ettv normally tries to send slaves all fragments at once to avoid jittery playback, but some networks / OSes handle this badly. ettv beta 7 introduces new controls so admins can optimize ettv for their individual network.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ettv_netblast&#039;&#039;&#039; (default 1)&lt;br /&gt;
:by default, ettv tries to send all fragments at once. some networks may handle this badly. setting this to 0 disables. warning: setting this to 0 without increasing ettv_mtu will result in severely laggy slave playback.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ettv_mtu&#039;&#039;&#039; (default 1400)&lt;br /&gt;
:; master only&lt;br /&gt;
:if your network / os supports it, you can set this to large values (eg 16000) to prevent message fragmentation and provide smoother ettv links. this cvar has no effect on normal ET clients. note: ettv_mtu must currently be set from commandline, it cannot be changed on the fly (yet).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ettv_tv_iptos&#039;&#039;&#039; (default 0)&lt;br /&gt;
:you can set the ip type of service field of ettv link packets. if your network/ISP supports it, you can use a value like 16 (&amp;quot;minimize delay&amp;quot;) to prioritize ettv link packets over others on the network.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ettv_sv_iptos&#039;&#039;&#039; (default 0)&lt;br /&gt;
:same as ettv_tv_iptos, but affects packets for normal ET clients.&lt;br /&gt;
&lt;br /&gt;
[[Category:ETTV]]&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Main_Page&amp;diff=1524</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Main_Page&amp;diff=1524"/>
		<updated>2005-11-05T18:00:49Z</updated>

		<summary type="html">&lt;p&gt;Bani: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span style=&amp;quot;color:#cf7606; font-size:200%;&amp;quot;&amp;gt;&#039;&#039;&#039;Welcome to&#039;&#039;&#039;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;color:#005288; font-size:200%;&amp;quot;&amp;gt;&#039;&#039;&#039;[[WolfWiki]]&#039;&#039;&#039;&amp;lt;/span&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[WolfWiki]] is a collaborative site for the ETPro / ETTV / BayonET community. Anyone with a [http://bani.anime.net/banimod/forums/ Banimod Forums] account may edit pages. If you do not have an account, you may [http://bani.anime.net/banimod/forums/profile.php?mode=register apply] for one. Please follow the [[Help:Editing]] guidelines when editing pages.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;There are currently {{NUMBEROFARTICLES}} [[:Special:Allpages|articles available]].&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==[[:Category:ETPro|ETPro]]==&lt;br /&gt;
{{ETPro_Topics}}&lt;br /&gt;
==[[:Category:ETTV|ETTV]]==&lt;br /&gt;
[http://bani.anime.net/banimod/forums/viewforum.php?f=18 Discussion Forums]&amp;lt;br&amp;gt;&lt;br /&gt;
[[ETTV:Server Configuration|Server Configuration]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[ETTV:Viewer&#039;s Guide|Viewer&#039;s Guide]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==[[:Category:BayonET|BayonET]]==&lt;br /&gt;
[http://bani.anime.net/banimod/forums/viewforum.php?f=10 Discussion Forums]&lt;br /&gt;
&amp;lt;!-- [[BayonET:Server Configuration|Server Configuration]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[BayonET:Client Configuration|Client Configuration]] --&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bani</name></author>
	</entry>
</feed>