<?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=Vetinari</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=Vetinari"/>
	<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php/Special:Contributions/Vetinari"/>
	<updated>2026-11-08T12:47:55Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=User:Vetinari&amp;diff=2695</id>
		<title>User:Vetinari</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=User:Vetinari&amp;diff=2695"/>
		<updated>2007-02-24T16:47:43Z</updated>

		<summary type="html">&lt;p&gt;Vetinari: /* ETPub / NoQuarter style say substitutions */ forgot  player class&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Reviving Spree Lua ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;reviving sprees&amp;quot; in the style of etadmin_mod&#039;s killing sprees: [http://ankh-morp.org/~vetinari/projects/rspree/ rspree_mod] &lt;br /&gt;
&lt;br /&gt;
(I know this page is broken with IE, I&#039;m not going to fix it  ;-))&lt;br /&gt;
&lt;br /&gt;
== Serverside dynamite timer == &lt;br /&gt;
[http://svn.ankh-morp.org:8080/etpro_mods/dynatimer/dynamite.lua dynamite.lua]&lt;br /&gt;
&lt;br /&gt;
This is a server side dynamite timer script. The messages will be sent to all clients who enabled the messages. The default of sending / not sending the timer messages are set by the server admin, see the &#039;&#039;cl_default&#039;&#039; setting in the script.&lt;br /&gt;
&lt;br /&gt;
A client can set it&#039;s default (on/off) by setting &#039;&#039;+setu v_dynatimer 1&#039;&#039; or &#039;&#039;+setu v_dynatimer 0&#039;&#039; as command line argument for et ... or with the &#039;&#039;\setu v_dynatimer 1/0&#039;&#039; command... but that will not (de-)activate immediately&lt;br /&gt;
&lt;br /&gt;
Timers can be enabled for the current connection with the client command &#039;&#039;\dynatimer 1&#039;&#039; or disabled with &#039;&#039;\dynatimer 0&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
== ETPub / NoQuarter style say substitutions ==&lt;br /&gt;
[http://svn.ankh-morp.org:8080/etpro_mods/shortcuts/etpub_printf.lua etpub_printf.lua]&lt;br /&gt;
&lt;br /&gt;
The etpub and NoQuarter mods have a shortcuts replacement feature. Some keys inside square brackets (&amp;quot;[]&amp;quot;) are replaced by values. This script does the same for etpro. Supported commands are &#039;&#039;say&#039;&#039;, &#039;&#039;say_team&#039;&#039;, &#039;&#039;say_buddy&#039;&#039;, &#039;&#039;say_teamnl&#039;&#039;, &#039;&#039;vsay&#039;&#039; and &#039;&#039;vsay_team&#039;&#039;. See below for some examples.&lt;br /&gt;
&lt;br /&gt;
Known keys in etpub/nq are:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[a]&#039;&#039;&#039; last player who gave you ammo, currently not working, just returns &#039;&#039;&#039;*unknown*&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[d]&#039;&#039;&#039; last player who killed you&lt;br /&gt;
* &#039;&#039;&#039;[h]&#039;&#039;&#039; last player who gave you health currently not working, just returns &#039;&#039;&#039;*unknown*&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[k]&#039;&#039;&#039; last player you killed&lt;br /&gt;
* &#039;&#039;&#039;[l]&#039;&#039;&#039; your location (letter,number)  currently not really working, [[Talk:Lua_Mod_API#Locations|feature request]] for etpro filed :-) &lt;br /&gt;
Currently it just returns the world coords in map units &lt;br /&gt;
* &#039;&#039;&#039;[n]&#039;&#039;&#039; your name&lt;br /&gt;
* &#039;&#039;&#039;[r]&#039;&#039;&#039; last player who revived you&lt;br /&gt;
* &#039;&#039;&#039;[p]&#039;&#039;&#039; last player you looked at, not working, probably never will ...&lt;br /&gt;
* &#039;&#039;&#039;[s]&#039;&#039;&#039; health remaining&lt;br /&gt;
* &#039;&#039;&#039;[w]&#039;&#039;&#039; name of current weapon&lt;br /&gt;
* &#039;&#039;&#039;[t]&#039;&#039;&#039; ammo for current weapon&lt;br /&gt;
&lt;br /&gt;
We added the following keys:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[m]&#039;&#039;&#039; name of the last player who was revived by you&lt;br /&gt;
* &#039;&#039;&#039;[c]&#039;&#039;&#039; your current player class&lt;br /&gt;
* &#039;&#039;&#039;[x]&#039;&#039;&#039; health of last killer (don&#039;t ask me why &amp;quot;x&amp;quot;... I just took this from the first version of this script :-))&lt;br /&gt;
&lt;br /&gt;
Both health replacements (&amp;quot;s&amp;quot; and &amp;quot;x&amp;quot;) will return &amp;quot;0&amp;quot; if your the health value is below that, i.e. you will not know if a player is gibbed or just waiting for a revive.&lt;br /&gt;
&lt;br /&gt;
=== Examples: ===&lt;br /&gt;
&lt;br /&gt;
To test this simply do a say on the server:&lt;br /&gt;
 &lt;br /&gt;
 \vsay_team Medic &amp;quot;Need a medic, ^1[s]^5 health left!&amp;quot;&lt;br /&gt;
result: Global voice sound: I need a medic and a custom text: &amp;quot;Need a medic, 15 health left!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 bind x &amp;quot;vsay negative Stop killing me, [d]&amp;quot;&lt;br /&gt;
result: Global voice sound: Negative/No, and a custom text: &amp;quot;Stop killing me, [!!!]Harlekin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 bind x &amp;quot;vsay_team thanks Thanks for the Team-Kill, [d]!&amp;quot;&lt;br /&gt;
result: Team voice sound: Thanks, and a custom text: &amp;quot;Thanks for the Team-Kill, [!!!]Harlekin!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Thanks to [!!!]Harlekin and bennz. [[User:Bennz|Bennz]] did the first version of this script, which I rewrote completely ;-). He also helped debugging.&lt;br /&gt;
&lt;br /&gt;
[[Category:ETPro:Mods]]&lt;/div&gt;</summary>
		<author><name>Vetinari</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=User:Vetinari&amp;diff=2693</id>
		<title>User:Vetinari</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=User:Vetinari&amp;diff=2693"/>
		<updated>2007-02-24T11:23:44Z</updated>

		<summary type="html">&lt;p&gt;Vetinari: /* ETPub / NoQuarter style say substitutions */ correct internal link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Reviving Spree Lua ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;reviving sprees&amp;quot; in the style of etadmin_mod&#039;s killing sprees: [http://ankh-morp.org/~vetinari/projects/rspree/ rspree_mod] &lt;br /&gt;
&lt;br /&gt;
(I know this page is broken with IE, I&#039;m not going to fix it  ;-))&lt;br /&gt;
&lt;br /&gt;
== Serverside dynamite timer == &lt;br /&gt;
[http://svn.ankh-morp.org:8080/etpro_mods/dynatimer/dynamite.lua dynamite.lua]&lt;br /&gt;
&lt;br /&gt;
This is a server side dynamite timer script. The messages will be sent to all clients who enabled the messages. The default of sending / not sending the timer messages are set by the server admin, see the &#039;&#039;cl_default&#039;&#039; setting in the script.&lt;br /&gt;
&lt;br /&gt;
A client can set it&#039;s default (on/off) by setting &#039;&#039;+setu v_dynatimer 1&#039;&#039; or &#039;&#039;+setu v_dynatimer 0&#039;&#039; as command line argument for et ... or with the &#039;&#039;\setu v_dynatimer 1/0&#039;&#039; command... but that will not (de-)activate immediately&lt;br /&gt;
&lt;br /&gt;
Timers can be enabled for the current connection with the client command &#039;&#039;\dynatimer 1&#039;&#039; or disabled with &#039;&#039;\dynatimer 0&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
== ETPub / NoQuarter style say substitutions ==&lt;br /&gt;
[http://svn.ankh-morp.org:8080/etpro_mods/shortcuts/etpub_printf.lua etpub_printf.lua]&lt;br /&gt;
&lt;br /&gt;
The etpub and NoQuarter mods have a shortcuts replacement feature. Some keys inside square brackets (&amp;quot;[]&amp;quot;) are replaced by values. This script does the same for etpro. Supported commands are &#039;&#039;say&#039;&#039;, &#039;&#039;say_team&#039;&#039;, &#039;&#039;say_buddy&#039;&#039;, &#039;&#039;say_teamnl&#039;&#039;, &#039;&#039;vsay&#039;&#039; and &#039;&#039;vsay_team&#039;&#039;. See below for some examples.&lt;br /&gt;
&lt;br /&gt;
Known keys in etpub/nq are:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[a]&#039;&#039;&#039; last player who gave you ammo, currently not working, just returns &#039;&#039;&#039;*unknown*&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[d]&#039;&#039;&#039; last player who killed you&lt;br /&gt;
* &#039;&#039;&#039;[h]&#039;&#039;&#039; last player who gave you health currently not working, just returns &#039;&#039;&#039;*unknown*&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[k]&#039;&#039;&#039; last player you killed&lt;br /&gt;
* &#039;&#039;&#039;[l]&#039;&#039;&#039; your location (letter,number)  currently not really working, [[Talk:Lua_Mod_API#Locations|feature request]] for etpro filed :-) &lt;br /&gt;
Currently it just returns the world coords in map units &lt;br /&gt;
* &#039;&#039;&#039;[n]&#039;&#039;&#039; your name&lt;br /&gt;
* &#039;&#039;&#039;[r]&#039;&#039;&#039; last player who revived you&lt;br /&gt;
* &#039;&#039;&#039;[p]&#039;&#039;&#039; last player you looked at, not working, probably never will ...&lt;br /&gt;
* &#039;&#039;&#039;[s]&#039;&#039;&#039; health remaining&lt;br /&gt;
* &#039;&#039;&#039;[w]&#039;&#039;&#039; name of current weapon&lt;br /&gt;
* &#039;&#039;&#039;[t]&#039;&#039;&#039; ammo for current weapon&lt;br /&gt;
&lt;br /&gt;
We added the following keys:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[m]&#039;&#039;&#039; name of the last player who was revived by you&lt;br /&gt;
* &#039;&#039;&#039;[x]&#039;&#039;&#039; health of last killer (don&#039;t ask me why &amp;quot;x&amp;quot;... I just took this from the first version of this script :-))&lt;br /&gt;
&lt;br /&gt;
Both health replacements (&amp;quot;s&amp;quot; and &amp;quot;x&amp;quot;) will return &amp;quot;0&amp;quot; if your the health value is below that, i.e. you will not know if a player is gibbed or just waiting for a revive.&lt;br /&gt;
&lt;br /&gt;
=== Examples: ===&lt;br /&gt;
&lt;br /&gt;
To test this simply do a say on the server:&lt;br /&gt;
 &lt;br /&gt;
 \vsay_team Medic &amp;quot;Need a medic, ^1[s]^5 health left!&amp;quot;&lt;br /&gt;
result: Global voice sound: I need a medic and a custom text: &amp;quot;Need a medic, 15 health left!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 bind x &amp;quot;vsay negative Stop killing me, [d]&amp;quot;&lt;br /&gt;
result: Global voice sound: Negative/No, and a custom text: &amp;quot;Stop killing me, [!!!]Harlekin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 bind x &amp;quot;vsay_team thanks Thanks for the Team-Kill, [d]!&amp;quot;&lt;br /&gt;
result: Team voice sound: Thanks, and a custom text: &amp;quot;Thanks for the Team-Kill, [!!!]Harlekin!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Thanks to [!!!]Harlekin and bennz. [[User:Bennz|Bennz]] did the first version of this script, which I rewrote completely ;-). He also helped debugging.&lt;br /&gt;
&lt;br /&gt;
[[Category:ETPro:Mods]]&lt;/div&gt;</summary>
		<author><name>Vetinari</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=User:Vetinari&amp;diff=2692</id>
		<title>User:Vetinari</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=User:Vetinari&amp;diff=2692"/>
		<updated>2007-02-24T11:22:18Z</updated>

		<summary type="html">&lt;p&gt;Vetinari: &amp;quot;readme&amp;quot; for dynatimer, added etpub_printf.lua w/ readme&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Reviving Spree Lua ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;reviving sprees&amp;quot; in the style of etadmin_mod&#039;s killing sprees: [http://ankh-morp.org/~vetinari/projects/rspree/ rspree_mod] &lt;br /&gt;
&lt;br /&gt;
(I know this page is broken with IE, I&#039;m not going to fix it  ;-))&lt;br /&gt;
&lt;br /&gt;
== Serverside dynamite timer == &lt;br /&gt;
[http://svn.ankh-morp.org:8080/etpro_mods/dynatimer/dynamite.lua dynamite.lua]&lt;br /&gt;
&lt;br /&gt;
This is a server side dynamite timer script. The messages will be sent to all clients who enabled the messages. The default of sending / not sending the timer messages are set by the server admin, see the &#039;&#039;cl_default&#039;&#039; setting in the script.&lt;br /&gt;
&lt;br /&gt;
A client can set it&#039;s default (on/off) by setting &#039;&#039;+setu v_dynatimer 1&#039;&#039; or &#039;&#039;+setu v_dynatimer 0&#039;&#039; as command line argument for et ... or with the &#039;&#039;\setu v_dynatimer 1/0&#039;&#039; command... but that will not (de-)activate immediately&lt;br /&gt;
&lt;br /&gt;
Timers can be enabled for the current connection with the client command &#039;&#039;\dynatimer 1&#039;&#039; or disabled with &#039;&#039;\dynatimer 0&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
== ETPub / NoQuarter style say substitutions ==&lt;br /&gt;
[http://svn.ankh-morp.org:8080/etpro_mods/shortcuts/etpub_printf.lua etpub_printf.lua]&lt;br /&gt;
&lt;br /&gt;
The etpub and NoQuarter mods have a shortcuts replacement feature. Some keys inside square brackets (&amp;quot;[]&amp;quot;) are replaced by values. This script does the same for etpro. Supported commands are &#039;&#039;say&#039;&#039;, &#039;&#039;say_team&#039;&#039;, &#039;&#039;say_buddy&#039;&#039;, &#039;&#039;say_teamnl&#039;&#039;, &#039;&#039;vsay&#039;&#039; and &#039;&#039;vsay_team&#039;&#039;. See below for some examples.&lt;br /&gt;
&lt;br /&gt;
Known keys in etpub/nq are:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[a]&#039;&#039;&#039; last player who gave you ammo, currently not working, just returns &#039;&#039;&#039;*unknown*&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[d]&#039;&#039;&#039; last player who killed you&lt;br /&gt;
* &#039;&#039;&#039;[h]&#039;&#039;&#039; last player who gave you health currently not working, just returns &#039;&#039;&#039;*unknown*&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[k]&#039;&#039;&#039; last player you killed&lt;br /&gt;
* &#039;&#039;&#039;[l]&#039;&#039;&#039; your location (letter,number)  currently not really working, [[http://wolfwiki.anime.net/index.php/Talk:Lua_Mod_API#Locations feature request]] for etpro filed :-) &lt;br /&gt;
Currently it just returns the world coords in map units &lt;br /&gt;
* &#039;&#039;&#039;[n]&#039;&#039;&#039; your name&lt;br /&gt;
* &#039;&#039;&#039;[r]&#039;&#039;&#039; last player who revived you&lt;br /&gt;
* &#039;&#039;&#039;[p]&#039;&#039;&#039; last player you looked at, not working, probably never will ...&lt;br /&gt;
* &#039;&#039;&#039;[s]&#039;&#039;&#039; health remaining&lt;br /&gt;
* &#039;&#039;&#039;[w]&#039;&#039;&#039; name of current weapon&lt;br /&gt;
* &#039;&#039;&#039;[t]&#039;&#039;&#039; ammo for current weapon&lt;br /&gt;
&lt;br /&gt;
We added the following keys:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[m]&#039;&#039;&#039; name of the last player who was revived by you&lt;br /&gt;
* &#039;&#039;&#039;[x]&#039;&#039;&#039; health of last killer (don&#039;t ask me why &amp;quot;x&amp;quot;... I just took this from the first version of this script :-))&lt;br /&gt;
&lt;br /&gt;
Both health replacements (&amp;quot;s&amp;quot; and &amp;quot;x&amp;quot;) will return &amp;quot;0&amp;quot; if your the health value is below that, i.e. you will not know if a player is gibbed or just waiting for a revive.&lt;br /&gt;
&lt;br /&gt;
=== Examples: ===&lt;br /&gt;
&lt;br /&gt;
To test this simply do a say on the server:&lt;br /&gt;
 &lt;br /&gt;
 \vsay_team Medic &amp;quot;Need a medic, ^1[s]^5 health left!&amp;quot;&lt;br /&gt;
result: Global voice sound: I need a medic and a custom text: &amp;quot;Need a medic, 15 health left!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 bind x &amp;quot;vsay negative Stop killing me, [d]&amp;quot;&lt;br /&gt;
result: Global voice sound: Negative/No, and a custom text: &amp;quot;Stop killing me, [!!!]Harlekin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 bind x &amp;quot;vsay_team thanks Thanks for the Team-Kill, [d]!&amp;quot;&lt;br /&gt;
result: Team voice sound: Thanks, and a custom text: &amp;quot;Thanks for the Team-Kill, [!!!]Harlekin!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Thanks to [!!!]Harlekin and bennz. [[User:Bennz|Bennz]] did the first version of this script, which I rewrote completely ;-). He also helped debugging.&lt;br /&gt;
&lt;br /&gt;
[[Category:ETPro:Mods]]&lt;/div&gt;</summary>
		<author><name>Vetinari</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Talk:Lua_Mod_API&amp;diff=2691</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=2691"/>
		<updated>2007-02-23T17:57:24Z</updated>

		<summary type="html">&lt;p&gt;Vetinari: Q about et_ClientSay() -&amp;gt; et.G_Say()&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
::Ok, this sounds good to me! Big THX!! :) Please have also a look at field section of this page! ;) --[[User:Pdi|pdi]] 05:41, 4 January 2007 (PST)&lt;br /&gt;
&lt;br /&gt;
Can we have a intercepted version of &#039;&#039;&#039;et_ClientUserinfoChanged()&#039;&#039;&#039; to return &#039;&#039;&#039;1&#039;&#039;&#039; to intercept it with a mod and return &#039;&#039;&#039;0&#039;&#039;&#039; to pass it through to the server? THX!! --[[User:Pdi|pdi]] 00:54, 7 February 2007 (PST)&lt;br /&gt;
:I don&#039;t understand what you want here. You should already be able to call trap_SetUserinfo from et_ClientUserinfoChanged if you want to modify the values. --[[User:ReyalP|ReyalP]] 19:00, 8 February 2007 (PST)&lt;br /&gt;
::I found another way to do that. Sorry, but didn&#039;t need that anymore. --[[User:Pdi|pdi]] 12:16, 9 February 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;
== Fields for the next release ==&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: 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;
: we are not going to add all the fields. A lot of them don&#039;t make sense for lua mods. Explain which ones you need --[[User:ReyalP|ReyalP]] 20:57, 5 February 2007 (PST)&lt;br /&gt;
::Ok, didn&#039;t know why i&#039;m asking for (long time ago) but fields for xp/skill (sess.skillpoints array - if i remember) control would be great. THX!! --[[User:Pdi|pdi]] 00:54, 7 February 2007 (PST)&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;
Please give read access to &#039;&#039;&#039;g_campaignInfo_t&#039;&#039;&#039; in a field like &#039;&#039;&#039;campaignInfo&#039;&#039;&#039;. Thx!! --[[User:Pdi|pdi]] 08:57, 7 January 2007 (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;br /&gt;
&lt;br /&gt;
== Locations == &lt;br /&gt;
 [22:08:57] &amp;lt;Vetinari&amp;gt; [NW]reyalP: if you&#039;re exposing map coords, it would &lt;br /&gt;
   be nice to have something like et.PostitionName( et.gentity_get(id, &amp;quot;r.currentOrigin&amp;quot;)) &lt;br /&gt;
   &amp;lt;-- location name or map coords &amp;quot;(B, 3)&amp;quot;, so I don&#039;t have to parse the _loc.dat ;-&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== et_ClientSay ? ==&lt;br /&gt;
err.. what&#039;s this:&lt;br /&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;
    if arg0 == &amp;quot;say&amp;quot; then&lt;br /&gt;
        return et_ClientSay( clientNum, et.SAY_ALL, et.ConcatArgs(1))&lt;br /&gt;
&lt;br /&gt;
This should be &lt;br /&gt;
        return et.G_Say( clientNum, et.SAY_ALL, et.ConcatArgs(1))&lt;br /&gt;
?&lt;/div&gt;</summary>
		<author><name>Vetinari</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Talk:Lua_Mod_API&amp;diff=2683</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=2683"/>
		<updated>2007-02-19T21:13:17Z</updated>

		<summary type="html">&lt;p&gt;Vetinari: Location withlist ;)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
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;
::Ok, this sounds good to me! Big THX!! :) Please have also a look at field section of this page! ;) --[[User:Pdi|pdi]] 05:41, 4 January 2007 (PST)&lt;br /&gt;
&lt;br /&gt;
Can we have a intercepted version of &#039;&#039;&#039;et_ClientUserinfoChanged()&#039;&#039;&#039; to return &#039;&#039;&#039;1&#039;&#039;&#039; to intercept it with a mod and return &#039;&#039;&#039;0&#039;&#039;&#039; to pass it through to the server? THX!! --[[User:Pdi|pdi]] 00:54, 7 February 2007 (PST)&lt;br /&gt;
:I don&#039;t understand what you want here. You should already be able to call trap_SetUserinfo from et_ClientUserinfoChanged if you want to modify the values. --[[User:ReyalP|ReyalP]] 19:00, 8 February 2007 (PST)&lt;br /&gt;
::I found another way to do that. Sorry, but didn&#039;t need that anymore. --[[User:Pdi|pdi]] 12:16, 9 February 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;
== Fields for the next release ==&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: 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;
: we are not going to add all the fields. A lot of them don&#039;t make sense for lua mods. Explain which ones you need --[[User:ReyalP|ReyalP]] 20:57, 5 February 2007 (PST)&lt;br /&gt;
::Ok, didn&#039;t know why i&#039;m asking for (long time ago) but fields for xp/skill (sess.skillpoints array - if i remember) control would be great. THX!! --[[User:Pdi|pdi]] 00:54, 7 February 2007 (PST)&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;
Please give read access to &#039;&#039;&#039;g_campaignInfo_t&#039;&#039;&#039; in a field like &#039;&#039;&#039;campaignInfo&#039;&#039;&#039;. Thx!! --[[User:Pdi|pdi]] 08:57, 7 January 2007 (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;br /&gt;
&lt;br /&gt;
== Locations == &lt;br /&gt;
 [22:08:57] &amp;lt;Vetinari&amp;gt; [NW]reyalP: if you&#039;re exposing map coords, it would &lt;br /&gt;
   be nice to have something like et.PostitionName( et.gentity_get(id, &amp;quot;r.currentOrigin&amp;quot;)) &lt;br /&gt;
   &amp;lt;-- location name or map coords &amp;quot;(B, 3)&amp;quot;, so I don&#039;t have to parse the _loc.dat ;-&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vetinari</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Lua_Mod_API&amp;diff=2665</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=2665"/>
		<updated>2007-02-13T08:13:48Z</updated>

		<summary type="html">&lt;p&gt;Vetinari: added link to Lua:IPC&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOEDITSECTION__&lt;br /&gt;
[[ETPro]] now supports server-side 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.  It also provides an &amp;quot;et&amp;quot; library of function calls for Lua that allow access to the server engine, and provides callbacks so a server side 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.7 os] (available features vary depending on your OS), [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;
A tutorial about ETPro Lua scripting can be found [[Lua Tutorials|here]].&lt;br /&gt;
&lt;br /&gt;
API requests can be discussed at the [[Talk:Lua_Mod_API|Lua Mod API talk page]].&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. See the [[Lua:IPC|Lua IPC]] page for a simple example.&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;[[SendServerCommand|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;
et.ClientUserinfoChanged( &#039;&#039;&#039;clientNum&#039;&#039;&#039; )&lt;br /&gt;
:Loads the new [[Userinfo]] of &#039;&#039;&#039;clientNum&#039;&#039;&#039; and stores it in the configstring and client variables&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;
et.G_Damage( &#039;&#039;&#039;target&#039;&#039;&#039;, &#039;&#039;&#039;inflictor&#039;&#039;&#039;, &#039;&#039;&#039;attacker&#039;&#039;&#039;, &#039;&#039;&#039;damage&#039;&#039;&#039;, &#039;&#039;&#039;[[etdamage|dflags]]&#039;&#039;&#039;, &#039;&#039;&#039;[[etdamage|mod]]&#039;&#039;&#039; )&lt;br /&gt;
:Does &#039;&#039;&#039;damage&#039;&#039;&#039; amount of damage on &#039;&#039;&#039;target&#039;&#039;&#039; inflicted by &#039;&#039;&#039;inflictor&#039;&#039;&#039; and cased by &#039;&#039;&#039;attacker&#039;&#039;&#039;&lt;br /&gt;
:&#039;&#039;&#039;target&#039;&#039;&#039;, &#039;&#039;&#039;inflictor&#039;&#039;&#039;, &#039;&#039;&#039;attacker&#039;&#039;&#039; are entity numbers&lt;br /&gt;
:&#039;&#039;&#039;[[etdamage|dflags]]&#039;&#039;&#039; is a [[Bitmask-cvar|bitflag]] number to decide how the damage is inflickted, see &#039;&#039;&#039;[[etdamage|dflags]]&#039;&#039;&#039; [[etdamage|flaglist]]&lt;br /&gt;
:&#039;&#039;&#039;[[etdamage|mod]]&#039;&#039;&#039; is a number from 0 up to 64 o set the type of damage, see &#039;&#039;&#039;[[etdamage|mod]]&#039;&#039;&#039; [[etdamage|list]]&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; &#039;&#039;,arrayindex&#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;
:&#039;&#039;arrayindex&#039;&#039; is used to specify which element of an array entity field to get. It is required when accessing array type fields. Entity field array indexes start at 0.&lt;br /&gt;
et.gentity_set( &#039;&#039;&#039;entnum&#039;&#039;&#039;, &#039;&#039;&#039;[[Fieldname]]&#039;&#039;&#039;, &#039;&#039;arrayindex,&#039;&#039; &#039;&#039;&#039;(value)&#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;(value)&#039;&#039;&#039;&lt;br /&gt;
:&#039;&#039;arrayindex&#039;&#039; is used to specify which element of an array entity field to set.&lt;br /&gt;
et.G_AddEvent( &#039;&#039;&#039;ent&#039;&#039;&#039;, &#039;&#039;&#039;event&#039;&#039;&#039;, &#039;&#039;&#039;eventparm&#039;&#039;&#039;&#039; )&lt;br /&gt;
:Adds event &#039;&#039;&#039;event&#039;&#039;&#039; whit eventparameter &#039;&#039;&#039;eventparm&#039;&#039;&#039;&#039; to entity &#039;&#039;&#039;ent&#039;&#039;&#039;&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;
et_ClientSpawn( &#039;&#039;&#039;clientNum&#039;&#039;&#039;, &#039;&#039;&#039;revived&#039;&#039;&#039; )&lt;br /&gt;
:Called when a client is spawned. &#039;&#039;&#039;clientNum&#039;&#039;&#039; is the client slot id. &#039;&#039;&#039;revived&#039;&#039;&#039; is 1 if the client was spawned by beeying revived.&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;
===xp===&lt;br /&gt;
et_UpgradeSkill( &#039;&#039;&#039;cno&#039;&#039;&#039;, &#039;&#039;&#039;skill&#039;&#039;&#039; )&lt;br /&gt;
:Called when client on slot &#039;&#039;&#039;cno&#039;&#039;&#039; gets an upgrade on skill &#039;&#039;&#039;skill&#039;&#039;&#039;. Return -1 to override (abort) the qagame function, anything else to &amp;quot;passthrough&amp;quot;. Callback may modify skills (or do anything else it wants) during passthrough. &lt;br /&gt;
et_SetPlayerSkill( &#039;&#039;&#039;cno&#039;&#039;&#039;, &#039;&#039;&#039;skill&#039;&#039;&#039; )&lt;br /&gt;
:Called when clients (on slot &#039;&#039;&#039;cno&#039;&#039;&#039;) skill level &#039;&#039;&#039;skill&#039;&#039;&#039; is set. Return -1 to override (abort) the qagame function, anything else to &amp;quot;passthrough&amp;quot;. Callback may modify skills (or do anything else it wants) during passthrough.&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 reload my lua file without restarting the whole server?&amp;lt;br&amp;gt;&lt;br /&gt;
A: Use &#039;&#039;map_restart&#039;&#039;, &#039;&#039;reset_match&#039;&#039; or simply change the map.&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|Lua sample code]]&lt;br /&gt;
&lt;br /&gt;
Q: Is there a list of [[ETPro]] Lua 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: That&#039;s 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;
[[Category:Lua]]&lt;/div&gt;</summary>
		<author><name>Vetinari</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=ETPro:Lua_IPC&amp;diff=2664</id>
		<title>ETPro:Lua IPC</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=ETPro:Lua_IPC&amp;diff=2664"/>
		<updated>2007-02-13T08:07:24Z</updated>

		<summary type="html">&lt;p&gt;Vetinari: ETPro:Lua IPC moved to Lua:IPC: Lua:IPC is a better place&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#redirect [[Lua:IPC]]&lt;/div&gt;</summary>
		<author><name>Vetinari</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Lua:IPC&amp;diff=2663</id>
		<title>Lua:IPC</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Lua:IPC&amp;diff=2663"/>
		<updated>2007-02-13T08:07:24Z</updated>

		<summary type="html">&lt;p&gt;Vetinari: ETPro:Lua IPC moved to Lua:IPC&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Lua: IPC - Communication between Scripts =&lt;br /&gt;
If you have several scripts, which access the same data, you can have one script, which manages this data and one or more scripts reading (or writing) this data. &lt;br /&gt;
&lt;br /&gt;
For communication between these scripts, use the [[Lua_Mod_API#modules|et.IPCSend()]] and [[Lua_Mod_API#miscellaneous_2|et_IPCReceive( )]] functions. You cannot receive some data and send it back in the same (server) frame. These example scripts illustrate how to pass requests and the answers back and forth.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;ipcdemo-admin.lua&#039;&#039;&#039; script must be loaded first (i.e. earlier in the [[Lua_Mod_API#lua_modules|lua_modules]] cvar) otherwise the &#039;&#039;&#039;ipcdemo-cmd.lua&#039;&#039;&#039; cannot find it.&lt;br /&gt;
&lt;br /&gt;
== ipcdemo-admin.lua ==&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#ff6060&amp;quot;&amp;gt;-- ipcdemo-admin.lua&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;local&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; IPCQueue = &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;{}&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;local&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; AdminGUIDs = &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;{&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#ff6060&amp;quot;&amp;gt;-- name,       guid,                              level&amp;lt;/font&amp;gt;&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;{&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;Vetinari&amp;amp;quot;&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;ABCDEF1234567890ABCDEF1234567890&amp;amp;quot;&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;5&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;}&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;,&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;{&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;Havelock&amp;amp;quot;&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;1234567890ABCDEF1234567890ABCDEF&amp;amp;quot;&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;3&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;}&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;}&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;amp;nbsp;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;function&amp;lt;/font&amp;gt; et_InitGame(levelTime, randomSeed, restart)&lt;br /&gt;
      et.RegisterModname(&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;ipcdemo-admin.lua&amp;amp;quot;&amp;lt;/font&amp;gt;)&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;end&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;amp;nbsp;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;function&amp;lt;/font&amp;gt; et_IPCReceive(vm, msg)&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;local&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; level&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;local&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; junk1, junk2, id = &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;string.find&amp;lt;/font&amp;gt;(msg, &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;IsAdmin:%s+(%d+)&amp;amp;quot;&amp;lt;/font&amp;gt;)&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;if&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; id ~= &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;nil&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;then&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
         id    = &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;tonumber&amp;lt;/font&amp;gt;(id)&lt;br /&gt;
         guid  = et.Info_ValueForKey(et.trap_GetUserinfo(id), &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;cl_guid&amp;amp;quot;&amp;lt;/font&amp;gt;)&lt;br /&gt;
         level = table.foreach(AdminGUIDs,&lt;br /&gt;
             &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;function&amp;lt;/font&amp;gt;(i, admin)&lt;br /&gt;
                 &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;if&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; admin[&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;] == guid &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;then&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
                     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;return&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;(admin[&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;3&amp;lt;/font&amp;gt;])&lt;br /&gt;
                 &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;end&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
             &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;end&amp;lt;/font&amp;gt;&lt;br /&gt;
         )&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;if&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; level == &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;nil&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;then&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
             level = &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;end&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;table.insert&amp;lt;/font&amp;gt;(IPCQueue, &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;{&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; vm, level, id &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;}&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;)&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;end&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;end&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;amp;nbsp;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;function&amp;lt;/font&amp;gt; et_RunFrame(lvltime)&lt;br /&gt;
     table.foreach(IPCQueue,&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;function&amp;lt;/font&amp;gt;(i, queue)&lt;br /&gt;
             &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;local&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; ok = et.IPCSend(queue[&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;],&lt;br /&gt;
                             &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;string.format&amp;lt;/font&amp;gt;(&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;IsAdmin: %d %d&amp;amp;quot;&amp;lt;/font&amp;gt;, queue[&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;], queue[&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;3&amp;lt;/font&amp;gt;]))&lt;br /&gt;
             &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;if&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; ok ~= &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;then&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
                 &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;local&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; mod, cksum = et.FindMod(queue[&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;])&lt;br /&gt;
                 et.G_Print(&amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;string.format&amp;lt;/font&amp;gt;(&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;ipcdemo-admin: IPCSend to %s (vm: %d) failed&amp;amp;quot;&amp;lt;/font&amp;gt;, mod, queue[&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;]))&lt;br /&gt;
             &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;end&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;end&amp;lt;/font&amp;gt;&lt;br /&gt;
     )&lt;br /&gt;
     IPCQueue = &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;{}&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;end&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ipcdemo-cmd.lua ==&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#ff6060&amp;quot;&amp;gt;-- ipcdemo-cmd.lua&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;local&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; admin_vm    = -&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;local&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; CommandQueue = &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;{}&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;amp;nbsp;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;function&amp;lt;/font&amp;gt; et_InitGame(levelTime, randomSeed, restart)&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;local&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; mod = &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;local&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; sig = &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;local&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; i = &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;while&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; mod ~= &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;nil&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;do&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
         mod, sig = et.FindMod(i)&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;if&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;string.find&amp;lt;/font&amp;gt;(mod, &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;^ipcdemo-admin.lua&amp;amp;quot;&amp;lt;/font&amp;gt;) == &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;then&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
             admin_vm = i&lt;br /&gt;
             mod      = &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;nil&amp;lt;/font&amp;gt;&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;end&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
         i = i + &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;end&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;if&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; admin_vm == -&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;then&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
         et.G_Print(&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;ipcdemo-cmd.lua: Could not find vm number for ipcdemo-admin.lua&amp;amp;quot;&amp;lt;/font&amp;gt;)&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;end&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
     et.RegisterModname(&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;ipcdemo-cmd.lua&amp;amp;quot;&amp;lt;/font&amp;gt;)&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;end&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;amp;nbsp;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;function&amp;lt;/font&amp;gt; et_IPCReceive(vm, msg)&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;if&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; vm == admin_vm &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;then&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;local&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; junk1,junk2,level,id = &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;string.find&amp;lt;/font&amp;gt;(msg, &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;IsAdmin:%s+(%d+)%s+(%d)&amp;amp;quot;&amp;lt;/font&amp;gt;)&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;if&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; level ~= &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;nil&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;and&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; id ~= &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;nil&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;then&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
             runAction(&amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;tonumber&amp;lt;/font&amp;gt;(id), &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;tonumber&amp;lt;/font&amp;gt;(level))&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;end&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;end&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;end&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;amp;nbsp;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;function&amp;lt;/font&amp;gt; runAction(id, level)&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;local&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; done = table.foreach(CommandQueue,&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;function&amp;lt;/font&amp;gt;(i, queue)&lt;br /&gt;
             &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;if&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; id == queue[&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;] &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;then&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
                 &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;if&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; queue[&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;] &amp;amp;lt;= level &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;then&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
                     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;if&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; queue[&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;4&amp;lt;/font&amp;gt;] == &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;nil&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;then&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
                         et.trap_SendConsoleCommand(et.EXEC_INSERT, queue[&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;3&amp;lt;/font&amp;gt;])&lt;br /&gt;
                     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;else&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
                         et.trap_SendConsoleCommand(et.EXEC_INSERT,&lt;br /&gt;
                                 &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;string.format&amp;lt;/font&amp;gt;(&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;%s %s&amp;amp;quot;&amp;lt;/font&amp;gt;, queue[&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;3&amp;lt;/font&amp;gt;], queue[&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;4&amp;lt;/font&amp;gt;]))&lt;br /&gt;
                     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;end&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
                 &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;end&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
                 &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;return&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;(i)&lt;br /&gt;
             &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;end&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;end&amp;lt;/font&amp;gt;&lt;br /&gt;
     )&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;if&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; done ~= &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;nil&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;then&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;table.remove&amp;lt;/font&amp;gt;(CommandQueue, done)&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;end&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;end&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;amp;nbsp;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;function&amp;lt;/font&amp;gt; et_ClientCommand(id, command)&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;local&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; arg0 = et.trap_Argv(&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;)&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;local&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; arg1 = et.trap_Argv(&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;)&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;if&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; arg0 == &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;say&amp;amp;quot;&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;then&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;if&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; arg1 == &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;!axis&amp;amp;quot;&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;then&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
             &amp;lt;font color=&amp;quot;#ff6060&amp;quot;&amp;gt;--          id, lvl, cmd,         argument&amp;lt;/font&amp;gt;&lt;br /&gt;
             queueCommand(id, &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;4&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;forceteam r&amp;amp;quot;&amp;lt;/font&amp;gt;, id)&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;elseif&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; arg1 == &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;!allies&amp;amp;quot;&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;then&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
             queueCommand(id, &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;4&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;forceteam b&amp;amp;quot;&amp;lt;/font&amp;gt;, id)&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;elseif&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; arg1 == &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;!shuffle&amp;amp;quot;&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;then&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
             queueCommand(id, &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;3&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;shuffleteamsxp_norestart&amp;amp;quot;&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;nil&amp;lt;/font&amp;gt;)&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;end&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;end&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;return&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;(&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;)&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;end&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;amp;nbsp;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;function&amp;lt;/font&amp;gt; queueCommand(id, level, cmd, argument)&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;if&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; admin_vm ~= -&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;then&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;local&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; ok = et.IPCSend(admin_vm, &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;string.format&amp;lt;/font&amp;gt;(&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;IsAdmin: %d&amp;amp;quot;&amp;lt;/font&amp;gt;, id))&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;if&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; ok ~= &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;then&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
             et.G_Print(&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;ipcdemo-cmd: IPCSend to ipcdemo-admin failed&amp;amp;quot;&amp;lt;/font&amp;gt;)&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;else&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
             &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;table.insert&amp;lt;/font&amp;gt;(CommandQueue, &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;{&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; id, level, cmd, argument &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;}&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;)&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;end&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;end&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;end&amp;lt;/font&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vetinari</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=Lua:IPC&amp;diff=2652</id>
		<title>Lua:IPC</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=Lua:IPC&amp;diff=2652"/>
		<updated>2007-02-11T12:01:20Z</updated>

		<summary type="html">&lt;p&gt;Vetinari: new page, IPC demos&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Lua: IPC - Communication between Scripts =&lt;br /&gt;
If you have several scripts, which access the same data, you can have one script, which manages this data and one or more scripts reading (or writing) this data. &lt;br /&gt;
&lt;br /&gt;
For communication between these scripts, use the [[Lua_Mod_API#modules|et.IPCSend()]] and [[Lua_Mod_API#miscellaneous_2|et_IPCReceive( )]] functions. You cannot receive some data and send it back in the same (server) frame. These example scripts illustrate how to pass requests and the answers back and forth.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;ipcdemo-admin.lua&#039;&#039;&#039; script must be loaded first (i.e. earlier in the [[Lua_Mod_API#lua_modules|lua_modules]] cvar, else the &#039;&#039;&#039;ipcdemo-cmd.lua&#039;&#039;&#039; cannot find it.&lt;br /&gt;
&lt;br /&gt;
== ipcdemo-admin.lua ==&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#ff6060&amp;quot;&amp;gt;-- ipcdemo-admin.lua&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;local&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; IPCQueue = &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;{}&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;local&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; AdminGUIDs = &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;{&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#ff6060&amp;quot;&amp;gt;-- name,       guid,                              level&amp;lt;/font&amp;gt;&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;{&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;Vetinari&amp;amp;quot;&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;ABCDEF1234567890ABCDEF1234567890&amp;amp;quot;&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;5&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;}&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;,&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;{&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;Havelock&amp;amp;quot;&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;1234567890ABCDEF1234567890ABCDEF&amp;amp;quot;&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;3&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;}&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;}&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;amp;nbsp;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;function&amp;lt;/font&amp;gt; et_InitGame(levelTime, randomSeed, restart)&lt;br /&gt;
      et.RegisterModname(&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;ipcdemo-admin.lua&amp;amp;quot;&amp;lt;/font&amp;gt;)&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;end&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;amp;nbsp;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;function&amp;lt;/font&amp;gt; et_IPCReceive(vm, msg)&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;local&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; level&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;local&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; junk1, junk2, id = &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;string.find&amp;lt;/font&amp;gt;(msg, &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;IsAdmin:%s+(%d+)&amp;amp;quot;&amp;lt;/font&amp;gt;)&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;if&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; id ~= &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;nil&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;then&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
         id    = &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;tonumber&amp;lt;/font&amp;gt;(id)&lt;br /&gt;
         guid  = et.Info_ValueForKey(et.trap_GetUserinfo(id), &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;cl_guid&amp;amp;quot;&amp;lt;/font&amp;gt;)&lt;br /&gt;
         level = table.foreach(AdminGUIDs,&lt;br /&gt;
             &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;function&amp;lt;/font&amp;gt;(i, admin)&lt;br /&gt;
                 &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;if&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; admin[&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;] == guid &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;then&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
                     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;return&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;(admin[&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;3&amp;lt;/font&amp;gt;])&lt;br /&gt;
                 &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;end&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
             &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;end&amp;lt;/font&amp;gt;&lt;br /&gt;
         )&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;if&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; level == &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;nil&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;then&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
             level = &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;end&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;table.insert&amp;lt;/font&amp;gt;(IPCQueue, &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;{&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; vm, level, id &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;}&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;)&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;end&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;end&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;amp;nbsp;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;function&amp;lt;/font&amp;gt; et_RunFrame(lvltime)&lt;br /&gt;
     table.foreach(IPCQueue,&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;function&amp;lt;/font&amp;gt;(i, queue)&lt;br /&gt;
             &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;local&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; ok = et.IPCSend(queue[&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;],&lt;br /&gt;
                             &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;string.format&amp;lt;/font&amp;gt;(&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;IsAdmin: %d %d&amp;amp;quot;&amp;lt;/font&amp;gt;, queue[&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;], queue[&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;3&amp;lt;/font&amp;gt;]))&lt;br /&gt;
             &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;if&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; ok ~= &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;then&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
                 &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;local&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; mod, cksum = et.FindMod(queue[&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;])&lt;br /&gt;
                 et.G_Print(&amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;string.format&amp;lt;/font&amp;gt;(&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;ipcdemo-admin: IPCSend to %s (vm: %d) failed&amp;amp;quot;&amp;lt;/font&amp;gt;, mod, queue[&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;]))&lt;br /&gt;
             &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;end&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;end&amp;lt;/font&amp;gt;&lt;br /&gt;
     )&lt;br /&gt;
     IPCQueue = &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;{}&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;end&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ipcdemo-cmd.lua ==&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#ff6060&amp;quot;&amp;gt;-- ipcdemo-cmd.lua&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;local&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; admin_vm    = -&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;local&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; CommandQueue = &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;{}&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;amp;nbsp;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;function&amp;lt;/font&amp;gt; et_InitGame(levelTime, randomSeed, restart)&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;local&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; mod = &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;local&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; sig = &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;local&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; i = &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;while&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; mod ~= &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;nil&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;do&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
         mod, sig = et.FindMod(i)&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;if&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;string.find&amp;lt;/font&amp;gt;(mod, &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;^ipcdemo-admin.lua&amp;amp;quot;&amp;lt;/font&amp;gt;) == &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;then&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
             admin_vm = i&lt;br /&gt;
             mod      = &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;nil&amp;lt;/font&amp;gt;&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;end&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
         i = i + &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;end&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;if&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; admin_vm == -&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;then&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
         et.G_Print(&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;ipcdemo-cmd.lua: Could not find vm number for ipcdemo-admin.lua&amp;amp;quot;&amp;lt;/font&amp;gt;)&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;end&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
     et.RegisterModname(&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;ipcdemo-cmd.lua&amp;amp;quot;&amp;lt;/font&amp;gt;)&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;end&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;amp;nbsp;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;function&amp;lt;/font&amp;gt; et_IPCReceive(vm, msg)&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;if&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; vm == admin_vm &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;then&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;local&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; junk1,junk2,level,id = &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;string.find&amp;lt;/font&amp;gt;(msg, &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;IsAdmin:%s+(%d+)%s+(%d)&amp;amp;quot;&amp;lt;/font&amp;gt;)&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;if&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; level ~= &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;nil&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;and&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; id ~= &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;nil&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;then&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
             runAction(&amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;tonumber&amp;lt;/font&amp;gt;(id), &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;tonumber&amp;lt;/font&amp;gt;(level))&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;end&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;end&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;end&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;amp;nbsp;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;function&amp;lt;/font&amp;gt; runAction(id, level)&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;local&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; done = table.foreach(CommandQueue,&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;function&amp;lt;/font&amp;gt;(i, queue)&lt;br /&gt;
             &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;if&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; id == queue[&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;] &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;then&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
                 &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;if&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; queue[&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;] &amp;amp;lt;= level &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;then&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
                     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;if&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; queue[&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;4&amp;lt;/font&amp;gt;] == &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;nil&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;then&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
                         et.trap_SendConsoleCommand(et.EXEC_INSERT, queue[&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;3&amp;lt;/font&amp;gt;])&lt;br /&gt;
                     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;else&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
                         et.trap_SendConsoleCommand(et.EXEC_INSERT,&lt;br /&gt;
                                 &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;string.format&amp;lt;/font&amp;gt;(&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;%s %s&amp;amp;quot;&amp;lt;/font&amp;gt;, queue[&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;3&amp;lt;/font&amp;gt;], queue[&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;4&amp;lt;/font&amp;gt;]))&lt;br /&gt;
                     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;end&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
                 &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;end&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
                 &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;return&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;(i)&lt;br /&gt;
             &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;end&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;end&amp;lt;/font&amp;gt;&lt;br /&gt;
     )&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;if&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; done ~= &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;nil&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;then&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;table.remove&amp;lt;/font&amp;gt;(CommandQueue, done)&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;end&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;end&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;amp;nbsp;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;function&amp;lt;/font&amp;gt; et_ClientCommand(id, command)&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;local&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; arg0 = et.trap_Argv(&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;)&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;local&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; arg1 = et.trap_Argv(&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;)&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;if&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; arg0 == &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;say&amp;amp;quot;&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;then&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;if&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; arg1 == &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;!axis&amp;amp;quot;&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;then&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
             &amp;lt;font color=&amp;quot;#ff6060&amp;quot;&amp;gt;--          id, lvl, cmd,         argument&amp;lt;/font&amp;gt;&lt;br /&gt;
             queueCommand(id, &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;4&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;forceteam r&amp;amp;quot;&amp;lt;/font&amp;gt;, id)&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;elseif&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; arg1 == &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;!allies&amp;amp;quot;&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;then&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
             queueCommand(id, &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;4&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;forceteam b&amp;amp;quot;&amp;lt;/font&amp;gt;, id)&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;elseif&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; arg1 == &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;!shuffle&amp;amp;quot;&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;then&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
             queueCommand(id, &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;3&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;shuffleteamsxp_norestart&amp;amp;quot;&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;nil&amp;lt;/font&amp;gt;)&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;end&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;end&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;return&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;(&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;)&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;end&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;amp;nbsp;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;function&amp;lt;/font&amp;gt; queueCommand(id, level, cmd, argument)&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;if&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; admin_vm ~= -&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;then&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;local&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; ok = et.IPCSend(admin_vm, &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;string.format&amp;lt;/font&amp;gt;(&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;IsAdmin: %d&amp;amp;quot;&amp;lt;/font&amp;gt;, id))&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;if&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; ok ~= &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;then&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
             et.G_Print(&amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;&amp;amp;quot;ipcdemo-cmd: IPCSend to ipcdemo-admin failed&amp;amp;quot;&amp;lt;/font&amp;gt;)&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;else&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
             &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;table.insert&amp;lt;/font&amp;gt;(CommandQueue, &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;{&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; id, level, cmd, argument &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;}&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;)&lt;br /&gt;
         &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;end&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;font color=&amp;quot;#8080ff&amp;quot;&amp;gt;&amp;lt;b&amp;gt;end&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;#0000ff&amp;quot;&amp;gt;end&amp;lt;/font&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vetinari</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=User:Vetinari&amp;diff=2647</id>
		<title>User:Vetinari</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=User:Vetinari&amp;diff=2647"/>
		<updated>2007-02-10T21:33:38Z</updated>

		<summary type="html">&lt;p&gt;Vetinari: added dynamite.lua&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Reviving Spree Lua ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;reviving sprees&amp;quot; in the style of etadmin_mod&#039;s killing sprees: [http://ankh-morp.org/~vetinari/projects/rspree/ rspree_mod] &lt;br /&gt;
&lt;br /&gt;
(I know this page is broken with IE, I&#039;m not going to fix it  ;-))&lt;br /&gt;
&lt;br /&gt;
== Serverside dynamite timer == &lt;br /&gt;
[http://ankh-morp.org/~vetinari/rspree/dynamite.lua dynamite.lua]&lt;br /&gt;
&lt;br /&gt;
[[Category:ETPro:Mods]]&lt;/div&gt;</summary>
		<author><name>Vetinari</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=SendServerCommand&amp;diff=2638</id>
		<title>SendServerCommand</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=SendServerCommand&amp;diff=2638"/>
		<updated>2007-02-09T20:40:05Z</updated>

		<summary type="html">&lt;p&gt;Vetinari: Vsay-Number moved to right position in vtchat&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOEDITSECTION__&lt;br /&gt;
et.trap_SendServerCommand() is used to send a command from the server to one or more clients. The first argument is the slot number of the client the command will be sent to. If it&#039;s equal to -1, the command will be broadcast to all clients.&lt;br /&gt;
&lt;br /&gt;
The following commands can be issued with this function:&lt;br /&gt;
&lt;br /&gt;
==Printing==&lt;br /&gt;
===Print===&lt;br /&gt;
* &amp;quot;&#039;&#039;&#039;print&#039;&#039;&#039; \&amp;quot;&#039;&#039;Message&#039;&#039;\n\&amp;quot;&amp;quot;&lt;br /&gt;
:&#039;&#039;&#039;print&#039;&#039;&#039; prints &#039;&#039;Message&#039;&#039; to the client&#039;s console.&lt;br /&gt;
&lt;br /&gt;
===Center Print MoO=== &lt;br /&gt;
* &amp;quot;&#039;&#039;&#039;cpm&#039;&#039;&#039; \&amp;quot;&#039;&#039;Message&#039;&#039;\n\&amp;quot;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;&#039;cpm&#039;&#039;&#039; prints &#039;&#039;Message&#039;&#039; to the client&#039;s annoucement area and console.&lt;br /&gt;
&lt;br /&gt;
===Center Print===&lt;br /&gt;
* &amp;quot;&#039;&#039;&#039;cp&#039;&#039;&#039; \&amp;quot;&#039;&#039;Message&#039;&#039;\n\&amp;quot;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;&#039;cp&#039;&#039;&#039; prints &#039;&#039;Message&#039;&#039; to the center of the client&#039;s screen.&lt;br /&gt;
&lt;br /&gt;
===Banner Print===&lt;br /&gt;
* &amp;quot;&#039;&#039;&#039;b&#039;&#039;&#039; &#039;&#039;locations&#039;&#039; \&amp;quot;&#039;&#039;Message&#039;&#039;\n\&amp;quot;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;&#039;b&#039;&#039;&#039; prints &#039;&#039;Message&#039;&#039; to the client&#039;s banner &#039;&#039;locations&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
:the &#039;&#039;locations&#039;&#039; can be a number from 0 to 248&lt;br /&gt;
:For compatibility, the old-style locations (from 0-4) are also supported.&amp;lt;br&amp;gt;&lt;br /&gt;
:8 - player chat area&amp;lt;br&amp;gt;                &lt;br /&gt;
:16 - left popup area (not recommended)&amp;lt;br&amp;gt;&lt;br /&gt;
:32 - centered above the chat area&amp;lt;br&amp;gt;&lt;br /&gt;
:64 - console only&amp;lt;br&amp;gt;&lt;br /&gt;
:128 - banner area (recommended)(top of screen)&lt;br /&gt;
&lt;br /&gt;
===Scores Print===&lt;br /&gt;
* &amp;quot;&#039;&#039;&#039;sc&#039;&#039;&#039; \&amp;quot;&#039;&#039;Message&#039;&#039;\n\&amp;quot;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;&#039;sc&#039;&#039;&#039; prints &#039;&#039;Message&#039;&#039; to the client&#039;s console and writes it to the statsdump file.&lt;br /&gt;
&lt;br /&gt;
==Chatting==&lt;br /&gt;
===Chat===&lt;br /&gt;
* &amp;quot;&#039;&#039;&#039;c&#039;&#039;&#039; &#039;&#039;ClientNum&#039;&#039; \&amp;quot;&#039;&#039;Message&#039;&#039;\&amp;quot;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;&#039;c&#039;&#039;&#039; prints &#039;&#039;Message&#039;&#039; as a global chat message on behalf of the client specified by &#039;&#039;ClientNum&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===Team Chat===&lt;br /&gt;
* &amp;quot;&#039;&#039;&#039;tc&#039;&#039;&#039; &#039;&#039;ClientNum&#039;&#039; \&amp;quot;&#039;&#039;Message&#039;&#039;\&amp;quot; &#039;&#039;X-Location&#039;&#039; &#039;&#039;Y-Location&#039;&#039; &#039;&#039;Z-Location&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;&#039;tc&#039;&#039;&#039; prints &#039;&#039;Message&#039;&#039; as a team chat message on behalf of the client specified by &#039;&#039;ClientNum&#039;&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
:the &#039;&#039;X,Y,Z-Location&#039;s&#039;&#039; are optional parematers that represent the client&#039;s location,&amp;lt;br&amp;gt;&lt;br /&gt;
:if the &#039;&#039;X,Y,Z-Location&#039;s&#039;&#039; are left out then the message will be printed without a location.&lt;br /&gt;
&lt;br /&gt;
===Fireteam Chat===&lt;br /&gt;
* &amp;quot;&#039;&#039;&#039;bc&#039;&#039;&#039; &#039;&#039;ClientNum&#039;&#039; \&amp;quot;&#039;&#039;Message&#039;&#039;\&amp;quot; &#039;&#039;X-Location&#039;&#039; &#039;&#039;Y-Location&#039;&#039; &#039;&#039;Z-Location&#039;&#039;&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;&#039;bc&#039;&#039;&#039; prints &#039;&#039;Message&#039;&#039; as a fireteam chat message on behalf of the client specified by &#039;&#039;ClientNum&#039;&#039;,&amp;lt;br&amp;gt;&lt;br /&gt;
:the &#039;&#039;X,Y,Z-Location&#039;s&#039;&#039; are parematers that represent the client&#039;s location.&lt;br /&gt;
&lt;br /&gt;
==Voice Chat==&lt;br /&gt;
===Global Voice Chat===&lt;br /&gt;
* &amp;quot;&#039;&#039;&#039;vchat&#039;&#039;&#039; &#039;&#039;VoiceOnly&#039;&#039; &#039;&#039;ClientNum&#039;&#039; 50 &#039;&#039;Vsay-String&#039;&#039; &#039;&#039;Vsay-Number&#039;&#039; \&amp;quot;&#039;&#039;Custom-Message&#039;&#039;\&amp;quot;&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;&#039;vchat&#039;&#039;&#039; sends a global voice chat &#039;&#039;Vsay-String&#039;&#039; on behalf of the client specified by &#039;&#039;ClientNum&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;Vsay-Number&#039;&#039; is by default random, however, it can be set by the player by passing parameters to the vsay command (/vsay &amp;lt;&#039;&#039;Vsay-Number&#039;&#039;&amp;gt; &amp;lt;&#039;&#039;Vsay-String&#039;&#039;&amp;gt;),&amp;lt;br&amp;gt; &#039;&#039;Vsay-Number&#039;&#039; represents the vsay number of Vsay as listed in the .voice files.&amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;Custom-Message&#039;&#039; is by default \&amp;quot;\&amp;quot; (empty), otherwise it&#039;s the message that gets printed in the chat area.&lt;br /&gt;
:if &#039;&#039;VoiceOnly&#039;&#039; is 0 it will print a chat message on behalf of &#039;&#039;ClientNum&#039;&#039; contaning the message&amp;lt;br&amp;gt;&lt;br /&gt;
:if &#039;&#039;VoiceOnly&#039;&#039; is 1 it will only do the sound but not the message&lt;br /&gt;
&lt;br /&gt;
===Team Voice Chat===&lt;br /&gt;
* &amp;quot;&#039;&#039;&#039;vtchat&#039;&#039;&#039; &#039;&#039;VoiceOnly&#039;&#039; &#039;&#039;ClientNum&#039;&#039; 50 &#039;&#039;Vsay-String&#039;&#039; &#039;&#039;X-Location&#039;&#039; &#039;&#039;Y-Location&#039;&#039; &#039;&#039;Z-Location&#039;&#039; &#039;&#039;Vsay-Number&#039;&#039; \&amp;quot;&#039;&#039;Custom-Message&#039;&#039;\&amp;quot;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;&#039;vchat&#039;&#039;&#039; sends a team voice chat &#039;&#039;Vsay-String&#039;&#039; a on behalf of client &#039;&#039;ClienNtum&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;Vsay-Number&#039;&#039; is by default random, however, it can be set by the player by passing parameters to the vsay command (/vsay &amp;lt;&#039;&#039;Vsay-Number&#039;&#039;&amp;gt; &amp;lt;&#039;&#039;Vsay-String&#039;&#039;&amp;gt;),&amp;lt;br&amp;gt; &#039;&#039;Vsay-Number&#039;&#039; represents the vsay number of Vsay as listed in the .voice files.&amp;lt;br&amp;gt;&lt;br /&gt;
:the &#039;&#039;X,Y,Z-Location&#039;s&#039;&#039; parematers the represent the clients location.&amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;Custom-Message&#039;&#039; is by default \&amp;quot;\&amp;quot; (empty), otherwise it&#039;s the message that gets printed in the chat area.&lt;br /&gt;
:if &#039;&#039;VoiceOnly&#039;&#039; is 0 it will print a chat message on behalf of &#039;&#039;ClientNum&#039;&#039; contaning the message&amp;lt;br&amp;gt;&lt;br /&gt;
:if &#039;&#039;VoiceOnly&#039;&#039; is 1 it will only do the sound but not the message&lt;br /&gt;
&lt;br /&gt;
===Fireteam Voice Chat===&lt;br /&gt;
* &amp;quot;&#039;&#039;&#039;vtchat&#039;&#039;&#039; &#039;&#039;VoiceOnly&#039;&#039; &#039;&#039;ClientNum&#039;&#039; 50 &#039;&#039;Fireteam-String&#039;&#039; &#039;&#039;X-Location&#039;&#039; &#039;&#039;Y-Location&#039;&#039; &#039;&#039;Z-Location&#039;&#039; &#039;&#039;Vsay-Number&#039;&#039; \&amp;quot;&#039;&#039;Custom-Message&#039;&#039;\&amp;quot;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;&#039;vchat&#039;&#039;&#039; will team voice chat &#039;&#039;Vsay-String&#039;&#039; on behalf of client &#039;&#039;ClienNum&#039;&#039;.&amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;Vsay-Number&#039;&#039; is by default random, however, it can be set by the player by passing parameters to the vsay command (/vsay &amp;lt;&#039;&#039;Vsay-Number&#039;&#039;&amp;gt; &amp;lt;&#039;&#039;Vsay-String&#039;&#039;&amp;gt;),&amp;lt;br&amp;gt; &#039;&#039;Vsay-Number&#039;&#039; represents the vsay number of Vsay as listed in the .voice files.&amp;lt;br&amp;gt;&lt;br /&gt;
:the &#039;&#039;X,Y,Z-Location&#039;s&#039;&#039; parematers the represent the clients location.&amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;Custom-Message&#039;&#039; is by default \&amp;quot;\&amp;quot; (empty), otherwise it&#039;s the message that gets printed in the chat area.&lt;br /&gt;
:if &#039;&#039;VoiceOnly&#039;&#039; is 0 it will print a chat message on behalf of &#039;&#039;ClientNum&#039;&#039; contaning the message&amp;lt;br&amp;gt;&lt;br /&gt;
:if &#039;&#039;VoiceOnly&#039;&#039; is 1 it will only do the sound but not the message&lt;br /&gt;
&lt;br /&gt;
==Fireteam==&lt;br /&gt;
===Application===&lt;br /&gt;
* &amp;quot;&#039;&#039;&#039;application&#039;&#039;&#039; &#039;&#039;Number&#039;&#039;&amp;quot;&lt;br /&gt;
:&#039;&#039;&#039;application&#039;&#039;&#039; shows a fireteam invation message to the client.&amp;lt;br&amp;gt;&lt;br /&gt;
:if &#039;&#039;Number&#039;&#039; &amp;gt; -1 - the &amp;quot;accept ... application to join your fireteam&amp;quot; message shows up. In this case &#039;&#039;Number&#039;&#039; is the ClientNum of the applying client.&amp;lt;br&amp;gt;&lt;br /&gt;
:if &#039;&#039;Number&#039;&#039; == -1 - the &amp;quot;your aplication has been submitted&amp;quot; message shows up.&amp;lt;br&amp;gt;&lt;br /&gt;
:if &#039;&#039;Number&#039;&#039; == -2 - the &amp;quot;your aplication failed&amp;quot; message shows up.&amp;lt;br&amp;gt;&lt;br /&gt;
:if &#039;&#039;Number&#039;&#039; == -3 - the &amp;quot;your aplication has been approved&amp;quot; message shows up.&amp;lt;br&amp;gt;&lt;br /&gt;
:if &#039;&#039;Number&#039;&#039; == -4 - the &amp;quot;your aplication reply has been sent&amp;quot; message shows up.&lt;br /&gt;
&lt;br /&gt;
===Proposition===&lt;br /&gt;
* &amp;quot;&#039;&#039;&#039;proposition&#039;&#039;&#039; &#039;&#039;Number&#039;&#039; &#039;&#039;Number2&#039;&#039;&amp;quot;&lt;br /&gt;
:&#039;&#039;&#039;proposition&#039;&#039;&#039; shows a fireteam proposition message to the client.&amp;lt;br&amp;gt;&lt;br /&gt;
:if &#039;&#039;Number&#039;&#039; &amp;gt; -1 - the &amp;quot;accept ... proposition to invite ... to your fireteam&amp;quot; message shows up. In this case &#039;&#039;Number&#039;&#039; is the ClientNum of the proposed client, and &#039;&#039;Number2&#039;&#039; is the ClientNum of the proposing player.&amp;lt;br&amp;gt;&lt;br /&gt;
:if &#039;&#039;Number&#039;&#039; == -1 - the &amp;quot;your proposition has been submitted&amp;quot; message shows up.&amp;lt;br&amp;gt;&lt;br /&gt;
:if &#039;&#039;Number&#039;&#039; == -2 - the &amp;quot;your proposition was rejected&amp;quot; message shows up.&amp;lt;br&amp;gt;&lt;br /&gt;
:if &#039;&#039;Number&#039;&#039; == -3 - the &amp;quot;your proposition was accepted&amp;quot; message shows up.&amp;lt;br&amp;gt;&lt;br /&gt;
:if &#039;&#039;Number&#039;&#039; == -4 - the &amp;quot;your proposition reply has been sent&amp;quot; message shows up.&amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;Number2&#039;&#039; is an optional paramater only used when &#039;&#039;Number&#039;&#039; &amp;gt; -1.&lt;br /&gt;
&lt;br /&gt;
===Invitation===&lt;br /&gt;
* &amp;quot;&#039;&#039;&#039;invitation&#039;&#039;&#039; &#039;&#039;Number&#039;&#039;&amp;quot;&lt;br /&gt;
:&#039;&#039;&#039;invitation&#039;&#039;&#039; shows the fireteam invation message to the client.&amp;lt;br&amp;gt;&lt;br /&gt;
:if &#039;&#039;Number&#039;&#039; &amp;gt; -1 - the &amp;quot;accept .. invitation to join your fireteam&amp;quot; message shows up. In this case &#039;&#039;Number&#039;&#039; is the ClientNum of the applying client.&amp;lt;br&amp;gt;&lt;br /&gt;
:if &#039;&#039;Number&#039;&#039; == -1 - the &amp;quot;your invitation has been submitted&amp;quot; message shows up.&amp;lt;br&amp;gt;&lt;br /&gt;
:if &#039;&#039;Number&#039;&#039; == -2 - the &amp;quot;your invitation rejected&amp;quot; message shows up.&amp;lt;br&amp;gt;&lt;br /&gt;
:if &#039;&#039;Number&#039;&#039; == -3 - the &amp;quot;your invitation was accepted&amp;quot; message shows up.&amp;lt;br&amp;gt;&lt;br /&gt;
:if &#039;&#039;Number&#039;&#039; == -4 - the &amp;quot;your invitation reply has been sent&amp;quot; message shows up.&lt;br /&gt;
&lt;br /&gt;
==Others== &lt;br /&gt;
===Complaining===&lt;br /&gt;
* &amp;quot;&#039;&#039;&#039;complaint&#039;&#039;&#039; &#039;&#039;Number&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;&#039;complaint&#039;&#039;&#039; shows the complaint vote message to the client.&amp;lt;br&amp;gt;&lt;br /&gt;
:if &#039;&#039;Number&#039;&#039; &amp;gt; 1 - the vote shows up. In this case &#039;&#039;Number&#039;&#039; is the ClientNum of the teamkilling player.&amp;lt;br&amp;gt;&lt;br /&gt;
:if &#039;&#039;Number&#039;&#039; == -1 - the &amp;quot;complaint filed&amp;quot; message shows up.&amp;lt;br&amp;gt;&lt;br /&gt;
:if &#039;&#039;Number&#039;&#039; == -2 - the &amp;quot;complaint dismissed&amp;quot; message shows up.&lt;br /&gt;
&lt;br /&gt;
===Spawning===&lt;br /&gt;
* &amp;quot;&#039;&#039;&#039;setspawnpt&#039;&#039;&#039; &#039;&#039;Number&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;&#039;setspawnpt&#039;&#039;&#039; sets the client game selected spawnpoint to number &#039;&#039;number&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===kicking===&lt;br /&gt;
* &amp;quot;&#039;&#039;&#039;disconnect&#039;&#039;&#039; \&amp;quot;&#039;&#039;reason&#039;&#039;\&amp;quot;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;&#039;disconnect&#039;&#039;&#039; will disconnect the client it has been send with a &amp;quot;Server disconnected&amp;quot; message&amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;reason&#039;&#039; is an optional parameter to show a reason after &amp;quot;Server disconnected&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Configstrings===&lt;br /&gt;
* &amp;quot;&#039;&#039;&#039;cs&#039;&#039;&#039; &#039;&#039;Number&#039;&#039; \&amp;quot;&#039;&#039;String&#039;&#039;\&amp;quot;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
: &#039;&#039;&#039;cs&#039;&#039;&#039; will set the clients configstringnumber &#039;&#039;Number&#039;&#039; to the &#039;&#039;String&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Shaders===&lt;br /&gt;
* &amp;quot;&#039;&#039;&#039;remapShader&#039;&#039;&#039; \&amp;quot;&#039;&#039;OldShader&#039;&#039;\&amp;quot; \&amp;quot;&#039;&#039;NewShader&#039;&#039;\&amp;quot; &#039;&#039;#&#039;&#039;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
: &#039;&#039;&#039;remapShader&#039;&#039;&#039; replaces any texture &#039;&#039;OldShader&#039;&#039; with &#039;&#039;NewShader&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
: &#039;&#039;#&#039;&#039; is the Timeoffset, which currently should be left as &#039;&#039;0&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Category:ETPro]]&lt;br /&gt;
[[Category:ETPro:Mods]]&lt;/div&gt;</summary>
		<author><name>Vetinari</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=User:Vetinari&amp;diff=2624</id>
		<title>User:Vetinari</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=User:Vetinari&amp;diff=2624"/>
		<updated>2007-02-04T16:04:03Z</updated>

		<summary type="html">&lt;p&gt;Vetinari: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Reviving Spree Lua ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;reviving sprees&amp;quot; in the style of etadmin_mod&#039;s killing sprees: [http://ankh-morp.org/~vetinari/projects/rspree/ rspree_mod] &lt;br /&gt;
&lt;br /&gt;
(I know this page is broken with IE, I&#039;m not going to fix it  ;-))&lt;br /&gt;
&lt;br /&gt;
[[Category:ETPro:Mods]]&lt;/div&gt;</summary>
		<author><name>Vetinari</name></author>
	</entry>
	<entry>
		<id>https://wolfwiki.anime.net/index.php?title=User:Vetinari&amp;diff=2623</id>
		<title>User:Vetinari</title>
		<link rel="alternate" type="text/html" href="https://wolfwiki.anime.net/index.php?title=User:Vetinari&amp;diff=2623"/>
		<updated>2007-02-04T10:20:28Z</updated>

		<summary type="html">&lt;p&gt;Vetinari: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Reviving Spree Lua ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;reviving sprees&amp;quot; in the style of etadmin_mod&#039;s killing sprees: [http://ankh-morp.org/~vetinari/projects/rspree/ rspree_mod] &lt;br /&gt;
&lt;br /&gt;
(I know this page is broken with IE, I&#039;m not going to fix it  ;-))&lt;/div&gt;</summary>
		<author><name>Vetinari</name></author>
	</entry>
</feed>